2016-07-15 9 views
3

Ich habe zwei Fragen, und meine Frage klar hier noch einen kurzen Code-Schnipsel zu machen: „FileNotFoundException ausgelöst, wenn keine Datei unter dem URI oder der Modus vorhanden ist ungültig“Warum ContentResolver.openFileDescriptor IllegalArgumentException auslöst? Ausweg?

ContentResolver resolver = context.getContentResolver(); 
DocumentsContract.deleteDocument(resolver, documentUri); 
resolver.openFileDescriptor(documentUri, "rw"); 

Die Dokumentation sais, die die letzte Zeile

Aber eigentlich bekomme ich java.lang.IllegalArgumentException.

(Frage 1) Ist das ein Fehler oder OK?

(Frage 2) openFileDescriptor() ist offensichtlich keine gute Methode, um zu testen, ob das Dokument existiert. Was ist die "offizielle" Methode, das zu tun?

Edit (hinzugefügt Fehlerprotokoll):

W/System.err: java.lang.IllegalArgumentException: Fehler zu bestimmen, ob 9016-4EF8: myFolder/file1.wav Kind 9016-4EF8 ist: myFolder : java.io.FileNotFoundException: Fehlende Datei für 9016-4EF8: myFolder/file1.wav bei /storage/extSdCard/myFolder/file1.wav

W/System.err: bei android.database.DatabaseUtils.readExceptionFromParcel (DatabaseUtils .java: 167)

W/System.err: bei android.database.DatabaseUtils.readExceptionWithFileNotFoundE xceptionFromParcel (DatabaseUtils.java:148)

W/System.err: at android.content.ContentProviderProxy.openAssetFile (ContentProviderNative.java:618)

W/System.err: bei android.content.ContentResolver. openAssetFileDescriptor (ContentResolver.java:945)

W/System.err: at android.content.ContentResolver.openFileDescriptor (ContentResolver.java:784)

W/System.err: bei android.content.ContentResolver. openFileDescriptor (ContentResolver.java:739)

Und:

documentUri = "Inhalt: //com.android.externalstorage.documents/tree/9016-4EF8%3AmyFolder/document/9016-4EF8%3AmyFolder%2Ffile1.wav"

+1

„Aber eigentlich komme ich java.lang.IllegalArgumentException“ - Ich empfehle, dass Sie Ihre Frage bearbeiten und die gesamte Java-Stack-Trace veröffentlichen, zusammen mit einer Erklärung von wo du 'documentUri' bekommen hast. "Ist das ein Fehler oder OK?" - Wir können nicht sagen, ohne den gesamten Stack-Trace zu sehen und zu wissen, woher man 'documentUri' hat. "Was ist die 'offizielle' Methode, das zu tun?" - Ich würde ['exists()' auf 'DocumentFile' verwenden] (https://developer.android.com/reference/android/support/v4/provider/DocumentFile.html#exists()). – CommonsWare

+0

Wenn ich in der Lage bin, das mit 'documentUri' identifizierte Dokument ohne Probleme zu entfernen, sollte die Art des eigentlichen Dokuments für' openFileDescriptor' nicht relevant sein, oder? Und bezüglich 'DocumentFile': Ich habe es erfolgreich vermieden und frage mich, ob ich jetzt gezwungen bin, es nur wegen' exists() 'einzuschließen? –

Antwort

1

Ist das ein Fehler oder OK?

Ich würde argumentieren, dass es ein Fehler ist, insofern es eine FileNotFoundException hier werfen sollte.

openFileDescriptor() ist offensichtlich keine gute Methode, um zu testen, ob das Dokument existiert. Was ist die "offizielle" Methode, das zu tun?

Die einfache Lösung ist DocumentFile und seine exists() Methode zu verwenden.

Wenn ich in der Lage, das Dokument durch documentUri ohne Probleme zu identifizieren und entfernen Sie die Art des aktuellen Dokuments sollte nicht für openFileDescriptor, sollte es relevant sein?

Nun, es hilft zu wissen, wer schuld ist. In diesem Fall liegt das Problem bei Google.

Und bezüglich DocumentFile: Ich habe es erfolgreich vermieden und frage mich, ob ich jetzt gezwungen bin, es nur wegen exists() einzuschließen?

Sie sind sicherlich willkommen, seine Implementierung von exists() zu klonen, wenn Sie möchten. Mit freundlicher Genehmigung von einiger indirection, werden Sie es in DocumentsContractApi19 finden:

public static boolean exists(Context context, Uri self) { 
    final ContentResolver resolver = context.getContentResolver(); 

    Cursor c = null; 
    try { 
     c = resolver.query(self, new String[] { 
       DocumentsContract.Document.COLUMN_DOCUMENT_ID }, null, null, null); 
     return c.getCount() > 0; 
    } catch (Exception e) { 
     Log.w(TAG, "Failed query: " + e); 
     return false; 
    } finally { 
     closeQuietly(c); 
    } 
} 
Verwandte Themen