我也是從網上扒下來的,經過多次實驗,找到了個好用的。網上能搜到最多的也就是這個解決方案,我英文不好,也沒仔細研究,但大多數都是出自這:
。
我終於google到了個好用的方案:http://www.cnblogs.com/sipher/archive/2012/09/05/2672361.html
。
android 為了安全考慮把webview 中的上傳文件給默認去除了。不過可以自己通過實現接口,自己完成這個功能。
首先用webview的setWebChromeClient(WebChromeClient wcc)方法,通過這個方法也能讓瀏覽器支持js的alert方法。
WebChromeClient 類要自己實現,可以用匿名類,也可以用普通類,咱們就用內部類吧,簡單,而且小軟件也無所謂了,根本不用考慮后期。
private class MyWebChromeClient extends WebChromeClient { //這個重新的方法是為了讓js支持alert。不需要的可以去掉 @Override public boolean onJsAlert(WebView view, String url, String message, JsResult result) { return super.onJsAlert(view, url, message, result); } // For Android > 4.1.1 public void openFileChooser(ValueCallback<Uri> uploadMsg, String acceptType, String capture) { openFileChooser(uploadMsg, acceptType); } // For Android 3.0+ public void openFileChooser(ValueCallback<Uri> uploadMsg, String acceptType) { if (mUploadMessage != null) return; mUploadMessage = uploadMsg; startActivityForResult(createDefaultOpenableIntent(), MainActivity.FILECHOOSER_RESULTCODE); } // For Android < 3.0 public void openFileChooser(ValueCallback<Uri> uploadMsg) { openFileChooser( uploadMsg, "" ); } }
聲明並實現了這個類后就可以用webView 的setWebChromeClient(new WebChromeClient())方法加入自己實現的接口了。
webView.setWebChromeClient(new MyWebChromeClient());
不過上面實現的內部類中有幾個方法還要使用,是自己實現的方法。放在內部類里也行,放外面也行,都隨意,不過要是寫在內部類里的話,String mCameraFilePath;這個屬性要聲明成activity的屬性。
private Intent createDefaultOpenableIntent() { // Create and return a chooser with the default OPENABLE // actions including the camera, camcorder and sound // recorder where available. Intent i = new Intent(Intent.ACTION_GET_CONTENT); i.addCategory(Intent.CATEGORY_OPENABLE); i.setType("*/*"); Intent chooser = createChooserIntent(createCameraIntent(), createCamcorderIntent(), createSoundRecorderIntent()); chooser.putExtra(Intent.EXTRA_INTENT, i); return chooser; } private Intent createChooserIntent(Intent... intents) { Intent chooser = new Intent(Intent.ACTION_CHOOSER); chooser.putExtra(Intent.EXTRA_INITIAL_INTENTS, intents); chooser.putExtra(Intent.EXTRA_TITLE, "File Chooser"); return chooser; } //在原作者代碼里我發現這個變量會被下面的方法使用,但他用的是局部變量,我設成屬性后就好了 String mCameraFilePath; private Intent createCameraIntent() { Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); File externalDataDir = Environment.getExternalStoragePublicDirectory( Environment.DIRECTORY_DCIM); File cameraDataDir = new File(externalDataDir.getAbsolutePath() + File.separator + "browser-photos"); cameraDataDir.mkdirs(); mCameraFilePath = cameraDataDir.getAbsolutePath() + File.separator + System.currentTimeMillis() + ".jpg"; cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(new File(mCameraFilePath))); return cameraIntent; } private Intent createCamcorderIntent() { return new Intent(MediaStore.ACTION_VIDEO_CAPTURE); } private Intent createSoundRecorderIntent() { return new Intent(MediaStore.Audio.Media.RECORD_SOUND_ACTION); }
在activity里加入以上所有代碼后就好了,現在就能在網頁中用 <input type="file"/>了。
剛剛成功了,也不想再仔細研究了,小弟不才,博客不會寫,有什么問題,請指教