사용자가 브라우저에서 일부 파일을 다운로드하는 경우 Android 4.2 이후 DownloadManager가 사용됩니다. 사용자가 '다운로드 완료'알림을 클릭하면 인 텐트가 시작되어 항상 시작되었습니다.잡힌 DownloadManager 인 텐트에서 파일 경로 가져 오기
intent.getData()
는 file:///storage/emulated/0/Download/some_file.ext
같은 문자열을 반환 : 안드로이드 4.2하도록 내용에서 다운로드 한 파일의 경로를 가지고하는 데 사용되는 의도 전에. 그러나 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
문은 예외를 throw)를 반환하지 :
나는 다음과 같은 시도했습니다. 또한 Uri에서 다운로드 한 파일 ID를 파싱하여 해킹하는 것이 이상하게 보입니다.
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
을 통해 다운로드에 액세스 할 수 없습니다.
이 BTW 첫 번째 접근 방식은, 나를 위해 무사 작동 DownloadManager.COLUMN_STATUS == STATUS_SUCCESSFUL과 유효한 URI를 반환 열 COLUMN_LOCAL_URI. – southerton