0

我有一个本机 android 应用程序来显示一个网站。我是新手。我使用了一个 webview 对象来显示该站点,除了文件上传之外,一切都很完美。我尝试了我在互联网上看到的任何东西,但我找不到解决这个问题的方法。当我点击文件上传时,什么也没有发生。没有错误,没有其他操作......我只是收到一个警告,如“openFileChooser 从未在本地使用”。我阅读了有关此警告的文章,但我真的被卡住了。我正在 Galaxy S3 冰淇淋三明治上测试它。任何帮助将不胜感激。

WebView webView;
private ValueCallback<Uri> mUploadMessage;  
private final static int FILECHOOSER_RESULTCODE=1; 
@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;  

  }  
 }  

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_form_content_view);
    // Show the Up button in the action bar.
    setupActionBar();

    Intent intent = getIntent();
    final String message = intent.getStringExtra(ListOfForms.EXTRA_MESSAGE);
    WebViewClient wvc=new WebViewClient() {
        public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {
             if (errorCode == 401) {             
                 webView.setHttpAuthUsernamePassword("http://project.mysite.com","mydomain","myuser","mypass");
             }
           }

        public void onReceivedHttpAuthRequest(WebView view,
        HttpAuthHandler handler, String host, String realm)        {
      handler.proceed("myuser", "mypass"); 
        }
    };

    WebChromeClient wcc = new WebChromeClient() {


         public void onGeolocationPermissionsShowPrompt(String origin, GeolocationPermissions.Callback callback) {
            callback.invoke(origin, true, false);
         }

         public void openFileChooser(ValueCallback<Uri> uploadMsg) {  

          mUploadMessage = uploadMsg;  
          Intent i = new Intent(Intent.ACTION_GET_CONTENT);  
          i.addCategory(Intent.CATEGORY_OPENABLE);  
          i.setType("image/*");  
          FormContentView.this.startActivityForResult(Intent.createChooser(i,"File Chooser"), FILECHOOSER_RESULTCODE);  

         } 
    };

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

    webView.setWebChromeClient(wcc);

    webView.setWebViewClient(wvc);
    webView.getSettings().setJavaScriptEnabled(true);
    webView.getSettings().setGeolocationEnabled(true);
    webView.getSettings().setJavaScriptCanOpenWindowsAutomatically(true);
    webView.getSettings().setAllowFileAccess(true);
    webView.getSettings().setAllowContentAccess(true);
    webView.getSettings().setAppCacheEnabled(true);
    webView.getSettings().setDatabaseEnabled(true);
    webView.getSettings().setDomStorageEnabled(true);
    webView.loadUrl("http://project.mysite.com");

    String myVariable = "dummy";
    webView.loadUrl("javascript:document.getElementById('txtMyVariable').text = '"+myVariable+"';");

}

private void setupActionBar() {

    getActionBar().setDisplayHomeAsUpEnabled(true);

}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.form_content_view, menu);
    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
    case android.R.id.home:

        NavUtils.navigateUpFromSameTask(this);
        return true;
    }
    return super.onOptionsItemSelected(item);
}
4

2 回答 2

0

我找到了解决方案,我为不同的 android 版本创建了不同的 openFileChooser 函数。我的版本是 4.1.2,我声明了我的处理函数,如:

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

如果我以这种方式声明文件上传调用会命中该函数。所以我在开始的帖子中写的示例代码不适用于 Android 4.1.2。

于 2013-04-09T14:44:47.043 回答
0

添加多个 openFileChooser、showFileChooser 和 onShowFileChooser 方法适用于大多数 Android 版本,但对于具有破坏文件输入的 WebView 错误的 Android 4.4 KitKat(占当前 Android 设备的 29%)则失败。

我使它适用于每个Android版本的解决方法是使用Javascript在应用程序和网站之间进行通信,并检测用户何时想要上传文件,并从应用程序(在webview之外)上传它,然后更新webview当文件完成加载时,告诉网站文件在服务器中的位置。

请在此处查看我的答案,我将在此处解释我的解决方案:https ://stackoverflow.com/a/43443981/2566593

于 2017-04-17T01:51:47.567 回答