android - 我无法使用 android web view 将我的图片上传到网站

标签 android file webview upload

我正在使用 android webview 应用程序访问网站。在提交部分有一个名为上传图片的按钮(它只对用户显示)。 当我尝试从 google chrome 或我的 PC 上传图片时没有问题,但是当我尝试从 webView 应用程序上传图片时,当我点击上传按钮时没有任何反应。我知道我需要获得许可,而且我已经获得了所需的一切。这是我的代码,但我不知道我错过了什么地方?我会感谢你们的帮助。

public class SubmitProperty extends AppCompatActivity {
private ValueCallback<Uri> mUploadMessage;
private final static int FILECHOOSER_RESULTCODE=1;
protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_submit);
    WebView webView = (WebView) findViewById(R.id.webView);
    webView.setWebViewClient(new myWebClient());
    webView.getSettings().setJavaScriptEnabled(true);
    webView.getSettings().setLoadWithOverviewMode(true);
    webView.setWebChromeClient(new WebChromeClient() {
        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/*");
            SubmitProperty.this.startActivityForResult(Intent.createChooser(i, "File Chooser"),FILECHOOSER_RESULTCODE);
        }
    });
    webView.getSettings().setDisplayZoomControls(true);
    webView.getSettings().setJavaScriptCanOpenWindowsAutomatically(false);
    webView.getSettings().setAllowFileAccess(true);
    webView.getSettings().setJavaScriptCanOpenWindowsAutomatically(true);
    webView.loadUrl("http://asemanhome.com/submit-property/");
}
public class myWebClient extends WebViewClient
{
    @Override

    public void onPageStarted(WebView view, String url, Bitmap favicon) {
        super.onPageStarted(view, url, favicon);
    }
    @Override
    public boolean shouldOverrideUrlLoading(WebView view, String url) {
        view.loadUrl(url);
        return true;
    }
    @Override
    public void onPageFinished(WebView view, String url) {
        super.onPageFinished(view, url);
    }
}
@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;
    }
}

} 对此的权限:

<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.MANAGE_DOCUMENTS" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-feature android:name="android.hardware.camera"/>
<uses-permission android:name="android.permission.CAMERA"/>
<uses-permission android:name="android.permission.WAKE_LOCK" />

请注意,我使用的是 API 25 和最小版本 16。

最佳答案

几天前我遇到了同样的问题,这对我有用

添加全局变量

private ValueCallback<Uri> mUploadMessage;
private final static int FILECHOOSER_RESULTCODE=1;
public ValueCallback<Uri[]> uploadMessage;

将此代码添加到onCreate

webView.setWebChromeClient(new WebChromeClient(){

        @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
        public boolean onShowFileChooser(WebView mWebView, ValueCallback<Uri[]> filePathCallback, WebChromeClient.FileChooserParams fileChooserParams)
        {
            if (uploadMessage != null) {
                uploadMessage.onReceiveValue(null);
                uploadMessage = null;
            }

            uploadMessage = filePathCallback;

            Intent intent = fileChooserParams.createIntent();
            try
            {
                startActivityForResult(intent, 100);
            } catch (ActivityNotFoundException e)
            {
                uploadMessage = null;
                Toast.makeText(getApplicationContext(), "Cannot Open File Chooser", Toast.LENGTH_LONG).show();
                return false;
            }
            return true;
        }

覆盖onActivityResult

@Override
protected void onActivityResult(int requestCode, int resultCode,
                                Intent intent) {

    if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP)
    {
        if (requestCode == 100)
        {
            if (uploadMessage == null)
                return;
            uploadMessage.onReceiveValue(WebChromeClient.FileChooserParams.parseResult(resultCode, intent));
            uploadMessage = null;
        }
    }
    else if (requestCode == FILECHOOSER_RESULTCODE)
    {
        if (null == mUploadMessage)
            return;

        Uri result = intent == null || resultCode != MainActivity.RESULT_OK ? null : intent.getData();
        mUploadMessage.onReceiveValue(result);
        mUploadMessage = null;
    }
    else
        Toast.makeText(getApplicationContext(), "Failed to Upload Image", Toast.LENGTH_LONG).show();
}

注意:这适用于 android 5.0 +

关于android - 我无法使用 android web view 将我的图片上传到网站,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43918726/

相关文章:

linux - 为什么linux版本的系统二进制文件与系统发布版本不一致?

image - 我可以将图像作为文件而不是数据存储在 Firebase 上吗 :url?

swift - 如何将字符串中的内容加载到 webView 中?

iphone - 如何从 iPhone 中的 UIWebView 获取触摸位置经纬度值?

android - 无法查看 RecyclerView 中的条目

android - 将数据传递到广播接收器以获取 SMS 传送报告

java - 如何使用句柄在 android 中缩放 View ?

linux - 如何在 Linux 汇编中创建文件

java - 停止并重新启动已运行的线程

Android Webview 的 ClearCache 很慢