E 'possibile caricare file tramite webview?
Questa funzione è disponibile nella versione 1.3.0 e successive. Per le versioni precedenti dell'app, sì è possibile, ma è necessario aggiungere del codice aggiuntivo per farlo funzionare. Aggiungi il seguente codice nel tuo file AndroidManifest.xml. Posizionarla sotto altri elementi usi-autorizzazione:
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
Copia/incolla questo java classe MediaUtility.java nel progetto. Inseriscilo nella directory com/robotemplates/webviewapp/utility.
Aprire MainFragment.java nel pacchetto frammento. Trova il metodo renderView() e sostituire “webView.setWebChromeClient (nuova WebChromeClient());” dal seguente codice:
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;
}
});
Infine aggiungere seguente codice da qualche parte dentro l'oggetto MainFragment (per esempio al di sotto di questa linea “boolean privato 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;
}
}
non dimenticare di aggiungere le importazioni necessarie:‘import android.webkit.ValueCallback;’,‘importazione com.robotemplates.webviewapp.utility.MediaUtility;’,“importazione java.io .File;". Se hai ancora un problema, prova ad aggiungere una regola nello script Proguard: https://code.google.com/p/android/issues/detail?id=62220#c120.
Con quale versione di Android stai lavorando? Credo che prima di FroYo (2.2) il browser Android integrato non supportasse il caricamento di file: http://code.google.com/p/android/issues/detail?id=2519 (a partire da 2.2 dovrebbe funzionare comunque , funziona bene sul mio N1 con 2.2). –
@Charlie Collins Sto provando questo su 2.1, 2.2, 2.3 e sarebbe ok se funzionasse su uno di questi. Funziona perfettamente nel browser anche su 2.1 (Galaxy S), ma ho bisogno che funzioni in una WebView in un'app personalizzata. Stai dicendo che funziona bene nella tua app con una WebView su 2.2? – m0s
Non l'ho provato in particolare in una WebView, no (stavo solo usando l'app Browser). Il browser Android utilizza comunque WebViews: http://android.git.kernel.org/?p=platform/packages/apps/Browser.git;a=blob_plain;f=src/com/android/browser/BrowserActivity.java; hb = HEAD –