我的应用程序(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
答案 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;
}