今天写了一个文件下载的实用类,实现了文件下载、打开安装或者显示。。。。
APP界面图:
下载中的效果图:
MainActivity中的按钮事件代码:
downmanager = (Button)findViewById(R.id.downManager);
downmanager.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
downManagerEx.doDown("http://sqdd.myapp.com/myapp/qqteam/AndroidQQ/mobileqq_android.apk"
,"QQ V6.3.7","QQ轻聊版",downManagerEx.NETWORK_MOBILE|downManagerEx.NETWORK_WIFI,false);
}
});
申请的权限有2个:
<uses-permission android:name="android.permission.INTERNET"></uses-permission> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>
主要是上网权限跟写入内存卡的权限。
DownManagerEx 类的源代码:
package com.lanxin.servicetest;
import android.app.DownloadManager;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.SharedPreferences;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.preference.PreferenceManager;
import android.util.Log;
import android.widget.Toast;
import java.io.File;
/**
* Created by Alan on 2016/5/29 0029.
*/
public class DownManagerEx {
private static final String TAG = "DownManagerEx";
private static final String DownLoadId = "DownLoadId";
private DownloadManager dmgr = null;
private DownloadManager.Request dmgreqs = null;
private IntentFilter intentFilter;
private Context mContext;
private SharedPreferences sp;
private long downLoadId = -1;
//下载完毕后是否自动安装程序
private boolean isAutoOpen = false;
public int NETWORK_MOBILE = DownloadManager.Request.NETWORK_MOBILE;
public int NETWORK_WIFI = DownloadManager.Request.NETWORK_WIFI;
//初始化的时候传入了一个上下文
public DownManagerEx(Context ctx){
mContext = ctx;
}
/**
* 文件下载任务
* @param url 下载文件的地址
* @param tilte bar提示标题
* @param des bar提示备注
* @param netWorkType 网络类型:DownloadManager.Request.NETWORK_MOBILE OR DownloadManager.Request.NETWORK_WIFI
* @return
*/
public Long doDown(String url,String tilte,String des,int netWorkType,boolean isopen){
isAutoOpen = isopen;//传入是否自动安装、打开文件
if(!sp.contains(DownLoadId)){//为了避免重复下载,这里加了个判断,用来判断文件是否已经在下载中
String endname = url.substring(url.lastIndexOf("/")).toLowerCase();//获取文件的后缀名,然后通过后缀名返回文件类型信息
dmgreqs = new DownloadManager.Request(Uri.parse(url));
dmgreqs.setTitle(tilte);
dmgreqs.setDescription(des);
dmgreqs.setAllowedNetworkTypes(netWorkType);
dmgreqs.setAllowedOverRoaming(false);
dmgreqs.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);
dmgreqs.setMimeType(getEndsWithType(endname));//设置文件头类型
dmgreqs.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, endname);//设置下载的目录,这里是下载到内存卡的dowload目录下
dmgreqs.allowScanningByMediaScanner();
dmgreqs.setVisibleInDownloadsUi(true);//设置为可见可管理
intentFilter = new IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE);
mContext.registerReceiver(receiver,intentFilter);
downLoadId = dmgr.enqueue(dmgreqs);
sp.edit().putLong(DownLoadId,downLoadId).commit(); //保存当前下载的ID
Log.i(TAG,""+downLoadId);
}else{
QueryDownStatus();
}
return downLoadId;
}
/**
* 广播接收器
*/
public BroadcastReceiver receiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
Bundle bundle = intent.getExtras();
long doId = bundle.getLong(DownloadManager.EXTRA_DOWNLOAD_ID);
Log.i(TAG,"下载完毕");
if(downLoadId == doId){
try {
//获取URI
Uri uri = dmgr.getUriForDownloadedFile(downLoadId);
Log.i(TAG, uri.getEncodedPath());
//打开文件
openFile(new File(uri.getEncodedPath()));
sp.edit().clear().commit();//下载完成后,我们要清除任务ID
} catch (Exception e) {
e.printStackTrace();
}
}
}
};
/**
* Activity在onResume激活此事件
*/
public void downResume(){
dmgr = (DownloadManager)mContext.getSystemService(mContext.DOWNLOAD_SERVICE);
sp = PreferenceManager.getDefaultSharedPreferences(mContext);
}
/**
* Activity在onPause的时候激活此事件
*/
public void downPause(){
if(dmgreqs != null){
mContext.unregisterReceiver(receiver);
dmgr = null;
}
}
/**
* 为了避免重复下载,做了个状态查询
*/
public void QueryDownStatus(){
DownloadManager.Query dmQ = new DownloadManager.Query();
long _id = sp.getLong(DownLoadId, 0);
dmQ.setFilterById(_id);
Cursor c = dmgr.query(dmQ);
if(c.moveToNext()){
int s = c.getInt(c.getColumnIndex(DownloadManager.COLUMN_STATUS));
switch (s){
case DownloadManager.STATUS_PAUSED:
case DownloadManager.STATUS_RUNNING:
case DownloadManager.STATUS_PENDING:
Log.i(TAG,"下载中...");
Toast.makeText(mContext,"文件下载中...",Toast.LENGTH_LONG).show();
break;
case DownloadManager.STATUS_SUCCESSFUL:
//下载完成
Uri uri = dmgr.getUriForDownloadedFile(_id);
Log.i(TAG,uri.getEncodedPath());
isAutoOpen = true;
openFile(new File(uri.getEncodedPath()));
sp.edit().clear().commit();
break;
case DownloadManager.STATUS_FAILED:
//死掉
dmgr.remove(_id);
sp.edit().clear().commit();
break;
}
}
}
/**
* 打开文件
* @param file
*/
public void openFile(File file){
if(!isAutoOpen){
return;
}
Intent intent = new Intent();
String fileName = file.getAbsolutePath();
if(fileName.endsWith(".png") || fileName.endsWith(".jpg") || fileName.endsWith(".jpeg") || fileName.endsWith(".gif")){
intent.setAction(android.content.Intent.ACTION_VIEW);
intent.setDataAndType(Uri.fromFile(file), "image/*");
mContext.startActivity(intent);
}else if(fileName.endsWith(".mp4")
|| fileName.endsWith(".3gp")
|| fileName.endsWith(".avi")
|| fileName.endsWith(".flv")
|| fileName.endsWith(".wmv")
|| fileName.endsWith(".rmvb")
|| fileName.endsWith(".asf")
|| fileName.endsWith(".mkv")
|| fileName.endsWith(".mpg")){
intent.setAction(android.content.Intent.ACTION_VIEW);
intent.setDataAndType(Uri.fromFile(file), "video/*");
mContext.startActivity(intent);
}else if(fileName.endsWith(".mp3")
|| fileName.endsWith(".ogg")
|| fileName.endsWith(".ape")){
intent.setAction(android.content.Intent.ACTION_VIEW);
intent.setDataAndType(Uri.fromFile(file), "audio/*");
mContext.startActivity(intent);
}else if(fileName.endsWith(".apk")){
intent.setAction("android.intent.action.VIEW");
intent.addCategory("android.intent.category.DEFAULT");
intent.setDataAndType(Uri.fromFile(file), "application/vnd.android.package-archive");
mContext.startActivity(intent);
}
}
/**
* 返回文件类型
* @param filePath 文件的路径比如:http://192.168.1.107/1.mp3
* @return
*/
public String getEndsWithType(String filePath){
if(filePath.endsWith(".apk")){
return "application/vnd.android.package-archive";
}else if(filePath.endsWith(".png") || filePath.endsWith(".jpg") || filePath.endsWith(".jpeg") || filePath.endsWith(".gif")){
return "image/*";
}else if(filePath.endsWith(".mp4")
|| filePath.endsWith(".3gp")
|| filePath.endsWith(".avi")
|| filePath.endsWith(".flv")
|| filePath.endsWith(".wmv")
|| filePath.endsWith(".rmvb")
|| filePath.endsWith(".asf")
|| filePath.endsWith(".mkv")
|| filePath.endsWith(".mpg")){
return "video/*";
}else if(filePath.endsWith(".mp3")
|| filePath.endsWith(".ogg")
|| filePath.endsWith(".ape")){
return "audio/*";
}
return "";
}
}
源代码下载链接:http://pan.baidu.com/s/1i54OkKX 密码:beuv



