Android 4.2以降、ユーザーがブラウザにファイルをダウンロードすると、DownloadManagerが使用されます。ユーザーが「ダウンロード完了」通知をクリックすると、インテントが起動され、常に起動されます。Android 4.2より前では、インテントはダウンロードされたファイルのパスをコンテンツに含めるために使用されていました。
intent.getData()
などの文字列を返しfile:///storage/emulated/0/Download/some_file.ext
ます。ただし、Android 4.2以降、ダウンロードマネージャーはcontent
、などのスキームをブロードキャストして意図していcontent://downloads/all_downloads/2334
ます。
ダウンロードしたファイルのローカルファイルパスを取得するにはどうすればよいですか?
私は次のことを試しました:
public static String getRealPathFromURI(Uri contentUri, Activity activity) {
DownloadManager downloadManager = (DownloadManager) activity.getSystemService(Activity.DOWNLOAD_SERVICE);
String[] contentParts = contentUri.getEncodedPath().split("/");
Cursor q = downloadManager.query(new DownloadManager.Query().setFilterById(Integer.parseInt(contentParts[contentParts.length - 1])));
if (q == null) {
// Download no longer exists
return null;
}
q.moveToFirst();
return q.getString(q.getColumnIndex(DownloadManager.COLUMN_LOCAL_FILENAME));
}
ただし、カーソルが行を返すことはありません(q.getCount() == 0
したがって、最後のreturn
ステートメントは例外をスローします)。また、URIからのダウンロードファイルIDを解析することによるハッキングは奇妙に思えます。
更新:私も試しました:
input = getActivity().getContentResolver().openInputStream(contentUri);
しかし、これは次のようなエラーを返します
権限の拒否:com.android.providers.downloads.DownloadProvider uri content:// downloads / all_downloads / 2334 from pid = 30950、uid = 10064にはandroid.permission.ACCESS_ALL_DOWNLOADS、またはgrantUriPermission()が必要です。
明らかに、ダウンロードを介してダウンロードにアクセスすることはできません(私のアプリはダウンロードを開始しませんでした-ブラウザーは開始しました)ContentProvider
。