2016-07-15 4 views
3

私は2つの質問があり、そしてここに私の問題が明らかに短いコードスニペット作るために:「何のファイルは、URIの下に存在しないかのモードが無効な場合にFileNotFoundExceptionをスロー」最後の行はなぜContentResolver.openFileDescriptorがIllegalArgumentExceptionをスローしますか?出口?

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

ドキュメントサイスを

実際には私はjava.lang.IllegalArgumentExceptionを取得します。

(質問1)これはバグですか、OKですか?

(質問2)openFileDescriptor()は明らかにドキュメントが存在するかどうかをテストする良い方法ではありません。それを行うための「正式な」方法は何ですか?

編集(追加のエラーログ):

W/System.errの:java.lang.IllegalArgumentExceptionが:9016-4EF8かどうかを判断するために失敗しました:MYFOLDER/file1.wavが9016-4EF8の子である:MYFOLDER :java.io.FileNotFoundException:/storage/extSdCard/myFolder/file1.wav

W/System.errのではMyFolder/file1.wav:9016-4EF8用のファイルが見つからないandroid.database.DatabaseUtils.readExceptionFromParcelで(DatabaseUtils .java:167)

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

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

W/System.errので:android.content.ContentResolverました。 openAssetFileDescriptor(ContentResolver.java:945)

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

W/System.errので:android.content.ContentResolverました。 openFileDescriptor(ContentResolver.java:739)

そして:

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

+1

「しかし、実際に私はjava.lang.IllegalArgumentExceptionが取得」 - 私は、ステートメントと一緒に、あなたがあなたの質問を編集して、全体のJavaスタックトレースを投稿することをお勧めしますどこから 'documentUri'を取得したのでしょうか。 「これはバグですか、OKですか?」 - Javaスタックトレース全体を見ることなく、 'documentUri'がどこから得られたのかを知ることができません。 "それを行うための「正式な」方法は何ですか? - [DocumentFile'](https://developer.android.com/reference/android/support/v4/provider/DocumentFile.html#exists())に['exists()'を使用します。 – CommonsWare

+0

'documentUri'で特定された文書を問題なく削除できるのであれば、実際の文書の性質は' openFileDescriptor'とは関係がありませんか?そして 'DocumentFile'について:これを避けることに成功しました。なぜなら、' exists() 'のためだけにそれを含めることを余儀なくされているのでしょうか? –

答えて

1

これはバグですか、OKですか?

ここではFileNotFoundExceptionを投げている限り、バグだと主張します。

openFileDescriptor()は、ドキュメントが存在するかどうかをテストするための適切な方法ではありません。それを行うための「正式な」方法は何ですか?

単純な解決策は、DocumentFileとそのexists()メソッドを使用することです。

documentUriで特定されたドキュメントを問題なく削除できるのであれば、実際のドキュメントの性質はopenFileDescriptorとは関係ありませんか?

これは、誰が責任を負うかを知るのに役立ちます。この場合、問題はGoogleにあります。

DocumentFileについて:私はそれを避けることに成功しました。なぜなら、exist()のためだけにそれを含めることを余儀なくされたのでしょうか?

ご希望の場合は、exists()の実装を複製することは間違いありません。いくつかの間接の礼儀、あなたはin DocumentsContractApi19にそれを見つけることができます:

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); 
    } 
} 
関連する問題