java Android webview 输入类型文件

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/28136144/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-11-02 13:03:18  来源:igfitidea点击:

Android webview input type file

javaandroidhtmlhttpwebview

提问by Gururaju Hiddenx

I'm trying to build web project using android, from webview. I have a input field of type file <input type="file" >to let user upload files to server, but it seem not to work on android webview, when I tap on the browse button, nothing happens.

我正在尝试使用 android 从 webview 构建 web 项目。我有一个文件类型的输入字段,<input type="file" >让用户将文件上传到服务器,但它似乎不适用于 android webview,当我点击浏览按钮时,没有任何反应。

Comp.java

编译程序

package com.gururaju.bbmp;

import android.app.Activity;
import android.os.Bundle;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.webkit.WebChromeClient;

public class Comp extends Activity {
    WebView comp;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_comp);

        WebView myWebView = (WebView) findViewById(R.id.comp);
        myWebView.setWebChromeClient(new WebChromeClient());
        myWebView.loadUrl("file:///android_asset/comp.html");

    }
}

activity_comp.xml

activity_comp.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent">

    <WebView
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:id="@+id/comp"
        >

        </WebView>
</LinearLayout>

comp.html(in assets folder)

comp.html(在资产文件夹中)

<!DOCTYPE html>
<html lang="en">
<head>
    <link rel="stylesheet" type="text/css" href="comp.css">
    <meta charset="UTF-8">
    <title></title>
</head>
<body>
    <h2 align="center">Post your Complaints here</h2>
    <form enctype="multipart/form-data" action="" name="complaints" method="POST">
        <input class="title" type="text" name="title" placeholder="Enter the Complaint Title" /><br />

        <div class="spacer-welcome"></div>
        <textarea name="desc" class="desc" placeholder="Your complaint description here..."></textarea><br />
        <div class="spacer-welcome1"></div>

            <input id="center" type="file" name="image" ><br />
        <input class="upload" type="submit" name="submit" value="Submit" >
    </form>
</body>
</html>

Any help would be appreciated.

任何帮助,将不胜感激。

采纳答案by caw

The answer by Riad points into the right direction, but that single callback is not enough to implement.

Riad 的答案指出了正确的方向,但单个回调不足以实现。

There are, in total, four hidden API methods that you have to implement. Their usage depends on the Android version. These methods are:

您总共需要实现四个隐藏的 API 方法。它们的使用取决于 Android 版本。这些方法是:

public void openFileChooser(ValueCallback<Uri> uploadMsg)
public void openFileChooser(ValueCallback<Uri> uploadMsg, String acceptType)
public void openFileChooser(ValueCallback<Uri> uploadMsg, String acceptType, String capture)
public boolean onShowFileChooser(WebView webView, ValueCallback<Uri[]> filePathCallback, WebChromeClient.FileChooserParams fileChooserParams)

You can use the following library which does all these things for you:

您可以使用以下库为您完成所有这些事情:

https://github.com/delight-im/Android-AdvancedWebView

https://github.com/delight-im/Android-AdvancedWebView

Alternatively, you may take a look at the source code to see how it's done:

或者,您可以查看源代码以了解它是如何完成的:

https://github.com/delight-im/Android-AdvancedWebView/blob/master/Source/src/im/delight/android/webview/AdvancedWebView.java

https://github.com/delight-im/Android-AdvancedWebView/blob/master/Source/src/im/delight/android/webview/AdvancedWebView.java

回答by Daniel Nyamasyo

Webview class alone does not support file upload on facebook. You need to use both web chrome client and webview client to handle file upload on your android application as shown below. View more details and a working demo

单独的 Webview 类不支持在 facebook 上上传文件。您需要同时使用 web chrome 客户端和 webview 客户端来处理您的 android 应用程序上的文件上传,如下所示。查看更多详细信息和工作演示

package com.whatsonline.androidphotouploadonfacebook;

import android.app.Activity;
import android.content.ActivityNotFoundException;
import android.content.Intent;
import android.content.res.Configuration;
import android.graphics.Bitmap;
import android.net.Uri;
import android.os.Bundle;
import android.view.ViewGroup;
import android.webkit.ValueCallback;
import android.webkit.WebChromeClient;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.LinearLayout;

/**
 * Created by sada on 6/17/2016.
 */
public class upload extends Activity {

    WebView web;
    private ValueCallback<Uri> mUploadMessage;
    private final static int FILECHOOSER_RESULTCODE=1;
    LinearLayout ln1;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.upload);

        web = new WebView(this);
        web.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.FILL_PARENT));

        ln1=(LinearLayout) findViewById(R.id.ln1);

        WebSettings settings=web.getSettings();
        settings.setJavaScriptEnabled(true);


        web.loadUrl("http://www.facebook.com");
        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/*");
                upload.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("*/*");
                upload.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/*");
                upload.this.startActivityForResult(Intent.createChooser(i, "File Chooser"), upload.FILECHOOSER_RESULTCODE);

            }

          });
        ln1.addView(web);
    }
    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);
        }
    }

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

    @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;

        }
   }
    }

回答by Riad

Try implementing the file Choosermethod like this, as mentioned in the article link provided at the end:

尝试实现这样的file Chooser方法,如最后提供的文章链接中所述:

webView.setWebChromeClient(new WebChromeClient() {

   // openFileChooser for Android 3.0+

    public void openFileChooser(ValueCallback<Uri> uploadMsg, String acceptType){ 

     // Update message
     mUploadMessage = uploadMsg;

     try{  
         // do work....

     }catch(Exception e){

          Toast.makeText(getBaseContext(), "Exception:"+e,
          Toast.LENGTH_LONG).show();
     }
}

View Details Here

在此处查看详细信息