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. android网络图片的下载
  2. Android声音播放实例代码
  3. 2013.12.23 (2)——— android 代码调用shell
  4. Android判断横屏竖屏代码
  5. 代码中如何设置TextView为不可见
  6. android 开启本地相册选择图片并返回显示
  7. android截屏代码:C++实现
  8. Android 异步任务加载图片代码

随机推荐

  1. SQL 经典语句
  2. MSSQL经典语句
  3. SQL Server 2000的安全配置
  4. SQL SERVER数据库开发之存储过程应用
  5. ASP数据库编程SQL常用技巧
  6. SQL Server SA权限总结经典技术
  7. SQL Server各种日期计算方法(收藏)
  8. 全文检索技术 sql server
  9. 整理一下SQLSERVER的排序规则
  10. 如何在SQLSERVER中快速有条件删除海量数