如何在WebView中上传多个图像?

时间:2014-08-11 20:37:54

标签: android file-upload webview

如何在我的应用程序的WebView中上传文件的行为与浏览器应用程序类似?

我正在尝试在我的Android应用程序中创建一个WebView,允许上传使用相机拍摄的多张图像。

当我在浏览器应用程序中打开下面的HTML代码时,我可以附加多张图片。 当我在我的应用程序中的WebView中使用相同的代码时,该按钮甚至不会打开对话框。

<form method="post" action="/save/images" name="send" id="send" enctype="multipart/form-data">
   <input type="file" name="data[]" id="camera" multiple="">
   <input type="submit" name="send">
</form>

以下是上述HTML的链接,如果您想尝试一下:http://codereaper.com/bugspray/so/25251993/html-sendimages/

这里的重点是Android应用程序本身有没有与此有关,加载的URL包含一个在Android的浏览器应用程序中运行的网页,您可以使用相机上传一堆图像

我尝试的当前状态包括为应用授予权限:

<uses-feature android:name="android.hardware.camera" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.FLASHLIGHT"/>

在创建WebView时允许JavaScript和FileAcess:

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_report);

    WebView webView = (WebView) findViewById(R.id.report_webview);

    WebSettings settings = webView.getSettings();
    settings.setJavaScriptEnabled(true);
    webView.setWebChromeClient(new WebChromeClient());
    webView.getSettings().setAllowFileAccess(true);

    showProgressDialog(R.string.please_wait_title, R.string.please_wait_description);

    webView.setWebViewClient(new WebViewClient() {
        @Override
        public void onPageFinished(WebView view, String url) {
            super.onPageFinished(view, url);
            closeProgressDialog();
        }
    }
    );

    webView.loadUrl("http://codereaper.com/bugspray/so/25251993/html-sendimages/");
}

在我的搜索中,我发现很多引用使用未记录的功能'openFileChooser':

   new WebChromeClient() {
        public void openFileChooser(ValueCallback<Uri> uploadMsg) {
            mUploadMessage = uploadMsg;
            Intent i = new Intent(Intent.ACTION_GET_CONTENT);
            i.addCategory(Intent.CATEGORY_OPENABLE);
            i.setType("image/*");
            Cv5appActivity.this.startActivityForResult(
                    Intent.createChooser(i, "Image Browser"),
                    FILECHOOSER_RESULTCODE);
        }
    }

我只支持较新的Android版本(4.3及更高版本),并且希望以支持和记录的方式执行此操作,但如果不存在其他方法,则将使用此方法。但是,我没有看到'openFileChooser'方法将如何:

  • 允许拍摄/上传多张图片
  • 将拍摄的图像传回网页上的表单/ ajax / html

任何建议都会受到赞赏,以使WebView像Android上的浏览器应用程序一样,或者使WebChromeClient能够处理多个图像并“将它们交还给WebView”。

干杯

2 个答案:

答案 0 :(得分:2)

我确实使用SO上的其他答案解决了我所有的问题,这些问题涉及'openFileChooser'方法。我需要发现/理解的关键信息是ValueCallback<Uri>,这既是处理所选图像的方式,也是处理多个图像的责任到WebView。

在实现'openFileChooser'方法时,您将获得ValueCallback<Uri>,然后您负责调用其回调以回传所选图像或null,如:

mUploadMessage.onReceiveValue(null);

另请注意,如果您不调用回调,则WebView将停止正常工作。

<强>更新

最近这个问题又出现了,所以现在我正在使用https://github.com/delight-im/Android-AdvancedWebView的分支 - 到目前为止它工作得非常漂亮我没有必要对它进行编码。

答案 1 :(得分:1)

将此行添加到intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true);

uploadMessages

此代码用于解析结果(请注意ValueCallback<Uri[]>public void onActivityResult(int requestCode, int resultCode, Intent intent) { super.onActivityResult(requestCode, resultCode, intent); Uri[] results = null; try { if (resultCode == RESULT_OK) { String dataString = intent.getDataString(); ClipData clipData = intent.getClipData(); if (clipData != null) { results = new Uri[clipData.getItemCount()]; for (int i = 0; i < clipData.getItemCount(); i++) { ClipData.Item item = clipData.getItemAt(i); results[i] = item.getUri(); } } if (dataString != null) { results = new Uri[]{Uri.parse(dataString)}; } } } catch (Exception e) { e.printStackTrace(); } uploadMessages.onReceiveValue(results); uploadMessages = null; } ):

POST

另请参阅this post ...