- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
通过 DownloadManager API 成功下载后,我面临打开下载文件的问题。在我的代码中:
Uri uri=Uri.parse("http://www.nasa.gov/images/content/206402main_jsc2007e113280_hires.jpg");
Environment
.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS)
.mkdirs();
lastDownload = mgr.enqueue(new DownloadManager.Request(uri)
.setAllowedNetworkTypes(DownloadManager.Request.NETWORK_WIFI |
DownloadManager.Request.NETWORK_MOBILE)
.setAllowedOverRoaming(false)
.setTitle("app update")
.setDescription("New version 1.1")
.setShowRunningNotification(true)
.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, "a.apk"));
Cursor c=mgr.query(new DownloadManager.Query().setFilterById(lastDownload));
if(c.getInt(c.getColumnIndex(DownloadManager.COLUMN_STATUS)) == 8) {
try {
mgr.openDownloadedFile(c.getLong(c.getColumnIndex(DownloadManager.COLUMN_ID)));
} catch (NumberFormatException e) {
// TODO Auto-generated catch block
e.printStackTrace();
Log.d("MGR", "Error");
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
Log.d("MGR", "Error");
}
}
问题是何时触发 if(c.getInt(c.getColumnIndex(DownloadManager.COLUMN_STATUS))==8)
。我得到了状态 -1 和一个异常(exception)。有没有更好的方法,如何使用 DownloadManager API
打开下载的文件?在我的示例中,我正在下载一个大图像,在实际情况下,我将下载一个 APK
文件,并且我需要在 udpate 之后立即显示一个安装对话框。
编辑:我发现 status=8 是在成功下载之后。您可能有不同的“检查成功下载”方法
谢谢
最佳答案
问题
Android DownloadManager API - 下载后打开文件?
解决方案
/**
* Used to download the file from url.
* <p/>
* 1. Download the file using Download Manager.
*
* @param url Url.
* @param fileName File Name.
*/
public void downloadFile(final Activity activity, final String url, final String fileName) {
try {
if (url != null && !url.isEmpty()) {
Uri uri = Uri.parse(url);
activity.registerReceiver(attachmentDownloadCompleteReceive, new IntentFilter(
DownloadManager.ACTION_DOWNLOAD_COMPLETE));
DownloadManager.Request request = new DownloadManager.Request(uri);
request.setMimeType(getMimeType(uri.toString()));
request.setTitle(fileName);
request.setDescription("Downloading attachment..");
request.allowScanningByMediaScanner();
request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);
request.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, fileName);
DownloadManager dm = (DownloadManager) activity.getSystemService(Context.DOWNLOAD_SERVICE);
dm.enqueue(request);
}
} catch (IllegalStateException e) {
Toast.makeText(activity, "Please insert an SD card to download file", Toast.LENGTH_SHORT).show();
}
}
/**
* Used to get MimeType from url.
*
* @param url Url.
* @return Mime Type for the given url.
*/
private String getMimeType(String url) {
String type = null;
String extension = MimeTypeMap.getFileExtensionFromUrl(url);
if (extension != null) {
MimeTypeMap mime = MimeTypeMap.getSingleton();
type = mime.getMimeTypeFromExtension(extension);
}
return type;
}
/**
* Attachment download complete receiver.
* <p/>
* 1. Receiver gets called once attachment download completed.
* 2. Open the downloaded file.
*/
BroadcastReceiver attachmentDownloadCompleteReceive = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if (DownloadManager.ACTION_DOWNLOAD_COMPLETE.equals(action)) {
long downloadId = intent.getLongExtra(
DownloadManager.EXTRA_DOWNLOAD_ID, 0);
openDownloadedAttachment(context, downloadId);
}
}
};
/**
* Used to open the downloaded attachment.
*
* @param context Content.
* @param downloadId Id of the downloaded file to open.
*/
private void openDownloadedAttachment(final Context context, final long downloadId) {
DownloadManager downloadManager = (DownloadManager) context.getSystemService(Context.DOWNLOAD_SERVICE);
DownloadManager.Query query = new DownloadManager.Query();
query.setFilterById(downloadId);
Cursor cursor = downloadManager.query(query);
if (cursor.moveToFirst()) {
int downloadStatus = cursor.getInt(cursor.getColumnIndex(DownloadManager.COLUMN_STATUS));
String downloadLocalUri = cursor.getString(cursor.getColumnIndex(DownloadManager.COLUMN_LOCAL_URI));
String downloadMimeType = cursor.getString(cursor.getColumnIndex(DownloadManager.COLUMN_MEDIA_TYPE));
if ((downloadStatus == DownloadManager.STATUS_SUCCESSFUL) && downloadLocalUri != null) {
openDownloadedAttachment(context, Uri.parse(downloadLocalUri), downloadMimeType);
}
}
cursor.close();
}
/**
* Used to open the downloaded attachment.
* <p/>
* 1. Fire intent to open download file using external application.
*
* 2. Note:
* 2.a. We can't share fileUri directly to other application (because we will get FileUriExposedException from Android7.0).
* 2.b. Hence we can only share content uri with other application.
* 2.c. We must have declared FileProvider in manifest.
* 2.c. Refer - https://developer.android.com/reference/android/support/v4/content/FileProvider.html
*
* @param context Context.
* @param attachmentUri Uri of the downloaded attachment to be opened.
* @param attachmentMimeType MimeType of the downloaded attachment.
*/
private void openDownloadedAttachment(final Context context, Uri attachmentUri, final String attachmentMimeType) {
if(attachmentUri!=null) {
// Get Content Uri.
if (ContentResolver.SCHEME_FILE.equals(attachmentUri.getScheme())) {
// FileUri - Convert it to contentUri.
File file = new File(attachmentUri.getPath());
attachmentUri = FileProvider.getUriForFile(activity, "com.freshdesk.helpdesk.provider", file);;
}
Intent openAttachmentIntent = new Intent(Intent.ACTION_VIEW);
openAttachmentIntent.setDataAndType(attachmentUri, attachmentMimeType);
openAttachmentIntent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
try {
context.startActivity(openAttachmentIntent);
} catch (ActivityNotFoundException e) {
Toast.makeText(context, context.getString(R.string.unable_to_open_file), Toast.LENGTH_LONG).show();
}
}
}
初始化 FileProvider 详细信息
在 AndroidManifest 中清除 FileProvider
<provider
android:name="android.support.v4.content.FileProvider"
android:authorities="com.freshdesk.helpdesk.provider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_path"/>
</provider>
添加以下文件“res -> xml -> file_path.xml”
<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
<external-path name="attachment_file" path="."/>
</paths>
注意
为什么使用 FileProvider
使用“DownloadManager.getUriForDownloadedFile(long id)”的问题
引用
关于Android DownloadManager API - 下载后打开文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7239996/
我有一个使用 DownloadManager 下载多个文件的应用程序.在 SD 卡上安装应用程序会导致广播接收器接收到带有 DownloadManager.ERROR_FILE_ERROR 的 Int
我遇到了 DownloadManager 的奇怪问题, 下载成功但文件未存储。 所以这是我的代码: try { DownloadManager manager = (DownloadManag
我的下载管理器未在状态栏中显示通知图标。当您打开所有通知时,通知是他们的,但状态栏中没有图标,因此人们无法一眼看出下载已经开始。这在旧设备上不是问题,并且仅在运行 android 9 pie 的 an
有人提出了一些类似的问题,但我的有点不同,我有以下代码在我的应用程序上进行下载: DownloadManager.Request request = new DownloadManager.Requ
我想从我的服务器下载 *.apk 文件,服务器上的文件类型是 *.apk 并且 MIME 是 application/vnd.android.package-archive",当使用 Download
我需要中止所有失败/暂停/挂起/正在运行的下载,但保留成功的下载。我认为这是通过 DownloadManager 查询完成的,但我不知道如何编写代码。请帮忙。 最佳答案 我们应该调用 setFilte
我在使用 Android 的 DownloadManager 和 WebView 时遇到问题。有几个链接可以返回为当前用户生成的文件(PDF 等)。这些链接仅适用于登录用户,因此我将身份验证 cook
我想创建一个自定义 DownloadManager 类,我想在其中修改类在下载和其他内容期间发送的通知。有可能这样做还是我疯了?我的主要动机是在关闭应用程序时显示我的自定义下载通知。目前我正在使用禁用
我刚开始在 android 中使用 downloadmanager。我正在使用 genymotion 模拟器。 我正在尝试使用 downloadmanager 下载 mp3 文件。我想知道下载后文件存
我有下载多个图像和视频的要求,并且要求需要“一次”下载,因此实际上不需要任何缓存,这就是我不使用 Volley 的原因。视频 Volley 可能很昂贵。 接下来,我偶然发现了内置 Android 的
我正在使用 downloadManager,但它没有下载任何内容。当我开始下载文件时,它被放置在队列列表中并且永远不会开始下载。这是我的代码: webView.setDownloadListener(
我有一个 DownloadManager 来下载视频,以便我可以使用播放器播放。但是当我开始下载的时候,它生成了未完成的.mp4文件,所以当我在下载完成之前尝试播放时,会显示错误,是否可以在下载完成之
我在尝试处理下载的 .mp3 文件的通知点击事件时遇到问题。我已经注册了以下内容: DownloadManager.ACTION_NOTIFICATION_CLICKED - 我仅在单击当前正在下
我遇到以下问题:每当我使用 DownloadManager 下载文件时,它都会被下载两次(以“filename.extension”和“filename-1.extension”的形式保存)。这是我的
假设我要下载这个文件(随机文件): http://www.analysis.im/uploads/seminar/pdf-sample.pdf 这是我的代码: DownloadManager.Requ
我在我的应用程序中使用 DownloadManager 从 Internet 下载文件。这是我的代码。 DownloadManager downloadManager = (DownloadManag
我正在使用下载管理器 从我的服务器下载图像。 它可以很好地下载文件并将其放在我想要的位置。但出于某种原因,通知一直存在,我似乎无法删除它。下载管理器的代码如下: mDownloadManager =
每当我尝试通过下面的代码下载任何文件时 dm = (DownloadManager) context.getSystemService(context.DOWNLOAD_SERVICE); reque
我想得到这样的一些: 但我不知道如何获得百分比。 我读过这篇文章: Post 1 Post 2 Other web 但是我还没有得到什么好的结果=( ¿有什么想法吗? 我可以获得文件的总大小和下载的字
在我的 Android 应用程序中,我使用系统下载管理器下载照片,收到照片后我会处理它,然后我需要将它移动到另一个位置。如果我只是复制它,它工作正常,如果我尝试移动它/删除它,我会得到一个关于它无法移
我是一名优秀的程序员,十分优秀!