Android 在WebView中浏览已停止工作的文件

Android 在WebView中浏览已停止工作的文件,android,file-upload,webview,webviewclient,Android,File Upload,Webview,Webviewclient,我正在尝试制作一个android应用程序来访问我创建的一个简单的Sinatra网站。该网站允许用户上传照片。仅使用WebView,以下方式允许我浏览手机中的文件 public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState);

我正在尝试制作一个android应用程序来访问我创建的一个简单的Sinatra网站。该网站允许用户上传照片。仅使用WebView,以下方式允许我浏览手机中的文件

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        WebView myWebView = (WebView) findViewById(R.id.webview);
        myWebView.loadUrl("http://10.0.2.2:4567");
    }

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

}
当我试图让应用程序变得更好时,我发现这段代码让应用程序看起来(据说工作起来)更好

现在的问题是,当我点击网页上的浏览按钮时,浏览菜单不会出现在我的屏幕上。实际上什么都没有发生。我猜NewWebViewClient造成了这个问题,但这怎么可能呢?是否有办法再次启用文件浏览?当我读到在早期的android版本中它是必要的时,我必须手动添加它吗

我的目标是API 18,但API 17也出现了同样的问题

---------------------------------编辑-------------------------------

还是有同样的问题。openFileChooser为较旧的API提供了解决方案,但不适用于API 18

    myWebView.setWebChromeClient(new WebChromeClient() 

  {   
        public void openFileChooser(ValueCallback<Uri> uploadMsg) {  

  mUploadMessage = uploadMsg;  
  Intent i = new Intent(Intent.ACTION_GET_CONTENT);  
  i.addCategory(Intent.CATEGORY_OPENABLE);  
  i.setType("image/*");  
  Intent chooserIntent = Intent.createChooser(i,"Image Chooser");

  MainActivity16.this.startActivityForResult(chooserIntent, FILECHOOSER_RESULTCODE);  

         }  
  });  

  setContentView(myWebView);  
 }
myWebView.setWebChromeClient(新的WebChromeClient())
{   
public void openFileChooser(ValueCallback uploadMsg){
mUploadMessage=上传消息;
意向i=新意向(意向.行动\u获取\u内容);
i、 addCategory(意图。类别可打开);
i、 setType(“image/*”);
Intent chooserint=Intent.createChooser(i,“图像选择器”);
MainActivity16.this.startActivityForResult(选择内容、文件选择器\u结果代码);
}  
});  
setContentView(myWebView);
}

毕竟这与API有关。 Vortex在上述链接中给出了解决方案。 在我的例子中,这是最后的代码

    public class MainActivity extends Activity {

        WebView myWebView ;
        private ValueCallback<Uri> mUploadMessage;
        private final static int FILECHOOSER_RESULTCODE = 1;

        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);

            myWebView = new WebView(this);
            myWebView.setWebViewClient(new WebViewClient());
            myWebView.setWebChromeClient(new WebChromeClient() {
                //The undocumented magic method override  
                //Eclipse will swear at you if you try to put @Override here  
                public void openFileChooser(ValueCallback<Uri> uploadMsg) {
                    MainActivity.this.showAttachmentDialog(uploadMsg);
                }

                // For Android > 3.x
                public void openFileChooser(ValueCallback<Uri> uploadMsg, String acceptType) {
                    MainActivity.this.showAttachmentDialog(uploadMsg);
                }

                // For Android > 4.1
                public void openFileChooser(ValueCallback<Uri> uploadMsg, String acceptType, String capture) {
                    MainActivity.this.showAttachmentDialog(uploadMsg);
                }
            });

            this.setContentView(myWebView);

            myWebView.loadUrl("http://10.0.2.2:4567");

        }

        private void showAttachmentDialog(ValueCallback<Uri> uploadMsg) {
            this.mUploadMessage = uploadMsg;

            Intent i = new Intent(Intent.ACTION_GET_CONTENT);
            i.addCategory(Intent.CATEGORY_OPENABLE);
            i.setType("*/*");

            this.startActivityForResult(Intent.createChooser(i, "Choose type of attachment"), FILECHOOSER_RESULTCODE);
        }

        @Override
        protected void onActivityResult(int requestCode, int resultCode, Intent intent) {
            if (requestCode == FILECHOOSER_RESULTCODE) {
                if (null == this.mUploadMessage) {
                    return;
                }
                Uri result = intent == null || resultCode != RESULT_OK ? null : intent.getData();
                this.mUploadMessage.onReceiveValue(result);
                this.mUploadMessage = null;
            }
        }

        @Override 
        public boolean onKeyDown(int keyCode, KeyEvent event)
        {
            if ((keyCode == KeyEvent.KEYCODE_BACK) && myWebView.canGoBack())
            {
                myWebView.goBack();
                return true;
            }
            return super.onKeyDown(keyCode, event);
        }

        @Override
        public boolean onCreateOptionsMenu(Menu menu) {
            // Inflate the menu; this adds items to the action bar if it is present.
            getMenuInflater().inflate(R.menu.main, menu);
            return true;
        }
}
公共类MainActivity扩展活动{
网络视图我的网络视图;
private ValueCallback mUploadMessage;
private final static int FILECHOOSER_RESULTCODE=1;
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
myWebView=新的WebView(此);
setWebViewClient(新的WebViewClient());
myWebView.setWebChromeClient(新WebChromeClient(){
//未记录的magic方法重写
//如果您试图在此处放置@Override,Eclipse将对您发牢骚
public void openFileChooser(ValueCallback uploadMsg){
MainActivity.this.showAttachmentDialog(uploadMsg);
}
//对于Android>3.x
public void openFileChooser(ValueCallback uploadMsg,String acceptType){
MainActivity.this.showAttachmentDialog(uploadMsg);
}
//对于Android>4.1
public void openFileChooser(ValueCallback uploadMsg、字符串接受类型、字符串捕获){
MainActivity.this.showAttachmentDialog(uploadMsg);
}
});
这个.setContentView(myWebView);
myWebView.loadUrl(“http://10.0.2.2:4567");
}
私有void showAttachmentDialog(ValueCallback uploadMsg){
this.mUploadMessage=uploadMsg;
意向i=新意向(意向.行动\u获取\u内容);
i、 addCategory(意图。类别可打开);
i、 集合类型(“*/*”);
this.startActivityForResult(Intent.createChooser(i,“选择附件类型”)、FILECHOOSER\u RESULTCODE);
}
@凌驾
ActivityResult上受保护的void(int-requestCode、int-resultCode、Intent-Intent){
if(requestCode==FILECHOOSER\u RESULTCODE){
if(null==this.mUploadMessage){
回来
}
Uri result=intent==null | | resultCode!=result_OK?null:intent.getData();
此.mUploadMessage.onReceiveValue(结果);
this.mUploadMessage=null;
}
}
@凌驾
公共布尔onKeyDown(int-keyCode,KeyEvent事件)
{
if((keyCode==KeyEvent.keyCode_BACK)&&myWebView.canGoBack())
{
myWebView.goBack();
返回true;
}
返回super.onKeyDown(keyCode,event);
}
@凌驾
公共布尔onCreateOptions菜单(菜单){
//为菜单充气;这会将项目添加到操作栏(如果存在)。
getMenuInflater().充气(R.menu.main,menu);
返回true;
}
}

不幸的是,目前还没有解决方案,因为openFileChooser不可用

我在stackoverflow中搜索过,所有解决方案都建议使用openFileChooser,但此解决方案似乎只适用于较旧的API。API 18似乎只适用于WebView,但WebView缺少以下几个功能应该在URL上方。周围一定有路。阅读超薄表格会有问题吗?
    public class MainActivity extends Activity {

        WebView myWebView ;
        private ValueCallback<Uri> mUploadMessage;
        private final static int FILECHOOSER_RESULTCODE = 1;

        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);

            myWebView = new WebView(this);
            myWebView.setWebViewClient(new WebViewClient());
            myWebView.setWebChromeClient(new WebChromeClient() {
                //The undocumented magic method override  
                //Eclipse will swear at you if you try to put @Override here  
                public void openFileChooser(ValueCallback<Uri> uploadMsg) {
                    MainActivity.this.showAttachmentDialog(uploadMsg);
                }

                // For Android > 3.x
                public void openFileChooser(ValueCallback<Uri> uploadMsg, String acceptType) {
                    MainActivity.this.showAttachmentDialog(uploadMsg);
                }

                // For Android > 4.1
                public void openFileChooser(ValueCallback<Uri> uploadMsg, String acceptType, String capture) {
                    MainActivity.this.showAttachmentDialog(uploadMsg);
                }
            });

            this.setContentView(myWebView);

            myWebView.loadUrl("http://10.0.2.2:4567");

        }

        private void showAttachmentDialog(ValueCallback<Uri> uploadMsg) {
            this.mUploadMessage = uploadMsg;

            Intent i = new Intent(Intent.ACTION_GET_CONTENT);
            i.addCategory(Intent.CATEGORY_OPENABLE);
            i.setType("*/*");

            this.startActivityForResult(Intent.createChooser(i, "Choose type of attachment"), FILECHOOSER_RESULTCODE);
        }

        @Override
        protected void onActivityResult(int requestCode, int resultCode, Intent intent) {
            if (requestCode == FILECHOOSER_RESULTCODE) {
                if (null == this.mUploadMessage) {
                    return;
                }
                Uri result = intent == null || resultCode != RESULT_OK ? null : intent.getData();
                this.mUploadMessage.onReceiveValue(result);
                this.mUploadMessage = null;
            }
        }

        @Override 
        public boolean onKeyDown(int keyCode, KeyEvent event)
        {
            if ((keyCode == KeyEvent.KEYCODE_BACK) && myWebView.canGoBack())
            {
                myWebView.goBack();
                return true;
            }
            return super.onKeyDown(keyCode, event);
        }

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