Czy można przesłać pliki przez webview?
Ta funkcja jest dostępna w wersji 1.3.0 i nowszych. W starszych wersjach aplikacji jest to możliwe, ale musisz dodać trochę kodu, aby działał. Dodaj następujący kod do pliku AndroidManifest.xml. Umieść go poniżej innych zastosowań-elementy uprawnień:
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
Skopiuj/wklej tę klasę java MediaUtility.java do projektu. Umieść go w katalogu com/robotemplates/webviewapp/utility.
Otwórz MainFragment.java w pakiecie fragmentu. Znajdź sposób renderView() i zastąpić „webView.setWebChromeClient (nowa WebChromeClient());”, wykonując kodu:
webView.setWebChromeClient(new WebChromeClient()
{
public void openFileChooser(ValueCallback<Uri> filePathCallback)
{
mFilePathCallback4 = filePathCallback;
Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.addCategory(Intent.CATEGORY_OPENABLE);
intent.setType("*/*");
startActivityForResult(Intent.createChooser(intent, "File Chooser"), REQUEST_FILE_PICKER);
}
public void openFileChooser(ValueCallback filePathCallback, String acceptType)
{
mFilePathCallback4 = filePathCallback;
Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.addCategory(Intent.CATEGORY_OPENABLE);
intent.setType("*/*");
startActivityForResult(Intent.createChooser(intent, "File Chooser"), REQUEST_FILE_PICKER);
}
public void openFileChooser(ValueCallback<Uri> filePathCallback, String acceptType, String capture)
{
mFilePathCallback4 = filePathCallback;
Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.addCategory(Intent.CATEGORY_OPENABLE);
intent.setType("*/*");
startActivityForResult(Intent.createChooser(intent, "File Chooser"), REQUEST_FILE_PICKER);
}
@Override
public boolean onShowFileChooser(WebView webView, ValueCallback<Uri[]> filePathCallback, WebChromeClient.FileChooserParams fileChooserParams)
{
mFilePathCallback5 = filePathCallback;
Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.addCategory(Intent.CATEGORY_OPENABLE);
intent.setType("*/*");
startActivityForResult(Intent.createChooser(intent, "File Chooser"), REQUEST_FILE_PICKER);
return true;
}
});
Wreszcie dodać następujący kod gdzieś wewnątrz obiektu MainFragment (na przykład poniżej tej linii „private boolean mLocal = false;”):
private static final int REQUEST_FILE_PICKER = 1;
private ValueCallback<Uri> mFilePathCallback4;
private ValueCallback<Uri[]> mFilePathCallback5;
@Override
public void onActivityResult(int requestCode, int resultCode, Intent intent)
{
if(requestCode==REQUEST_FILE_PICKER)
{
if(mFilePathCallback4!=null)
{
Uri result = intent==null || resultCode!=Activity.RESULT_OK ? null : intent.getData();
if(result!=null)
{
String path = MediaUtility.getPath(getActivity(), result);
Uri uri = Uri.fromFile(new File(path));
mFilePathCallback4.onReceiveValue(uri);
}
else
{
mFilePathCallback4.onReceiveValue(null);
}
}
if(mFilePathCallback5!=null)
{
Uri result = intent==null || resultCode!=Activity.RESULT_OK ? null : intent.getData();
if(result!=null)
{
String path = MediaUtility.getPath(getActivity(), result);
Uri uri = Uri.fromFile(new File(path));
mFilePathCallback5.onReceiveValue(new Uri[]{ uri });
}
else
{
mFilePathCallback5.onReceiveValue(null);
}
}
mFilePathCallback4 = null;
mFilePathCallback5 = null;
}
}
nie zapomnij dodać niezbędne import:«import android.webkit.ValueCallback;»,«import com.robotemplates.webviewapp.utility.MediaUtility;»,„import java.io .Plik;". Jeśli nadal masz problem, spróbuj dodać regułę w skrypcie Proguard: https://code.google.com/p/android/issues/detail?id=62220#c120.
Z jaką wersją Androida współpracujesz? Wierzę, że przed FroYo (2.2) wbudowana przeglądarka Androida nie obsługiwała przesyłania plików: http://code.google.com/p/android/issues/detail?id=2519 (od wersji 2.2 powinna działać działa dobrze na moim N1 z systemem 2.2). –
@Charlie Collins Próbuję tego na 2.1, 2.2, 2.3 i byłoby dobrze, gdyby działało na którymkolwiek z nich. Działa dobrze w przeglądarce nawet w wersji 2.1 (Galaxy S), ale potrzebuję tego do pracy w WebView w niestandardowej aplikacji. Mówisz, że działa dobrze w Twojej aplikacji z WebView w wersji 2.2? – m0s
Nie próbowałem tego specjalnie w WebView, nie (używałam tylko aplikacji Browser). Przeglądarka systemu Android używa WebViews: http://android.git.kernel.org/?p=platform/packages/apps/Browser.git;a=blob_plain;f=src/com/android/browser/BrowserActivity.java; hb = HEAD –