0

In Android kann mit dieser grundlegenden Einrichtung ein Bild aufgenommen werden, wie in here angezeigt.Fehler bei der Erfassung der Android-Kameraaktivität bei Verwendung von ACTION_IMAGE_CAPTURE Intent

protected void dispatchTakePictureIntent(){ 
    Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
    if (takePictureIntent.resolveActivity(getPackageManager()) != null) { 

     ... 
     takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(photoFile)); 
     startActivityForResult(takePictureIntent, REQUEST_TAKE_PHOTO); 
    } 
} 

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    if (requestCode == REQUEST_IMAGE_CAPTURE && resultCode == RESULT_OK) { 
     //do stuff with the output file 
    } 
} 

Jedoch third-party camera apps are unpredictable and cannot be guaranteed to play nice.

Was ist der richtige Weg, um die Ausgabe zu validieren/irgendwelche Fehler zu erfassen? Sollte ich startActivityForResult innerhalb eines Try/Catch-Blocks wickeln? Was sind die verschiedenen Arten von Ausnahmen, die ich versuchen sollte zu fangen, und was soll ich mit ihnen machen?

Antwort

1

Sollte ich startActivityForResult innerhalb eines try/catch-Blocks verpacken?

Ja, obwohl dies mit ACTION_IMAGE_CAPTURE spezifisch nichts zu tun hat. Der Benutzer hat möglicherweise keinen Zugriff auf eine Kamera-App (z. B. läuft der Benutzer unter einem eingeschränkten Profil auf einem gemeinsam genutzten Gerät). Jedes Mal, wenn Sie startActivity() oder startActivityForResult() mit einem impliziten Intent aufrufen, müssen Sie mit der Möglichkeit umgehen, dass es keine verfügbare App gibt.

Was sind die verschiedenen Arten von Ausnahmen, die ich versuchen sollte zu fangen und was soll ich mit ihnen tun?

In der Antwort, die Sie verknüpft, deutete ich Abstürze in der Kamera-App aus. Sie können diese nicht erfassen, da dies nicht Ihre App ist.

Über ActivityNotFoundException hinaus müssen Sie auch über Android 6.0-Laufzeitberechtigungen nachdenken, da Sie die CAMERA Berechtigung benötigen, um eine ACTION_IMAGE_CAPTURE Aktivität zu starten. In der Regel wird dies jedoch keinen Ausnahmebehandler erfordern.

Die anderen Validierungen auf Ausnahmen nicht beruhen würde, sondern auf der Grundlage fehlerhafter Ergebnisse:

  • Wenn Sie EXTRA_OUTPUT geliefert, gibt es keine Inhalte an der Uri Sie angegeben? Wenn der Benutzer die Kamera-App nicht abbricht, gibt es theoretisch, aber das ist nicht garantiert, aufgrund von Kamera-App-Bugs.

  • Wenn es Inhalt gibt, ist es plausibel eine Bilddatei? Zum Beispiel könnten Sie BitmapFactory mit inJustDecodeBounds verwenden, um zu sehen, ob das Bild wirklich ein Bild ist.

  • Wenn kein Inhalt ist, konnte das passieren Sie eine Uri zurück im Ergebnis Intent in onActivityResult() zu bekommen? Die Buggy-Kamera-App hat das Bild möglicherweise dort gespeichert, wo es gewünscht wurde, und es mit Uri versorgt, obwohl dies für ACTION_IMAGE_CAPTURE weit außerhalb der Spezifikation liegt.

  • Wenn kein Inhalt ist, und es gibt keine Uri, tut getExtras("data") einen nicht null Wert zurückgeben? In diesem Fall haben Sie zumindest ein Thumbnail und können es selbst speichern, auch wenn die Bildqualität darunter leidet.

+0

Im Hinblick auf die mögliche 'Uri zurück im Ergebnis Intent' ich mit' noch Uri' Nutzung nicht vertraut bin aber auf Grund meiner gerade googeln, sagen Sie, wenn so etwas wie 'Uri myUri = Uri zu überprüfen. parse (data.getExtras(). getString (MediaStore.EXTRA_OUTPUT)); 'gibt ein' Uri' mit einem 'file:' type? – KaliMa

+0

@KaliMa: Nein, ich meine, wenn 'getData()' auf dem 'Intent' übergeben an 'onActivityResult()' gibt das 'Uri' zurück. Ich nehme an, es ist nicht ausgeschlossen, dass eine Kamera-App Ihnen über 'onActivityResult()' 'eine' Intent' mit einem 'EXTRA_OUTPUT'-Extra schicken kann, aber von diesem Szenario habe ich noch nichts gehört. Ich habe von Kamera-Apps gehört, die den "Uri" als "Uri" des "Intent" selbst zurückschicken. – CommonsWare

+0

Aber wenn ich 'takePictureIntent.putExtra angegeben habe (MediaStore.EXTRA_OUTPUT, Uri.fromFile (photoFile)); 'weiß ich nicht schon, wo sich die resultierende Bilddatei in 'onActivityResult()' befindet? Oder ignorieren einige Apps das komplett und legen es wo immer sie wollen? – KaliMa

Verwandte Themen