1、首先需要给webview的WebChromeClient设置以下代码,才可以实现h5与Android交互选取图片

private ValueCallback<Uri> mValueCallbackUri;private ValueCallback<Uri[]> mValueCallbackUris;this.setWebChromeClient(new WebChromeClient() {            // For Android < 3.0            public void openFileChooser(ValueCallback<Uri> uploadMsg) {                if (mValueCallbackUri != null) {                    mValueCallbackUri.onReceiveValue(null);                    mValueCallbackUri = null;                }                mValueCallbackUri = uploadMsg;                showOptions();            }            //For Android 3.0 - 4.0            public void openFileChooser(ValueCallback<Uri> uploadMsg, String acceptType) {                if (mValueCallbackUri != null) {                    mValueCallbackUri.onReceiveValue(null);                    mValueCallbackUri = null;                }                mValueCallbackUri = uploadMsg;                showOptions();            }            // For Android > 4.1.1            public void openFileChooser(ValueCallback<Uri> uploadMsg, String acceptType, String capture) {                if (mValueCallbackUri != null) {                    mValueCallbackUri.onReceiveValue(null);                    mValueCallbackUri = null;                }                mValueCallbackUri = uploadMsg;                showOptions();            }            // For Android > 5.0支持多张上传            @Override            public boolean onShowFileChooser(WebView webView,                                             ValueCallback<Uri[]> uploadMsg,                                             FileChooserParams fileChooserParams) {                if (mValueCallbackUris != null) {                    mValueCallbackUris.onReceiveValue(null);                    mValueCallbackUris = null;                }                mValueCallbackUris = uploadMsg;                showOptions();                return true;            }        });

2、点击h5页面设置的,就会调用到Android webview设置的openFileChooser或者onShowFileChooser
3、然后在openFileChooser或者onShowFileChooser中调用打开相册的代码即可
1)方法一:打开相册,并且只支持选择单张图片

Intent intent = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI);// 调用activity.startActivityForResult(intent, TYPE_GALLERY);

或者

   Intent intent = new Intent();   intent.setType("image/*");   intent.setAction(Intent.ACTION_GET_CONTENT);   activity.startActivityForResult(Intent.createChooser(intent, "Select Picture"), TYPE_GALLERY);

2)方法二:打开相册,并且支持选择多张图片Android 5.0+才支持),只需在上述代码基础上增加以下代码即可

intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true);

4、跳转到系统相册,选择完图片之后,会回调回发起intent的那个activity的onActivityResult方法,需要在这里获取对应的Uri

public void onActivityResult(int requestCode, int resultCode, Intent data) {        //跟进请求方式区分        switch (requestCode) {            case TYPE_GALLERY:                if (resultCode == RESULT_OK) {                    if (data != null) {                        Uri uri = data.getData();                        if (uri != null) {                           //没设置Intent.EXTRA_ALLOW_MULTIPLE,会回调这个                            onActivityCallBack(uri);                        } else if (data.getClipData() != null) {                         //设置Intent.EXTRA_ALLOW_MULTIPLE,会回调这个                            ClipData clipData = data.getClipData();                            int count = clipData.getItemCount();                            if(count > 0){                                Uri[] uris = new Uri[count];                                for (int i=0; i<count; i++){                                    Uri imageUri =clipData.getItemAt(i).getUri();                                    uris[i] = imageUri;                                }                                onActivityCallBack(uris);                            }else {                               Toast.makeText(act, "获取数据为空", Toast.LENGTH_LONG).show();                            }                        } else {                             Toast.makeText(act, "获取数据为空", Toast.LENGTH_LONG).show();                        }                    }                } else {                    //没有选择清除缓存                    clearUpload();                }                break;            default:                break;        }    }    /**     * 回调到网页     * @param uri     */    public void onActivityCallBack(Uri uri) {        if (uri == null) {            return;        }        //上传        if (this.getValueCallbackUris() != null) {            Uri[] uris = new Uri[]{uri};            this.getValueCallbackUris().onReceiveValue(uris);            this.setValueCallbackUris(null);        } else if (this.getValueCallbackUri() != null) {            this.getValueCallbackUri().onReceiveValue(uri);            this.setValueCallbackUri(null);        } else {            if (SswlLifecycleCallback.getCurActivity() != null) {                Toast.makeText(SswlLifecycleCallback.getCurActivity(), "无法读取图片", Toast.LENGTH_LONG).show();            }        }    }    /**     * 设置Intent.EXTRA_ALLOW_MULTIPLE,回调到网页     *     * @param uris     */    public void onActivityCallBack(Uri[] uris) {        try {            if (uris == null) {                return;            }            //上传            if (this.getValueCallbackUris() != null) {                this.getValueCallbackUris().onReceiveValue(uris);                this.setValueCallbackUris(null);            } else if (this.getValueCallbackUri() != null) {                this.getValueCallbackUri().onReceiveValue(uris[0]);                this.setValueCallbackUri(null);            } else {                if (SswlLifecycleCallback.getCurActivity() != null) {                    Toast.makeText(SswlLifecycleCallback.getCurActivity(), "无法读取图片", Toast.LENGTH_LONG).show();                }            }        } catch (Throwable e) {            e.printStackTrace();        }    }    /**     * 清除上传缓存     */    private void clearUpload() {        if (this.getValueCallbackUris() != null) {            this.getValueCallbackUris().onReceiveValue(null);            this.setValueCallbackUris(null);        } else if (this.getValueCallbackUri() != null) {            this.getValueCallbackUri().onReceiveValue(null);            this.setValueCallbackUri(null);        }    }

更多相关文章

  1. Gallery 画廊
  2. android 设置布局为无标题样式
  3. 代码中如何设置TextView为不可见
  4. android 设置 源码 修改默认主题为白底黑字
  5. Android(安卓)Permission中英对照
  6. Gallery 画廊
  7. android bitmap 处理
  8. Android中安装,启动和卸载应用
  9. Android(安卓)1.5: 飞行模式分析

随机推荐

  1. 如何做好 Android(安卓)端音视频测试?
  2. Android(安卓)UI设计小知识——富文本
  3. 前沿技术:FaceBook推出的Android图片加载
  4. Android无限循环ViewPager
  5. Android(安卓)用户界面---操作栏(Action B
  6. android装逼技术之暗码小DOME
  7. Android(安卓)自定义控件布局 NullPointe
  8. Android(安卓)Studio 提示与技巧(官方文档
  9. Android中px, dp, sp单位转换
  10. android 顶部Tab实现及原理