使用WebChromeClient无法在WebView Android 4.4.2中打开文件选择器 [英] can't open file chooser in WebView Android 4.4.2 using WebChromeClient

查看:136
本文介绍了使用WebChromeClient无法在WebView Android 4.4.2中打开文件选择器的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在我的Web视图中,单击选择文件" 按钮.在三星7英寸平板电脑中,我想打开文件浏览器,但是我无法在 Android版本4.4中打开此文件浏览器.2 . 你能帮我吗? 这是我的代码.

In my webview by clicking "Choose File" button In samsung 7 inch tablet I want to open a File Browser, but I can't open this in Android Version 4.4.2. So can u plz help me for this? Here is my Code.

WebViewDemo.java

package com.example.webviewdemo;

import java.io.File;
import android.app.Activity;
import android.app.ProgressDialog;
import android.content.Intent;
import android.content.res.Configuration;
import android.graphics.Bitmap;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.os.Parcelable;
import android.provider.MediaStore;
import android.webkit.ConsoleMessage;
import android.webkit.ValueCallback;
import android.webkit.WebChromeClient;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.webkit.WebSettings.PluginState;
import android.widget.ProgressBar;
import android.widget.Toast;

public class WebViewDemo extends Activity {
    /** Called when the activity is first created. */

    WebView web;

    private ValueCallback<Uri> mUploadMessage;
    private final static int FILECHOOSER_RESULTCODE=1;

    @Override
    protected void onActivityResult(int requestCode, int resultCode,
                                    Intent intent) {
        if(requestCode==FILECHOOSER_RESULTCODE)
        {
            if (null == mUploadMessage) return;
            Uri result = intent == null || resultCode != RESULT_OK ? null
                    : intent.getData();
            mUploadMessage.onReceiveValue(result);
            mUploadMessage = null;
        }
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.show_web_view);

        web = (WebView) findViewById(R.id.webView1);

        web = new WebView(this);
        web.getSettings().setJavaScriptEnabled(true);
        web.loadUrl("file:///android_asset/select.html");
        web.setWebViewClient(new myWebClient());
        web.setWebChromeClient(new WebChromeClient()
        {
            //The undocumented magic method override
            //Eclipse will swear at you if you try to put @Override here
            // For Android 3.0+
            public void openFileChooser(ValueCallback<Uri> uploadMsg) {

                mUploadMessage = uploadMsg;
                Intent i = new Intent(Intent.ACTION_GET_CONTENT);
                i.addCategory(Intent.CATEGORY_OPENABLE);
                i.setType("image/*");
                WebViewDemo.this.startActivityForResult(Intent.createChooser(i,"File Chooser"), FILECHOOSER_RESULTCODE);

            }

            // For Android 3.0+
            public void openFileChooser( ValueCallback uploadMsg, String acceptType ) {
                mUploadMessage = uploadMsg;
                Intent i = new Intent(Intent.ACTION_GET_CONTENT);
                i.addCategory(Intent.CATEGORY_OPENABLE);
                i.setType("*/*");
                WebViewDemo.this.startActivityForResult(
                        Intent.createChooser(i, "File Browser"),
                        FILECHOOSER_RESULTCODE);
            }

            //For Android 4.1
            public void openFileChooser(ValueCallback<Uri> uploadMsg, String acceptType, String capture){
                mUploadMessage = uploadMsg;
                Intent i = new Intent(Intent.ACTION_GET_CONTENT);
                i.addCategory(Intent.CATEGORY_OPENABLE);
                i.setType("image/*");
                WebViewDemo.this.startActivityForResult( Intent.createChooser( i, "File Chooser" ), WebViewDemo.FILECHOOSER_RESULTCODE );

            }

        });


        setContentView(web);


    }

    public class myWebClient extends WebViewClient
    {
        @Override
        public void onPageStarted(WebView view, String url, Bitmap favicon) {
            // TODO Auto-generated method stub
            super.onPageStarted(view, url, favicon);
        }

        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String url) {
            // TODO Auto-generated method stub

            view.loadUrl(url);
            return true;

        }

        @Override
        public void onPageFinished(WebView view, String url) {
            // TODO Auto-generated method stub
            super.onPageFinished(view, url);

        }
    }

    //flipscreen not loading again
    @Override
    public void onConfigurationChanged(Configuration newConfig){
        super.onConfigurationChanged(newConfig);
    }

// To handle "Back" key press event for WebView to go back to previous screen.
/*@Override
public boolean onKeyDown(int keyCode, KeyEvent event)
{
    if ((keyCode == KeyEvent.KEYCODE_BACK) && web.canGoBack()) {
        web.goBack();
        return true;
    }
    return super.onKeyDown(keyCode, event);
}*/
}

内部资产/select.html

<!DOCTYPE html>
<html>
<head>

</head>
<body>

<div data-role="page" id="pageone">
  <div data-role="header">
  <h1>PRODUCT DETAIL</h1>
  </div>

<div data-role="content">
<form method="get" action="">

   <div data-role="fieldcontain">
    <label for="name">Open File Chosser And Select File From Camera :</label>
    <input type="file" name="text" id="name" type="image/*" >
    </div>
  <div data-role="fieldcontain">
    <label for="name">Email:</label>
    <input type="text" name="text" id="name" value="" placeholder="What's Your Name?">
    </div>

    <div data-role="fieldcontain">
    <label for="search">Looking for anything?</label>
    <input type="search" name="search" id="search" value="" placeholder="Search for content"/>
  </div>

  <div data-role="fieldcontain">
    <label for="colors"><a href="http://www.androidexample.com/media/webview/webview_browser.html">Open link in webview browser.</a></label>
    <br>
    <br>
    <label for="colors"><a href="http://www.google.com/">Open link in new browser.</a></label>

 </div>

   </div>

</form>
</div>
</div>

</body>
</html>

推荐答案

此处的问题是,在Android 4.4中未实现文件输入,它将永远无法通过标准WebView界面工作. 我在项目中所做的就是使用CrossWalk项目使其正常工作. 将默认的WebView从标准的Android更改为CrossWalk需要大量的工作,但是它确实很好地满足了我的需求.

The problem here is that in Android 4.4 the file input is not implemented and it will never work through the standard WebView interface. What I did in my project has been to use CrossWalk project to make it work fine. It has required quite a bit of work to change the default WebView from the standard Android one to CrossWalk, however it really served my needs quite well.

基本上,您需要用CrossWalk webView替换普通的Android WebView.这对我们没有什么好处,包括即使在Android 4.0、4.1等操作系统上Chrome也会进行更新,为我们提供了更好的支持和更少的错误.

Basically you need to replace the normal Android WebView with the CrossWalk webView. This had few advantages for us, including the fact that Chrome will be updated even on Android 4.0, 4.1 etc, giving us a much better support and fewer bugs.

我在这里记录了如何实现它:

I documented how I implemented it here: http://blog.maurizionapoleoni.com/blog/implementing-a-file-input-with-camera-support-in-android-with-crosswalk/

这篇关于使用WebChromeClient无法在WebView Android 4.4.2中打开文件选择器的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆