android文件下载自动安装或打开
2016-06-10 17:46
537 查看
最近做了几个项目,花点时间沉淀一下学到的知识。
多线程下载文件及UI刷新
断点续传下载文件网上的文章很多,在这里就不过多叙述了,在android里面控制UI的变化就比较麻烦了,用户在按下home键离开程序,再返回来,进度条的变化或者按钮的变化等等都要做出适当的控制,在用线程下载的时候,离开程序的时候线程并不会关闭,使用多个全局静态的handler,控制多个不同线程的UI刷新,可以实现相应的效果。(当然肯定还有更好的方式)
DownloadHandler类
下载过程中发出Mesage,标记状态,下载完成时同理
下载完成自动打开或安装
文件下载完成后,会调用手机自带软件打开它或者安装它,代码如下
多线程下载文件及UI刷新
断点续传下载文件网上的文章很多,在这里就不过多叙述了,在android里面控制UI的变化就比较麻烦了,用户在按下home键离开程序,再返回来,进度条的变化或者按钮的变化等等都要做出适当的控制,在用线程下载的时候,离开程序的时候线程并不会关闭,使用多个全局静态的handler,控制多个不同线程的UI刷新,可以实现相应的效果。(当然肯定还有更好的方式)
public static SparseArray<DownloadHandler> messageArray = new SparseArray<>();
DownloadHandler类
public class DownloadHandler extends Handler { private TextView btn; private static final int FINISH = 2; private static final int DOWNLOADING = 1; private static final int OPEN = 0; public void setBtn(TextView btn) { this.btn = btn; } @Override public void handleMessage(Message msg) { super.handleMessage(msg); switch (msg.what) { case FINISH: btn.setText("打 开"); //btn.setTextColor(Color.parseColor("#E8BB5B")); break; case DOWNLOADING: btn.setText("下载中..."); btn.setClickable(false); //btn.setBackgroundColor(Color.parseColor("#969696")); break; case OPEN: break; } } }
下载过程中发出Mesage,标记状态,下载完成时同理
Message msg = new Message(); msg.arg1 = position; Constant.NOTE_DOWNLOAD = DOWNLOADING; msg.what = Constant.NOTE_DOWNLOAD; Constant.messageArray.get(position).sendMessage(msg);
下载完成自动打开或安装
文件下载完成后,会调用手机自带软件打开它或者安装它,代码如下
/** * 根据文件后缀名匹配MIMEType * @param file * @return */ public static String getMIMEType(File file) { String type ="*/*"; String name = file.getName(); int index = name.lastIndexOf('.'); if (index < 0) { return type; } String end = name.substring(index,name.length()).toLowerCase(); if (TextUtils.isEmpty(end)) return type; for (int i = 0;i < MIME_MapTable.length;i++) { if (end.equals(MIME_MapTable[i][0])) type = MIME_MapTable[i][1]; } return type; } /** * 打开文件 * @param context * @param file 文件 */ public static void openFile(Context context,File file) { Intent intent = new Intent(); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); intent.setAction(Intent.ACTION_VIEW); String type= getMIMEType(file); //设置intent的data和Type属性。 intent.setDataAndType(Uri.fromFile(file), type); context.startActivity(intent); } /** * 自动安装apk文件 * @param context * @param file */ public static void openApk(Context context,File file) { Intent intent = new Intent(Intent.ACTION_VIEW); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); intent.setDataAndType(Uri.fromFile(file), "application/vnd.android.package-archive"); context.startActivity(intent); } private static final String[][] MIME_MapTable={ {".3gp", "video/3gpp"}, {".apk", "application/vnd.android.package-archive"}, {".asf", "video/x-ms-asf"}, {".avi", "video/x-msvideo"}, {".bin", "application/octet-stream"}, {".bmp", "image/bmp"}, {".c", "text/plain"}, {".class", "application/octet-stream"}, {".conf", "text/plain"}, {".cpp", "text/plain"}, {".doc", "application/msword"}, {".docx", "application/vnd.openxmlformats-officedocument.wordprocessingml.document"}, {".xls", "application/vnd.ms-excel"}, {".xlsx", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"}, {".exe", "application/octet-stream"}, {".gif", "image/gif"}, {".gtar", "application/x-gtar"}, {".gz", "application/x-gzip"}, {".h", "text/plain"}, {".htm", "text/html"}, {".html", "text/html"}, {".jar", "application/java-archive"}, {".java", "text/plain"}, {".jpeg", "image/jpeg"}, {".jpg", "image/jpeg"}, {".js", "application/x-javascript"}, {".log", "text/plain"}, {".m3u", "audio/x-mpegurl"}, {".m4a", "audio/mp4a-latm"}, {".m4b", "audio/mp4a-latm"}, {".m4p", "audio/mp4a-latm"}, {".m4u", "video/vnd.mpegurl"}, {".m4v", "video/x-m4v"}, {".mov", "video/quicktime"}, {".mp2", "audio/x-mpeg"}, {".mp3", "audio/x-mpeg"}, {".mp4", "video/mp4"}, {".mpc", "application/vnd.mpohun.certificate"}, {".mpe", "video/mpeg"}, {".mpeg", "video/mpeg"}, {".mpg", "video/mpeg"}, {".mpg4", "video/mp4"}, {".mpga", "audio/mpeg"}, {".msg", "application/vnd.ms-outlook"}, {".ogg", "audio/ogg"}, {".pdf", "application/pdf"}, {".png", "image/png"}, {".pps", "application/vnd.ms-powerpoint"}, {".ppt", "application/vnd.ms-powerpoint"}, {".pptx", "application/vnd.openxmlformats-officedocument.presentationml.presentation"}, {".prop", "text/plain"}, {".rc", "text/plain"}, {".rmvb", "audio/x-pn-realaudio"}, {".rtf", "application/rtf"}, {".sh", "text/plain"}, {".tar", "application/x-tar"}, {".tgz", "application/x-compressed"}, {".txt", "text/plain"}, {".wav", "audio/x-wav"}, {".wma", "audio/x-ms-wma"}, {".wmv", "audio/x-ms-wmv"}, {".wps", "application/vnd.ms-works"}, {".xml", "text/plain"}, {".z", "application/x-compress"}, {".zip", "application/x-zip-compressed"}, {"", "*/*"} };
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- Android IPC进程间通讯机制
- Android Manifest 用法
- [转载]Activity中ConfigChanges属性的用法
- Android之获取手机上的图片和视频缩略图thumbnails
- Android之使用Http协议实现文件上传功能
- Android学习笔记(二九):嵌入浏览器
- android string.xml文件中的整型和string型代替
- i-jetty环境搭配与编译
- android之定时器AlarmManager
- android wifi 无线调试
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- android 代码实现控件之间的间距
- android FragmentPagerAdapter的“标准”配置
- Android"解决"onTouch和onClick的冲突问题
- android:installLocation简析
- android searchView的关闭事件
- SourceProvider.getJniDirectories