我一直在努力从WebView上传文件。我在谷歌上搜索并实施了所有建议的解决方案(例如这篇SO帖子),但没有一个可行。

我有一个HTML页面与以下代码上传文件。

<form method="POST" enctype="multipart/form-data">
  File to upload: <input type="file" name="uploadfile">&nbsp;&nbsp;
  <input type="submit" value="Press to Upload..."> to upload the file!
</form>

它在桌面浏览器如Firefox和内置浏览器中运行良好 的模拟器/ AVD,即,当我点击“浏览…”按钮渲染 元素,浏览器打开一个对话框 框,在那里我可以选择一个文件上传。

然而,在android 3.0模拟器/ AVD中,当我点击“选择” 文件”,什么都没有发生,没有文件对话框被打开!


当前回答

我是android的新手,在这方面也很吃力。根据谷歌参考指南WebView。

默认情况下,WebView不提供类似浏览器的小部件 启用JavaScript和网页错误被忽略。如果你的目标是 只是显示一些HTML作为你的UI的一部分,这可能是好的; 除了阅读,用户不需要与网页进行交互, 网页也不需要与用户交互。如果你真的 想要一个成熟的web浏览器,那么您可能需要调用 浏览器应用程序的URL意图,而不是显示它与 WebView。

我在mainactivity .java中执行的示例代码。

 Uri uri = Uri.parse("https://www.example.com");
 Intent intent = new Intent(Intent.ACTION_VIEW, uri);
 startActivity(intent);

Excuted

package example.com.myapp;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.content.Intent;
import android.net.Uri;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Uri uri = Uri.parse("http://www.example.com/");
        Intent intent = new Intent(Intent.ACTION_VIEW, uri);
        startActivity(intent);
        getSupportActionBar().hide();
    }}

其他回答

我发现有必要在Android 4.1中定义公共void openFileChooser(ValueCallback<Uri> uploadMsg, String acceptType, String capture)。然后我采用了米歇尔·奥利弗的解决方案。

这个解决方案也适用于蜂窝和冰淇淋三明治。似乎谷歌引入了一个很酷的新特性(accept属性),并且忘记实现向后兼容性的重载。

protected class CustomWebChromeClient extends WebChromeClient
{
    // For Android 3.0+
    public void openFileChooser( ValueCallback<Uri> uploadMsg, String acceptType ) 
    {  
        context.mUploadMessage = uploadMsg;  
        Intent i = new Intent(Intent.ACTION_GET_CONTENT);  
        i.addCategory(Intent.CATEGORY_OPENABLE);  
        i.setType("image/*");  
        context.startActivityForResult( Intent.createChooser( i, "File Chooser" ), MainActivity.FILECHOOSER_RESULTCODE );  
    }

    // For Android < 3.0
    public void openFileChooser( ValueCallback<Uri> uploadMsg ) 
    {
        openFileChooser( uploadMsg, "" );
    }
}

在奇巧,你可以使用存储访问框架。

存储访问框架/编写客户端应用程序

谷歌自己的浏览器为这个问题提供了一个全面的解决方案,它保证了自己的类:

openFileChooser在Android 4.0.4中的实现

android4.0.4中的UploadHandler类

你访问过这个链接吗? http://groups.google.com/group/android-developers/browse_thread/thread/dcaf8b2fdd8a90c4/62d5e2ffef31ebdb

http://moazzam-khan.com/blog/?tag=android-upload-file

http://evgenyg.wordpress.com/2010/05/01/uploading-files-multipart-post-apache/

通过javalib Apache Commons上传文件的简明示例

我想你会从中得到帮助的