您的位置:首页 > 移动开发 > Android开发

android文件下载自动安装或打开

2016-06-10 17:46 537 查看
最近做了几个项目,花点时间沉淀一下学到的知识。

多线程下载文件及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"},
{"",        "*/*"}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android ui