2016-06-28 3 views
0

Was ist der zuverlässigste Weg, die ACTION_IMAGE_CATPURE-Absicht für Android zu tun? Ich habe mehrere Dinge ausprobiert, die ich online gefunden habe, und keiner von ihnen funktioniert auf jedem Gerät. Meine Testgeräte sind ein Nexus 6 (Android 6.0.1) und ein Lenovo Telefon (4.4.2).Zuverlässige Möglichkeit, eine ACTION_IMAGE_CAPTURE Absicht zu machen?

Ich habe versucht, den folgenden (entfernt redundanten Code wie Berechtigungen - diese eindeutig richtig funktionieren):

Eine Option (funktioniert nur auf dem Nexus 6)

final File root = new File(Environment.getExternalStorageDirectory() + File.separator + "MyDir" + File.separator); 
root.mkdirs(); 
final String fname = "img_" + System.currentTimeMillis() + ".jpg"; 
outputFileUri = Uri.fromFile(new File(root, fname)); 

Intent takePhotoIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
takePhotoIntent.putExtra(android.provider.MediaStore.EXTRA_OUTPUT, outputFileUri); 

try { 
    startActivityForResult(takePhotoIntent, 1); 
} catch (SecurityException e) { } 

// .... 

public void onActivityResult(int requestCode, int resultCode, Intent data) { 
    System.out.println(new File(outputFileUri.toString()).exists())); 
    // This prints false on Kitkat, but true on 6.0 

Option B (nicht auf entweder arbeiten, aber es scheint, dass es sollte auf beide arbeiten)

Intent takePhotoIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
outputFileUri = takePhotoIntent.getData(); 
// start intent 

// ..... 

    public void onActivityResult(int requestCode, int resultCode, Intent data) { 
    System.out.println(new File(outputFileUri.toString()).exists())); 
    // This prints false on everything 

Es scheint wie dort sollte eine zuverlässige Möglichkeit sein, dies über Android-Versionen zu tun, aber ich habe auf Stack-Überlauf für die letzte Stunde gewesen und es gibt 10 + Lösungen, die ich ausprobiert habe, und keiner von ihnen auf dem älteren arbeiten Version von Android.

Wie bekomme ich den Uri zuverlässig aus der ACTION_IMAGE_CAPTURE Absicht?

+0

show your logcat whats system sagt? –

+0

Das Protokoll ist voller Zufälligkeit - was soll ich suchen? Vor der Druckanweisung wurden keine Fehler ausgegeben. Ich meine, ich könnte es kopieren/einfügen, aber es werden ungefähr 500 Zeilen sein, ohne zu wissen, wonach ich suchen soll. – CaptainForge

+0

@SohailZahid Wenn Sie das System.out oben gemeint haben, wird nur falsch wie beschrieben gedruckt. – CaptainForge

Antwort

1

// Diese auf Kitkat falsch druckt, aber wahr auf 6,0

, die auf allen Android-Versionen ausfallen sollte. outputFileUri.toString() wird etwas wie "file:///..." sein (für einen Wert von ...), und das ist kein gültiger Dateisystempfad. Vielleicht hat Google File aktualisiert, um das Schema zu entfernen.

Die bessere Lösung ist, auf new File(root, fname) zu halten, das ist das korrekte File Objekt. Denken Sie daran, dass Ihr Prozess möglicherweise beendet wird, während sich die Kamera-App im Vordergrund befindet. Halten Sie dies im Status der gespeicherten Instanz fest Bundle.

Denken Sie auch daran, dass Ihr Ansatz nicht auf API Level 24+ funktioniert, wenn Ihr targetSdkVersion 24 oder höher ist, wie fileUri values are banned.

aber scheint, dass es auf beiden

The documentation nicht an, dass ACTION_IMAGE_CAPTUREetwas, geschweige denn die Uri zurückkehren sollte funktionieren. Ich stimme zu, dass dies logischerweise die Antwort sein sollte, aber es gibt viele Dinge in Android, die der Logik trotzen.

Es scheint, wie es sollte eine zuverlässige Möglichkeit, dies

Well über Android-Versionen zu tun, erwarten zuverlässige Ergebnisse aus ACTION_IMAGE_CAPTURE albern ist. Sie delegieren an eine Drittanbieter-App. Es gibt Tausende von Android-Gerätemodellen, und diese werden mit Hunderten von Kamera-Apps ausgeliefert. Es gibt Hunderte mehr im Play Store und anderswo. Viele Kamera-App-Entwickler testen ACTION_IMAGE_CAPTURE nicht sehr gut, und es gibt viele Kamera-Apps, die Bugs haben, wie zum Beispiel EXTRA_OUTPUT vollständig zu ignorieren.

Viele weitere werden erhalten durch die oben erwähnte fileUri Verbot gestolpert, da sie keine contentUri hier erwartet werden können. Heck, Google hat noch nicht ACTION_IMAGE_CAPTUREauf ihren eigenen Kamera-App, dass alles viel, soweit die Prüfung stören, dass sie nicht behandeln contentUri Werte und will not do so for some time.

Fühlen Sie sich frei, ACTION_IMAGE_CAPTURE zu verwenden, aber seien Sie bereit, ordnungsgemäß zu versagen.

+0

Ok, wenn ich also nicht ACTION_IMAGE_CATURE verwenden soll, wie * soll * ich ein Foto machen? Muss ich meine eigene Kamera-App machen? – CaptainForge

+0

@CaptainForge: Deine Optionen sind: benutze 'ACTION_IMAGE_CAPTURE' und lebe mit den Fehlern von Kamera-Apps von Drittanbietern, benutze eine Bibliothek (zB [meine] (https://github.com/commonsguy/cwac-cam2)) und lebe mit * seine * Bugs, oder benutze die Kamera-APIs direkt. – CommonsWare