ユーザーがブラウザでファイルをダウンロードすると、Android 4.2がダウンロードされます。ユーザーが「ダウンロード完了」通知をクリックすると、インテントはいつでも起動していました。アンドロイド4.2コンテンツでダウンロードしたファイルのパスを持っていた意図する前に、よう:捕捉されたDownloadManagerインテントからファイルパスを取得する
intent.getData()
は、file:///storage/emulated/0/Download/some_file.ext
として文字列を返します。しかし、Android 4.2以来、ダウンロードマネージャはcontent://downloads/all_downloads/2334
のようなcontent
体系で放送し、意図しています。
ダウンロードしたファイルのローカルファイルパスを取得するにはどうすればよいですか?
私は次のことを試してみた:
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
文が例外をスロー)任意の行を返すことはありません。また、ダウンロードファイルIDをUriから解析することによるハックは奇妙に思えます。
UPDATE:私も試してみました:
input = getActivity().getContentResolver().openInputStream(contentUri);
をしかし、これは
許可拒否を示すエラーを返します:読んcom.android.providers.downloads.DownloadProvider URIコンテンツを://downloads/all_downloads/2334 from pid = 30950、uid = 10064にはandroid.permission.ACCESS_ALL_DOWNLOADS、またはgrantUriPermission()が必要です
明らかに私はダウンロードにアクセスできません(私のアプリはブラウザを起動しなかったので)ContentProvider
でダウンロードできます。
ところで、あなたの最初のアプローチはDownloadManager.COLUMN_STATUS == STATUS_SUCCESSFULとで有効なURIを返す、私のために動作しますオールライト列COLUMN_LOCAL_URI。 – southerton