Android WebView: не работает выбор файла на странице в теге input type=»file»
Неожиданно обнаружилось что в странице загружаемой в виджет webview не работаю инпуты файлов. Т.е. при нажатии кнопки браузер не реагирует от слова никак. Как оказалось при дальнейших раскопках, Google подразумевает, что обработку файлов «вы берете на себя».
Решение:
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 | public class MainActivity extends AppCompatActivity {     private WebView mbrowser;     private ValueCallback<Uri> mUploadMessage;     public ValueCallback<Uri[]> uploadMessage;     public static final int REQUEST_SELECT_FILE = 100;     private final static int FILECHOOSER_RESULTCODE = 1; ... ...     @Override     public void onActivityResult(int requestCode, int resultCode, Intent intent) {         if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {             if (requestCode == REQUEST_SELECT_FILE) {                 if (uploadMessage == null) return;                 uploadMessage.onReceiveValue(WebChromeClient.FileChooserParams.parseResult(resultCode, intent));                 uploadMessage = null;             }         }         else if (requestCode == FILECHOOSER_RESULTCODE) {             if (null == mUploadMessage) return;             Uri result = intent == null || resultCode != MainActivity.RESULT_OK ? null : intent.getData();             mUploadMessage.onReceiveValue(result);             mUploadMessage = null;         }     }     @Override     protected void onCreate(Bundle savedInstanceState) { ... ...         mbrowser=(WebView) findViewById(R.id.main_webview);         mbrowser.getSettings().setJavaScriptEnabled(true); // разрешен javascript         mbrowser.getSettings().setAppCacheEnabled(false); // разрешон кэш         mbrowser.getSettings().setDatabaseEnabled(true); // хранение данных во встроенной БД в браузере         mbrowser.getSettings().setDomStorageEnabled(true);        // mbrowser.getSettings().setSupportZoom(true); // зум         mbrowser.getSettings().setJavaScriptCanOpenWindowsAutomatically(true); // разрешать открывать окна         //mbrowser.getSettings().setBuiltInZoomControls(true); // приблизить/удалить         mbrowser.getSettings().setGeolocationEnabled(true); // разрешаем геолокацию         mbrowser.setWebChromeClient(new WebChromeClient() {                                         @Override                                         public void onGeolocationPermissionsShowPrompt(String origin, GeolocationPermissions.Callback callback) {                                             callback.invoke(origin, true, false);                                         }                                         // For 3.0+ Devices (Start)                                         // onActivityResult attached before constructor                                         protected void openFileChooser(ValueCallback uploadMsg, String acceptType) {                                             mUploadMessage = uploadMsg;                                             Intent i = new Intent(Intent.ACTION_GET_CONTENT);                                             i.addCategory(Intent.CATEGORY_OPENABLE);                                             i.setType("image/*");                                             startActivityForResult(Intent.createChooser(i, "File Browser"), FILECHOOSER_RESULTCODE);                                         }                                         // For Lollipop 5.0+ Devices                                         public boolean onShowFileChooser(WebView mWebView, ValueCallback<Uri[]> filePathCallback, WebChromeClient.FileChooserParams fileChooserParams) {                                             if (uploadMessage != null) {                                                 uploadMessage.onReceiveValue(null);                                                 uploadMessage = null;                                             }                                             uploadMessage = filePathCallback;                                             Intent intent = null;                                             if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP) {                                                 intent = fileChooserParams.createIntent();                                             }                                             try {                                                 startActivityForResult(intent, REQUEST_SELECT_FILE);                                             } catch (ActivityNotFoundException e) {                                                 uploadMessage = null;                                                 return false;                                             }                                             return true;                                         }                                         //For Android 4.1 only                                         protected void openFileChooser(ValueCallback<Uri> uploadMsg, String acceptType, String capture) {                                             mUploadMessage = uploadMsg;                                             Intent intent = new Intent(Intent.ACTION_GET_CONTENT);                                             intent.addCategory(Intent.CATEGORY_OPENABLE);                                             intent.setType("image/*");                                             startActivityForResult(Intent.createChooser(intent, "File Browser"), FILECHOOSER_RESULTCODE);                                         }                                         protected void openFileChooser(ValueCallback<Uri> uploadMsg) {                                             mUploadMessage = uploadMsg;                                             Intent i = new Intent(Intent.ACTION_GET_CONTENT);                                             i.addCategory(Intent.CATEGORY_OPENABLE);                                             i.setType("image/*");                                             startActivityForResult(Intent.createChooser(i, "File Chooser"), FILECHOOSER_RESULTCODE);                                         }         }); |