К сожалению, как сказал пользователь Слартибартфаст в одном из комментариев к вашему вопросу, тип входа " файл "не будет работать на 4.4 устройствах. В коде google есть issue, в котором говорится, что это предполагаемое поведение (Status: WorkingAsIntended).
Тем не менее, код, который вы предоставили, работает в 4.4.4 (протестирован на планшете Nexus 7) и на < версии 4.4 os.
В 5.0, они добавили документально подтвержденный method, чтобы сделать это. Я использую следующий код:
mWebView.setWebChromeClient(new WebChromeClient() {
// For Android < 3.0 - undocumented method
@SuppressWarnings("unused")
public void openFileChooser(ValueCallback<Uri> uploadMsg) {
openFileChooser(uploadMsg, "");
}
// For Android 3.0+ - undocumented method
public void openFileChooser(ValueCallback<Uri> uploadMsg, String acceptType) {
mUploadCallback = uploadMsg;
openFileChooserActivity();
}
// For Android > 4.1 - undocumented method
@SuppressWarnings("unused")
public void openFileChooser(ValueCallback<Uri> uploadMsg, String acceptType, String capture){
openFileChooser(uploadMsg, "");
}
// For Android > 5.0
public boolean onShowFileChooser (WebView webView, ValueCallback<Uri[]> filePathCallback, WebChromeClient.FileChooserParams fileChooserParams) {
mUploadCallbackLollipop = filePathCallback;
openFileChooserActivity();
return true;
}
});
принять к сведению на измененном параметра обратного вызова> 5.0: от ValueCallback<Uri>
до ValueCallback<Uri[]>
.
Итак, для> = 4.4 и < 4.4.4 вы должны реализовать свой собственный механизм загрузки файлов. Некоторые предложения:
- проверить с помощью javascript версию android os и предоставить
<input type="file">
, где это работает. В версиях 4.4 создайте элемент html со своей собственной схемой URL (как сказал Сишант, например <form action="image://choose">
). Затем вы можете поймать его в shouldOverrideUrlLoading
и вызвать функцию javascript из java с файловым путем, но вы не сможете получить доступ к содержимому вашего файла. Для небольших файлов вы можете передать содержимое файла в base64 в качестве параметра функции javascript, но для более крупных файлов вы наверняка получите исключение OutOfMemory.
- вы можете выполнить описанные выше шаги, но обработать загрузку файла в java и предоставить только путь к функции javascript. Кнопка с submit может использовать то, что сказал Амрут Бидри, чтобы вызвать загрузку в java.
Итак, в качестве вывода, я вижу два варианта для версий os между 4.4 и 4.4.4: либо использовать javascript для загрузки файла (проблемы с памятью), либо загрузить его в java и реализовать собственный механизм связи между вашим приложение и веб-просмотр. Для них вы должны иметь доступ к веб-странице, которую вы загружаете в веб-просмотре.
Я использовал метод яваскрипта загрузки, так как мы используем небольшие файлы, и это было немного быстрее реализовать:
public boolean shouldOverrideUrlLoading(WebView view, String url) {
... else if (url.startsWith(UPLOAD_FILE_URL_PREFIX)) {
openFileChooserActivity();
return true;
}
return false;
}
В результате деятельности, я сделать что-то подобное для 4.4 версии (Код JavaScript функции insertFileForUpload
обрабатывает загрузки файла):
private void invokeJavascriptWithFileContent(Uri fileUri) {
String fileContentInBase64 = readAndConvertFileToBase64(fileUri);
if (!fileContentInBase64.isEmpty()) {
String fileMimeType = getMimeType(activity, fileUri);
String fileName = getFileName(activity, fileUri);
// invoke javascript
String js = String.format("javascript:insertFileForUpload(\"%s\",\"%s\",\"%s\")",
fileName,
fileMimeType,
fileContentInBase64
);
mWebView.loadUrl(js);
}
}
public static String getMimeType(Context context, Uri fileUri)
{
ContentResolver cR = context.getContentResolver();
MimeTypeMap mime = MimeTypeMap.getSingleton();
String type = mime.getExtensionFromMimeType(cR.getType(fileUri));
return type;
}
кроме того, в отношении https://github.com/delight-im/Android-AdvancedWebView, кажется, что загрузка файлов работает, но они говорят: «Загрузка файлов обрабатываются автоматически (проверить наличие с AdvancedWebView.isFileUploadAvailable())» и «IsFileUploadAvailable» содержит следующий код:
/**
* Returns whether file uploads can be used on the current device (generally all platform versions except for 4.4)
*
* @return whether file uploads can be used
*/
public static boolean isFileUploadAvailable() {
return isFileUploadAvailable(false);
}
/**
* Returns whether file uploads can be used on the current device (generally all platform versions except for 4.4)
*
* On Android 4.4.3/4.4.4, file uploads may be possible but will come with a wrong MIME type
*
* @param needsCorrectMimeType whether a correct MIME type is required for file uploads or `application/octet-stream` is acceptable
* @return whether file uploads can be used
*/
public static boolean isFileUploadAvailable(final boolean needsCorrectMimeType) {
if (Build.VERSION.SDK_INT == 19) {
final String platformVersion = (Build.VERSION.RELEASE == null) ? "" : Build.VERSION.RELEASE;
return !needsCorrectMimeType && (platformVersion.startsWith("4.4.3") || platformVersion.startsWith("4.4.4"));
}
else {
return true;
}
}
Таким образом, вы могли бы просто иметь те же проблемы с нормальным WebView, но я не проверял библиотеку, так что я не могу сказать.
Возможно, я создал беспорядок ответа, но надеюсь, вы найдете что-то полезное.
Ваше сообщение Строка? У вас есть https: // там? Только www. не работает ... Ups sorry misread question –
Я только что обновил свой ответ в формате uri. – ant2009
Я думаю, что вы обновили свой вопрос ... –