欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

H5调用Android图片上传功能

程序员文章站 2022-05-30 21:44:15
...

最近手上的项目本是全H5的,这短时间部分功能和页面要求换成android原生的,所以一直在改界面,本人基本上属于新手,很多积累的不是很多,所以做项目的时候不免会遇到不懂不会的,这时候就只能依靠网络上的各位大牛了,下面是遇到的问题,也纪念一下第一篇博客。

郑重声明:主体内容摘自网络,以供自己学习用

昨天测试测到一个上传图片的问题,H5界面内调用浏览器可以上传图片,可是在app里面却不能,依靠大牛们的脑袋,借助百度解决了问题。1、首先为什么浏览器可以,app却不行?一般页面在pc打开文件管理器是用 type=”file”的代码,而app使用webview来容纳H5界面的时候,必须设置WebChromeClient可以2、webview的WebChromeClient要怎么用?一般使用webview的时候会对WebViewClient进行设置,但是如果你需要对对话框、网站图标、网站title、加载进度等进行操作是,需要对
WebChromeClient进行设置,具体是这样:

在WebView的设计中,不是什么事都要WebView类干的,有些杂事是分给其他人的,这样WebView专心干好自己的解析、渲染工作就行了。WebViewClient就是帮助WebView处理各种通知、请求事件的,具体来说包括:

onLoadResource
onPageStart
onPageFinish
onReceiveError
onReceivedHttpAuthRequest

WebChromeClient主要辅助WebView处理JavaScript的对话框、网站图标、网站title、加载进度等比如

onCloseWindow(关闭WebView)
onCreateWindow()
onJsAlert (WebView上alert无效,需要定制WebChromeClient处理弹出)
onJsPrompt
onJsConfirm
onProgressChanged
onReceivedIcon
onReceivedTitle
3、具体代码如下:
@Bind(R.id.web_main)
WebView webView;

private OpenFileWebChromeClient mOpenFileWebChromeClient = new OpenFileWebChromeClient(this);

webView.setWebChromeClient(mOpenFileWebChromeClient);

public class OpenFileWebChromeClient extends WebChromeClient {
    public static final int REQUEST_FILE_PICKER = 1;
    public ValueCallback<Uri> mFilePathCallback;
    public ValueCallback<Uri[]> mFilePathCallbacks;
    Activity mContext;
    public OpenFileWebChromeClient(Activity mContext){
        super();
        this.mContext = mContext;
    }
    // Android < 3.0 调用这个方法
    public void openFileChooser(ValueCallback<Uri> filePathCallback) {
        mFilePathCallback = filePathCallback;
        Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
        intent.addCategory(Intent.CATEGORY_OPENABLE);
        intent.setType("*/*");
        mContext.startActivityForResult(Intent.createChooser(intent, "File Chooser"),
                REQUEST_FILE_PICKER);
    }
    // 3.0 + 调用这个方法
    public void openFileChooser(ValueCallback filePathCallback,
                                String acceptType) {
        mFilePathCallback = filePathCallback;
        Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
        intent.addCategory(Intent.CATEGORY_OPENABLE);
        intent.setType("*/*");
        mContext.startActivityForResult(Intent.createChooser(intent, "File Chooser"),
                REQUEST_FILE_PICKER);
    }
    //  / js上传文件的<input type="file" name="fileField" id="fileField" />事件捕获
    // Android > 4.1.1 调用这个方法
    public void openFileChooser(ValueCallback<Uri> filePathCallback,
                                String acceptType, String capture) {
        mFilePathCallback = filePathCallback;
        Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
        intent.addCategory(Intent.CATEGORY_OPENABLE);
        intent.setType("*/*");
        mContext.startActivityForResult(Intent.createChooser(intent, "File Chooser"),
                REQUEST_FILE_PICKER);
    }

    @Override
    public boolean onShowFileChooser(WebView webView, ValueCallback<Uri[]> filePathCallback,
                                     WebChromeClient.FileChooserParams fileChooserParams) {
        mFilePathCallbacks = filePathCallback;
        Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
        intent.addCategory(Intent.CATEGORY_OPENABLE);
        intent.setType("*/*");
        mContext.startActivityForResult(Intent.createChooser(intent, "File Chooser"),
                REQUEST_FILE_PICKER);
        return true;
    }
}

用Intent去调用文件管理器之后会将文件带回,用onActivityResult来接收
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode == OpenFileWebChromeClient.REQUEST_FILE_PICKER) {
        if (mOpenFileWebChromeClient.mFilePathCallback != null) {
            Uri result = data == null || resultCode != Activity.RESULT_OK ? null
                    : data.getData();
            if (result != null) {
                String path = MediaUtility.getPath(getApplicationContext(),
                        result);
                Uri uri = Uri.fromFile(new File(path));
                mOpenFileWebChromeClient.mFilePathCallback
                        .onReceiveValue(uri);
            } else {
                mOpenFileWebChromeClient.mFilePathCallback
                        .onReceiveValue(null);
            }
        }
        if (mOpenFileWebChromeClient.mFilePathCallbacks != null) {
            Uri result = data == null || resultCode != Activity.RESULT_OK ? null
                    : data.getData();
            if (result != null) {
                String path = MediaUtility.getPath(getApplicationContext(),
                        result);
                Uri uri = Uri.fromFile(new File(path));
                mOpenFileWebChromeClient.mFilePathCallbacks
                        .onReceiveValue(new Uri[]{uri});
            } else {
                mOpenFileWebChromeClient.mFilePathCallbacks
                        .onReceiveValue(null);
            }
        }

        mOpenFileWebChromeClient.mFilePathCallback = null;
        mOpenFileWebChromeClient.mFilePathCallbacks = null;
    }
}

这样应该就可以了,


转载声明:文章内容摘自:
                                           

WebViewClient与WebChromeClient的区别   

点击打开链接