1

DownloadManagerを使用してアプリケーション内のすべてのファイルをダウンロードしています。また、エンキューメソッドが返すすべてのIDを保存します。問題は、どのくらいの時間が経過してもまだファイルが存在するかどうかを判断することです。DownloadManagerでダウンロードしたファイルがデバイスストレージにまだ残っていないか確認してください。

私はそのよう

Cursor c = 
     mgr.query(new DownloadManager.Query().setFilterById(lastDownload)); 

if (c == null || !c.moveToFirst()) { 
    // File doesn't exist? 
} 

でこれをやろうとしている。しかし、それは動作しませんでした。時にはdownloadManagerがCursorを返し、moveToFirstの呼び出しがtrueを返しますが、ダウンロードされたファイルはファイルシステムから削除されています。

私が見つけた2番目の方法は、ダウンロードマネージャーからコンテンツUriを入手することです。また、コンテンツのUri制限についてはthis postと読んでいます。要するに私が正しく理解すれば、Uriはコンテンツが存在することを保証するものではなく、Uriはコンテンツがファイルであることを保証するものでもありません。とにかく、私はこの建設がうまくいくと思う:

try { 
    contentResolver.openFileDescriptor(contentUri, "r"); 
} catch (FileNotFoundException e) { 
    // File doesn't exist? 
} 

しかし、結果は非常にイライラです。場合によっては(絶対的にランダムな)アプリケーションがSecurityExceptionでクラッシュすることがあります。

java.lang.SecurityException: Permission Denial: reading com.android.providers.downloads.DownloadProvider uri content://downloads/all_downloads/1145 from pid=16585, uid=10086 requires android.permission.ACCESS_ALL_DOWNLOADS, or grantUriPermission() 

私の質問は次のとおりです。ダウンロードしたファイルが存在するかどうか調べる方法は?アプリケーションが時々クラッシュする理由行動は絶対無作為だから、それはまあまあのようだ。

答えて

0

マニフェストの読み取りまたは書き込みファイルのアクセス許可を追加しましたか。

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 

またはバージョン23で作業している場合は、データを取得する前にセキュリティ許可条件を使用する必要があります。

+0

このアクセス許可はMy Manifestに存在し、実行時アクセス許可チェックも実装されています。それでも運がないと、アプリケーションはクラッシュし続けます(ストレージ許可は100%許可されます)。 –

+2

プロジェクトをきれいにしてビルドを試してください。 –

関連する問題