Android 6获取下载文件

时间:2015-10-24 07:55:09

标签: android-download-manager android-6.0-marshmallow

我的应用程序(Xamarin C#)我们从服务器下载文件。在成功下载结束时,我们获取新下载文件的URI,并从URI获取文件路径:

Android.Net.Uri uri = downloadManager.GetUriForDownloadedFile(entry.Value);
path = u.EncodedPath;

在Android 4.4.2和Android 5中, uri 路径如下所示:

uri="file:///storage/emulated/0/Download/2.zip"
path = u.EncodedPath ="/storage/emulated/0/Download/2.zip"

然后我们使用路径来处理该文件。 问题是在Android 6(在真正的Nexus手机上)我们得到了完全不同的 uri 路径

uri="content://downloads/my_downloads/2802"
path="/my_downloads/2802"

这会通过抛出FileNotFound异常来破坏我的代码。请注意,下载的文件存在并位于“下载”文件夹中。 如何使用我从Android 6获得的URI来获取正确的文件路径,以便我可以访问该文件并进行处理?

谢谢你, donescamillo@gmail.com

3 个答案:

答案 0 :(得分:1)

我没有得到您的实际要求,但看起来您想要处理文件内容。如果是这样,可以通过使用下载文件的文件描述符读取文件内容来完成。代码段为

    ParcelFileDescriptor parcelFd = null;
    try {
        parcelFd = mDownloadManager.openDownloadedFile(downloadId);
        FileInputStream fileInputStream = new FileInputStream(parcelFd.getFileDescriptor());
    } catch (FileNotFoundException e) {
        Log.w(TAG, "Error in opening file: " + e.getMessage(), e);
    } finally {
        if(parcelFd != null) {
            try {
                parcelFd.close();
            } catch (IOException e) {
            }
        }
    }

但我也希望在处理后移动或删除该文件。

答案 1 :(得分:0)

您是否可以使用下载文件夹构建URI:     Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS).toURI();

答案 2 :(得分:0)

它的工作。 @ 2016年6月24日

@Override
public void onReceive(Context context, Intent intent) {

    String action = intent.getAction();
    if(DownloadManager.ACTION_DOWNLOAD_COMPLETE.equals( action)) {
        DownloadManager downloadManager = (DownloadManager)context.getSystemService(Context.DOWNLOAD_SERVICE);
        long downloadId = intent.getLongExtra(DownloadManager.EXTRA_DOWNLOAD_ID, 0);
        DownloadManager.Query query = new DownloadManager.Query();
        query.setFilterById(downloadId);
        Cursor c = downloadManager.query(query);
        if(c != null) {
            if (c.moveToFirst()) {
                int columnIndex = c.getColumnIndex(DownloadManager.COLUMN_STATUS);
                if (DownloadManager.STATUS_SUCCESSFUL == c.getInt(columnIndex)) {
                    String downloadFileUrl = c.getString(c.getColumnIndex(DownloadManager.COLUMN_LOCAL_URI));
                    startInstall(context, Uri.parse(downloadFileUrl));
                }
            }
            c.close();
        }
    }
}




private boolean startInstall(Context context, Uri uri) {
    if(!new File( uri.getPath()).exists()) {
        System.out.println( " local file has been deleted! ");
        return false;
    }
    Intent intent = new Intent();
    intent.addFlags( Intent.FLAG_ACTIVITY_NEW_TASK);
    intent.setAction( Intent.ACTION_VIEW);
    intent.setDataAndType( uri, "application/vnd.android.package-archive");
    context.startActivity( intent);
    return true;
}