从抓下载管理意图检索文件路径(Retrieve file path from caught Down

2019-07-18 07:35发布

由于Android 4.2,如果用户下载了一些文件,在浏览器中使用的下载管理器。 如果用户点击了“下载完成”通知的意图是,总是启动。 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语句抛出一个异常)。 此外,通过分析来自乌里下载文件ID黑客似乎很奇怪。

更新:我也尝试:

input = getActivity().getContentResolver().openInputStream(contentUri);

但这返回一个错误提示

许可拒绝:读取com.android.providers.downloads.DownloadProvider URI内容://下载/ all_downloads /从PID 2334 = 30950,UID = 10064要求android.permission.ACCESS_ALL_DOWNLOADS,或grantUriPermission()

通过-显然,我无法访问下载(浏览器就照我的应用程序没有启动它们) ContentProvider

Answer 1:

得到它通过内容解析器是正确的事情。 并不是每一个内容的URL将是一个文件。 例如,图库应用会给你的URI是转换到网络电话或取决于源的本地文件。

即使你得到真正的文件路径,你可能无法读取它,因为文件的权限,但你可以幸运的是它在外部存储。 你有没有尝试添加android.permission.ACCESS_ALL_DOWNLOADS到您的应用程序,如异常提示? 这是行不通的,因为权限是在签名级别:(



Answer 2:

这里是什么工作。 首先,你不能(也不应该希望)得到的文件路径为botteaap正确地指出。 (学分他为我设定在正确的道路上),相反,你得到一个临时许可自动访问该文件的内容,使用:

InputStream input = getContentResolver().openInputStream(intent.getData());

您可以阅读InputStream像任何其他Java中。 这似乎是没有办法得到的文件名。 如果你需要一个文件,先写输入流的(临时)文件。

SecurityException是当你的临时访问被吊销扔。 这happend我上,我试图不正确地之前,特别当意图是在我Acticity的拿起阅读一些文件onNewIntent



Answer 3:

我只想补充从@erickok的答案,因为我花了几个小时图了这一点。 正如@jcesarmobile说,你只保证能够得到的名称和文件的大小,而不是完整路径。

你可以得到的名称和尺寸如下,然后保存到临时文件:

String filename = null;
Long filesize = null;
Cursor cursor = null;
try {
    cursor = this.getContentResolver().query(intent.getData(), new String[] {
        OpenableColumns.DISPLAY_NAME, OpenableColumns.SIZE}, null, null, null );
    if (cursor != null && cursor.moveToFirst()) {
        filename = cursor.getString(0);
        filesize = cursor.getLong(1);
    }
} finally {
    if (cursor != null)
        cursor.close();
}


文章来源: Retrieve file path from caught DownloadManager intent