android移动开发-单文件下载-基于官方DownLoadManager进行

2023-11-08 10:18

本文主要是介绍android移动开发-单文件下载-基于官方DownLoadManager进行,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

代码取自Demo ,实现单文件下载并弹出打开方式,由于采用意图Intent方式,所以很多高度定制的Rom就可能进入异常了,我在后期会整合网络资源,整理出一个新的方案!

1-工具类,简单看一下 ,看懂了就好

/*** Created by Administrator on 2016/11/23.*/public class DownLoadMng {/*** 得到一个经过基本初始化的请求实例** @param url* @return*/
public static DownloadManager.Request getRequest(String url) {DownloadManager.Request request = new DownloadManager.Request(Uri.parse(url));//设置在什么网络情况下进行下载request.setAllowedNetworkTypes(DownloadManager.Request.NETWORK_WIFI);//设置通知栏标题request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE);request.setTitle("通知栏显示");request.setDescription("通知栏下拉的条目上显示");request.setAllowedOverRoaming(false);return request;
}/*** 这个好用** @param activity activity引用,用于跳intent* @param path     文件路径*/
public static void openFile2(Activity activity, String path) {File f = new File(path);Intent intent = new Intent();intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);intent.setAction(android.content.Intent.ACTION_VIEW);/* 调用getMIMEType()来取得MimeType */String type = getMIMEType(f);/* 设置intent的file与MimeType */intent.setDataAndType(Uri.fromFile(f), type);try {activity.startActivity(intent);} catch (ActivityNotFoundException e) {Toast.makeText(context, "附件无法打开,请下载相关软件!", 500).show();}
}/* 判断文件MimeType的method */
private static String getMIMEType(File f) {String type = "";String fName = f.getName();/* 取得扩展名 */String end = fName.substring(fName.lastIndexOf(".") + 1, fName.length()).toLowerCase();/* 依扩展名的类型决定MimeType */if (end.equals("m4a") || end.equals("mp3") || end.equals("mid") ||end.equals("xmf") || end.equals("ogg") || end.equals("wav")) {type = "audio";} else if (end.equals("3gp") || end.equals("mp4")) {type = "video";} else if (end.equals("jpg") || end.equals("gif") || end.equals("png") ||end.equals("jpeg") || end.equals("bmp")) {type = "image";} else if (end.equals("apk")) {/* android.permission.INSTALL_PACKAGES */type = "application/vnd.android.package-archive";} else if (end.equals("xls")) {type = "application/vnd.ms-excel";} else if (end.equals("word") || end.contains("doc")) {type = "application/msword";}/*如果无法直接打开,就跳出软件列表给用户选择 */if (end.equals("apk")) {} else {type += "/*";}return type;
}/*** 这个有隐藏bug  不用了   并且下面的方法全引用自此方法  故不用** @param filePath* @return*/
@Deprecated
public static Intent openFile(String filePath) {File file = new File(filePath);if (!file.exists()) return null;/* 取得扩展名 */String end = file.getName().substring(file.getName().lastIndexOf(".") + 1, file.getName().length()).toLowerCase();/* 依扩展名的类型决定MimeType */if (end.equals("m4a") || end.equals("mp3") || end.equals("mid") ||end.equals("xmf") || end.equals("ogg") || end.equals("wav")) {return getAudioFileIntent(filePath);} else if (end.equals("3gp") || end.equals("mp4")) {return getAudioFileIntent(filePath);} else if (end.equals("jpg") || end.equals("gif") || end.equals("png") ||end.equals("jpeg") || end.equals("bmp")) {return getImageFileIntent(filePath);} else if (end.equals("apk")) {return getApkFileIntent(filePath);} else if (end.equals("ppt")) {return getPptFileIntent(filePath);} else if (end.equals("xls")) {return getExcelFileIntent(filePath);} else if (end.equals("doc")) {return getWordFileIntent(filePath);} else if (end.equals("pdf")) {return getPdfFileIntent(filePath);} else if (end.equals("chm")) {return getChmFileIntent(filePath);} else if (end.equals("txt")) {return getTextFileIntent(filePath, false);} else {return getAllIntent(filePath);}
}//Android获取一个用于打开APK文件的intent
@Deprecated
public static Intent getAllIntent(String param) {Intent intent = new Intent();intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);intent.setAction(android.content.Intent.ACTION_VIEW);Uri uri = Uri.fromFile(new File(param));intent.setDataAndType(uri, "*/*");return intent;
}//Android获取一个用于打开APK文件的intent
public static Intent getApkFileIntent(String param) {Intent intent = new Intent();intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);intent.setAction(android.content.Intent.ACTION_VIEW);Uri uri = Uri.fromFile(new File(param));intent.setDataAndType(uri, "application/vnd.android.package-archive");return intent;
}//Android获取一个用于打开VIDEO文件的intent
public static Intent getVideoFileIntent(String param) {Intent intent = new Intent("android.intent.action.VIEW");intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);intent.putExtra("oneshot", 0);intent.putExtra("configchange", 0);Uri uri = Uri.fromFile(new File(param));intent.setDataAndType(uri, "video/*");return intent;
}//Android获取一个用于打开AUDIO文件的intent
public static Intent getAudioFileIntent(String param) {Intent intent = new Intent("android.intent.action.VIEW");intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);intent.putExtra("oneshot", 0);intent.putExtra("configchange", 0);Uri uri = Uri.fromFile(new File(param));intent.setDataAndType(uri, "audio/*");return intent;
}//Android获取一个用于打开Html文件的intent
public static Intent getHtmlFileIntent(String param) {Uri uri = Uri.parse(param).buildUpon().encodedAuthority("com.android.htmlfileprovider").scheme("content").encodedPath(param).build();Intent intent = new Intent("android.intent.action.VIEW");intent.setDataAndType(uri, "text/html");return intent;
}//Android获取一个用于打开图片文件的intent
public static Intent getImageFileIntent(String param) {Intent intent = new Intent("android.intent.action.VIEW");intent.addCategory("android.intent.category.DEFAULT");intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);Uri uri = Uri.fromFile(new File(param));intent.setDataAndType(uri, "image/*");return intent;
}//Android获取一个用于打开PPT文件的intent
public static Intent getPptFileIntent(String param) {Intent intent = new Intent("android.intent.action.VIEW");intent.addCategory("android.intent.category.DEFAULT");intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);Uri uri = Uri.fromFile(new File(param));intent.setDataAndType(uri, "application/vnd.ms-powerpoint");return intent;
}//Android获取一个用于打开Excel文件的intent
public static Intent getExcelFileIntent(String param) {Intent intent = new Intent("android.intent.action.VIEW");intent.addCategory("android.intent.category.DEFAULT");intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);Uri uri = Uri.fromFile(new File(param));intent.setDataAndType(uri, "application/vnd.ms-excel");return intent;
}//Android获取一个用于打开Word文件的intent
public static Intent getWordFileIntent(String param) {Intent intent = new Intent("android.intent.action.VIEW");intent.addCategory("android.intent.category.DEFAULT");intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);Uri uri = Uri.fromFile(new File(param));intent.setDataAndType(uri, "application/msword");return intent;
}//Android获取一个用于打开CHM文件的intent
public static Intent getChmFileIntent(String param) {Intent intent = new Intent("android.intent.action.VIEW");intent.addCategory("android.intent.category.DEFAULT");intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);Uri uri = Uri.fromFile(new File(param));intent.setDataAndType(uri, "application/x-chm");return intent;
}//Android获取一个用于打开文本文件的intent
public static Intent getTextFileIntent(String param, boolean paramBoolean) {Intent intent = new Intent("android.intent.action.VIEW");intent.addCategory("android.intent.category.DEFAULT");intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);if (paramBoolean) {Uri uri1 = Uri.parse(param);intent.setDataAndType(uri1, "text/plain");} else {Uri uri2 = Uri.fromFile(new File(param));intent.setDataAndType(uri2, "text/plain");}return intent;
}//Android获取一个用于打开PDF文件的intent
public static Intent getPdfFileIntent(String param) {Intent intent = new Intent("android.intent.action.VIEW");intent.addCategory("android.intent.category.DEFAULT");intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);Uri uri = Uri.fromFile(new File(param));intent.setDataAndType(uri, "application/pdf");return intent;
}
}

2、开始下载

        private void downLoad(){
DownloadManager.Request request = DownLoadMng.getRequest(url);//设置文件存放目录path = "/yangguang";//Environment.getExternalStorageDirectory().getAbsolutePath()isFolderExist(path);//文件夹判空filename = accessmodel.getData().getFile_list().get(position).getTitle();request.setDestinationInExternalPublicDir(path, filename);absolutePath = path + "/" + filename;downManager = (DownloadManager) getActivity().getSystemService(Context.DOWNLOAD_SERVICE);id = downManager.enqueue(request);getActivity().registerReceiver(receiver, new IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE));// 监听下载状态}private BroadcastReceiver receiver = new BroadcastReceiver() {@Overridepublic void onReceive(Context context, Intent intent) {//这里可以取得下载的id,这样就可以知道哪个文件下载完成了。适用与多个下载任务的监听Log.v("intent", "" + intent.getLongExtra(DownloadManager.EXTRA_DOWNLOAD_ID, 0));queryDownloadStatus();}
};private void queryDownloadStatus() {DownloadManager.Query query = new DownloadManager.Query();query.setFilterById(id);Cursor c = downManager.query(query);if (c.moveToFirst()) {int status = c.getInt(c.getColumnIndex(DownloadManager.COLUMN_STATUS));switch (status) {case DownloadManager.STATUS_PAUSED:Log.v("debug", "STATUS_PAUSED");case DownloadManager.STATUS_PENDING:Log.v("debug", "STATUS_PENDING");case DownloadManager.STATUS_RUNNING://正在下载,不做任何事情Log.v("debug", "下载中");break;case DownloadManager.STATUS_SUCCESSFUL://完成showToast("下载完成");try {DownLoadMng.openFile2(getActivity(), absolutePath);} catch (Exception e) {e.printStackTrace();DebugLogUtil.getInstance().Error("打开失败~" + e);}break;case DownloadManager.STATUS_FAILED://清除已下载的内容,重新下载showToast("下载失败");
//                    Log.v("debug", "STATUS_FAILED");
//                    downManager.remove(id);
//                    id.edit().clear().commit();break;}}
}

这篇关于android移动开发-单文件下载-基于官方DownLoadManager进行的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/369164

相关文章

Android Mainline基础简介

《AndroidMainline基础简介》AndroidMainline是通过模块化更新Android核心组件的框架,可能提高安全性,本文给大家介绍AndroidMainline基础简介,感兴趣的朋... 目录关键要点什么是 android Mainline?Android Mainline 的工作原理关键

QT进行CSV文件初始化与读写操作

《QT进行CSV文件初始化与读写操作》这篇文章主要为大家详细介绍了在QT环境中如何进行CSV文件的初始化、写入和读取操作,本文为大家整理了相关的操作的多种方法,希望对大家有所帮助... 目录前言一、CSV文件初始化二、CSV写入三、CSV读取四、QT 逐行读取csv文件五、Qt如何将数据保存成CSV文件前言

如何解决idea的Module:‘:app‘platform‘android-32‘not found.问题

《如何解决idea的Module:‘:app‘platform‘android-32‘notfound.问题》:本文主要介绍如何解决idea的Module:‘:app‘platform‘andr... 目录idea的Module:‘:app‘pwww.chinasem.cnlatform‘android-32

使用Python开发一个带EPUB转换功能的Markdown编辑器

《使用Python开发一个带EPUB转换功能的Markdown编辑器》Markdown因其简单易用和强大的格式支持,成为了写作者、开发者及内容创作者的首选格式,本文将通过Python开发一个Markd... 目录应用概览代码结构与核心组件1. 初始化与布局 (__init__)2. 工具栏 (setup_t

前端下载文件时如何后端返回的文件流一些常见方法

《前端下载文件时如何后端返回的文件流一些常见方法》:本文主要介绍前端下载文件时如何后端返回的文件流一些常见方法,包括使用Blob和URL.createObjectURL创建下载链接,以及处理带有C... 目录1. 使用 Blob 和 URL.createObjectURL 创建下载链接例子:使用 Blob

通过Spring层面进行事务回滚的实现

《通过Spring层面进行事务回滚的实现》本文主要介绍了通过Spring层面进行事务回滚的实现,包括声明式事务和编程式事务,具有一定的参考价值,感兴趣的可以了解一下... 目录声明式事务回滚:1. 基础注解配置2. 指定回滚异常类型3. ​不回滚特殊场景编程式事务回滚:1. ​使用 TransactionT

Android实现打开本地pdf文件的两种方式

《Android实现打开本地pdf文件的两种方式》在现代应用中,PDF格式因其跨平台、稳定性好、展示内容一致等特点,在Android平台上,如何高效地打开本地PDF文件,不仅关系到用户体验,也直接影响... 目录一、项目概述二、相关知识2.1 PDF文件基本概述2.2 android 文件访问与存储权限2.

Spring Shell 命令行实现交互式Shell应用开发

《SpringShell命令行实现交互式Shell应用开发》本文主要介绍了SpringShell命令行实现交互式Shell应用开发,能够帮助开发者快速构建功能丰富的命令行应用程序,具有一定的参考价... 目录引言一、Spring Shell概述二、创建命令类三、命令参数处理四、命令分组与帮助系统五、自定义S

Android Studio 配置国内镜像源的实现步骤

《AndroidStudio配置国内镜像源的实现步骤》本文主要介绍了AndroidStudio配置国内镜像源的实现步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,... 目录一、修改 hosts,解决 SDK 下载失败的问题二、修改 gradle 地址,解决 gradle

Java中使用Hutool进行AES加密解密的方法举例

《Java中使用Hutool进行AES加密解密的方法举例》AES是一种对称加密,所谓对称加密就是加密与解密使用的秘钥是一个,下面:本文主要介绍Java中使用Hutool进行AES加密解密的相关资料... 目录前言一、Hutool简介与引入1.1 Hutool简介1.2 引入Hutool二、AES加密解密基础