Kamera Foto-Upload und der Dateiauswahl-Dialog von webview Eingabefeld
Meine app ist webbasiert und ich brauche, um Fotos von einem Eingabefeld camp. Ich habe zwei Situationen, und ich weiß nicht, einen anderen Weg, es zu tun, je nach der Seite, ich habe mich entschieden den einen oder anderen mit "boolean boolFileChoser" je nach Ihrer URL-petition:
ein. Dateiauswahl
b. Kamera Foto-Shooting.
Habe ich behandelt mit Dateiauswahl und upload der Datei perfekt, das problem mit der Kamera. Sobald ich versuche, laden Sie die Kamera-Pic, stürzt es ab.
Soweit ich weiß, seine weil der URI.
a) Datei-picker: Inhalt://media/external/images/1234
b) - Kamera-Schießen: file:///mnt/sdcard/Pic.jpg
Habe ich keine Möglichkeit gefunden, es zu ändern.
Siehe update
Es jetzt abstürzt, weil eine nullpointerexception beim Versuch, laden Sie die "content://media/external/images/1234". (nur mit Kamera, nicht die Datei-Auswahl. ).
Auch wenn die Auswahl/Kamera geschlossen ist, (zurück-Taste), ich bin nicht in der Lage, es zu nennen, wieder.
Fall a) und b) 100% arbeiten, hier ist der funktionierende code, darunter, wie ich weiß, wenn fileChooser oder die Kamera aufgerufen werden:
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent intent) {
if (resultCode != RESULT_OK) {
/** fixed code **/
//To be able to use the filechooser again in case of error
mUploadMessage.onReceiveValue(null);
/** fixed code **/
return;
}
if (mUploadMessage==null) {
Log.d("androidruntime","no mUploadMessage");
return;
}
if (requestCode == FILECHOOSER_RESULTCODE) {
Uri selectedImage= intent == null || resultCode != RESULT_OK ? null : intent.getData();
Log.d("androidruntime","url: "+selectedImage.toString());
}else if (requestCode == CAMERAREQUEST_RESULTCODE) {
if(mCapturedImageURI==null){
Log.d("androidruntime","no mCapturedImageURI");
return;
}
/** fixed code **/
getContentResolver().notifyChange(mCapturedImageURI, null);
ContentResolver cr = getContentResolver();
Uri uriContent= Uri.parse(MediaStore.Images.Media.insertImage(getContentResolver(), photo.getAbsolutePath(), null, null));
photo = null;
/** fixed code **/
}
mUploadMessage.onReceiveValue(selectedImage);
mUploadMessage = null;
}
private static final int FILECHOOSER_RESULTCODE = 2888;
private static final int CAMERAREQUEST_RESULTCODE = 1888;
private ValueCallback<Uri> mUploadMessage;
private Uri mCapturedImageURI = null;
protected class AwesomeWebChromeClient extends WebChromeClient{
//Per Android 3.0+
public void openFileChooser(ValueCallback<Uri> uploadMsg, String acceptType){
/**updated, out of the IF **/
mUploadMessage = uploadMsg;
/**updated, out of the IF **/
if(boolFileChooser){ //Take picture from filechooser
Intent i = new Intent(Intent.ACTION_GET_CONTENT);
i.addCategory(Intent.CATEGORY_OPENABLE);
i.setType("image/*");
MainActivity.this.startActivityForResult( Intent.createChooser( i, "Escoger Archivo" ), MainActivity.FILECHOOSER_RESULTCODE );
} else { //Take photo and upload picture
Intent cameraIntent = new Intent("android.media.action.IMAGE_CAPTURE");
File photo = new File(Environment.getExternalStorageDirectory(), "Pic.jpg");
cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT,
Uri.fromFile(photo));
mCapturedImageURI = Uri.fromFile(photo);
startActivityForResult(cameraIntent, MainActivity.CAMERA_REQUEST);
}
}
//Per Android < 3.0
public void openFileChooser(ValueCallback<Uri> uploadMsg){
openFileChooser(uploadMsg, "");
}
//Altre
public void openFileChooser(ValueCallback<Uri> uploadMsg, String acceptType, String capture) {
openFileChooser(uploadMsg, "");
}
/** Added code to clarify chooser. **/
//The webPage has 2 filechoosers and will send a console message informing what action to perform, taking a photo or updating the file
public boolean onConsoleMessage(ConsoleMessage cm) {
onConsoleMessage(cm.message(), cm.lineNumber(), cm.sourceId());
return true;
}
public void onConsoleMessage(String message, int lineNumber, String sourceID) {
Log.d("androidruntime", "Per cònsola: " + cm.message());
if(message.endsWith("foto")){ boolFileChooser= true; }
else if(message.endsWith("pujada")){ boolFileChooser= false; }
}
/** Added code to clarify chooser. **/
}
UPDATE 1
Ich könnte den "content://media/external/images/xxx" uri-format, aber die app immer noch abstürzt, während Sie versuchen, laden Sie die uri über "mUploadMessage.onReceiveValue(selectedImage);". Jetzt bin ich immer eine nullpointerexception.
UPDATE 2
Fest und arbeiten.
Hatte, habe ich die 'ValueCallback uploadMsg' in der lokalen variable nur in der Datei-Auswahl Fall, so dass es immer throwed mich eine Ausnahme, wenn ich versuchte, laden Sie ein Foto-Datei, weil es null war.
Einmal nahm ich Sie heraus, aus der if-else-Anweisung, alle arbeiteten.
Das Vorherige update war die einfachste Methode, um die Datei hochzuladen.
Habe ich bereits Hinzugefügt 'mUploadMessage.onReceiveValue(null);", wenn die Kamera/filechooser Absicht ist abgesagt (Sie muss sich mit ihm in Ihre Webseite), wenn nicht, werden Sie nicht in der Lage zu starten, das INPUT-Feld (Absicht) wieder.
UPDATE 3
Hinzugefügt der Teil des Codes, der innerhalb AwesomeChromeClient zu unterscheiden ist die option, ein Foto aufzunehmen, oder wählen Sie eine Datei.. es ist MEIN Weg, es zu tun, und fügte hinzu, durch petition, ich bin sicher, es gibt eine Menge andere gültige Wege, es zu tun,
Der code ist 100% funktional jetzt. Wenn Sie angeben, wenn Sie möchten, dass Bild-oder Datei-chooser
Der code sieht gut aus, und wird sehr nützlich für mich, ich habe nicht versucht, es sich einfach nur noch, ich bin versucht, herauszufinden, wo die variable "boolFileChooser"'s Wert eingestellt ist? Auch entdeckt ein Tippfehler: ich denke, "MainActivity.CAMERA_REQUEST" sollte "MainActivity.CAMERAREQUEST_RESULTCODE"
Ich habe es geschafft, mein code funktioniert jetzt, vielen Dank für die Hilfe. Versuchte viele andere Lösungen auf dem web, aber dieses war das beste. Prost!
ist es möglich den upload der vollständige code? danke.
user280109 ich erinnere mich, dass ich es auch ausprobiert (viele verschiedene Quellen und code tryings) und ich kann mich nicht erinnern, warum ich das, aber "es funktioniert" 😀 ich kann nicht poste den vollständigen code (spezifischer code für die app und die standard webview in oncreate), aber ich Stell die "boolFileChooser" Teil.. es ist der fehlende Teil, damit es funktioniert, es sollte also genug sein.. Wenn ich dieses schrieb, es war einfach noch nicht implementiert. (ich war bis jetzt, sorry für die nicht Antwort, die Sie früher).
InformationsquelleAutor Jordi | 2012-11-08
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dies ist, wie ich das umgesetzt Kamera hochladen und filechooser von WebView Eingabefeld:
Unten ist der code für dieses wichtige Thema. Die nicht relevanten-code wird entfernt.
Ich hoffe, es wird hilfreich sein für jemanden 🙂
InformationsquelleAutor user3459287
Gelöst. Meine Frage, gibt es die funktionalen code, falls jemand es braucht.
Hier ist die Lösung der Probleme:
Konnte nicht geöffnet werden Kamera/filechooser, wenn ich zuvor geöffnet und abgebrochen:
Holen Sie sich die "content://media/external/images/xxx" uri-format, laden Sie die uri über "mUploadMessage.onReceiveValue(selectedImage);", um eine nullpointerexception
da bekomme ich "uriContent" null.
InformationsquelleAutor Jordi
Aufgelöst und seine Arbeitsmethoden in Ordnung.
Schauen Sie sich nur den code von WebChromeClient Klasse.
Finden Sie Parameter geändert, von früher.
Lösung:
Sie Folgen Sie einfach den aktuellen ChromeBrowser code in das github-link
Android-Chrome-browser-code auf Github
Nutzen gleichen github-code für Ihr Projekt.
Achtung: Es gibt immer noch Problem mit android 4.4 KitKat version. Außer android 4.4, seine arbeiten gut für andere Android-Versionen.
Da dies noch offen Mangel von Google. Überprüfen Sie bitte in den folgenden link.
openFileChooser nicht aufgerufen, wenn Sie angeklickt wird, der auf android 4.4 webview
InformationsquelleAutor porwalankit