【问题标题】:Android webview, File upload, crashes when setting result in onActivityResultAndroid webview,文件上传,在onActivityResult设置结果时崩溃
【发布时间】:2016-06-01 08:23:58
【问题描述】:

在 Android webview 中,当单击文件上传选项时,会调用 onShowFileChooser,其中会调用用户从图片库中选择要上传的文件的意图。 选择文件后,在 onActivityResult 内部由于以下原因而崩溃

java.lang.IllegalStateException: Duplicate showFileChooser result
        at org.chromium.android_webview.AwWebContentsDelegateAdapter$2.onReceiveValue(AwWebContentsDelegateAdapter.java:225)
        at org.chromium.android_webview.AwWebContentsDelegateAdapter$2.onReceiveValue(AwWebContentsDelegateAdapter.java:220)
        at com.android.webview.chromium.WebViewContentsClientAdapter$4.onReceiveValue(WebViewContentsClientAdapter.java:1063)
        at com.android.webview.chromium.WebViewContentsClientAdapter$4.onReceiveValue(WebViewContentsClientAdapter.java:1047)

【问题讨论】:

    标签: android webview webchromeclient


    【解决方案1】:
    @Override
    public boolean onShowFileChooser(WebView webView, ValueCallback<Uri[]> filePathCallback, FileChooserParams fileChooserParams) {
        mActivity.setValueCallback(filePathCallback);
        Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
        intent.addCategory(Intent.CATEGORY_OPENABLE);
        intent.setType("*/*");
        mActivity.startActivityForResult(Intent.createChooser(intent, ""), Final.REQUEST_CODE_ALBUM);
        return true;
    }
    

    返回真

    【讨论】:

    • "return true" 是为我解决此问题的部分。谢谢。
    【解决方案2】:

    如果您覆盖 onShowFileChooser 并计划调用 filePathCallback 来传递结果,则必须从 onShowFileChooser 返回 true,这会告诉底层代码不要将值传递给 filePathCallback

    事实基本上是在说“我会处理它”

    文档: @return true if filePathCallback will be invoked, false to use default handling.

    【讨论】:

    • 如果我们设置 return false 那么如何管理的任何想法或链接?我收到 System.err: java.lang.IllegalStateException: Duplicate showFileChooser result if set to false.
    • 如果你返回 false 那么你不能调用filePathCallback
    【解决方案3】:

    我认为您需要实现 webview 并扩展 webview chrome 客户端来处理您的 android 手机应用程序上的文件上传。您可以阅读这些article 可能会帮助您了解如何实现 webview 客户端类和 webchrome 客户端

    【讨论】:

      【解决方案4】:

      这可能是由于您将在 uri 中获取数据,然后创建 uri 数组的新对象。在 C# 中,我已完成以下操作来解决问题: 给出重复错误的代码:

        Android.Net.Uri result = data == null || resultCode != Result.Ok ? null :  data.Data ;
      var a = new Android.Net.Uri[] { result };
      

      下面的代码解决了这个问题:

      Android.Net.Uri[] result = data == null || resultCode != Result.Ok ? null : new Android.Net.Uri[] { data.Data };

      【讨论】:

        猜你喜欢
        • 2020-08-27
        • 1970-01-01
        • 1970-01-01
        • 2015-03-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-12-11
        • 2021-08-18
        相关资源
        最近更新 更多