xDownloader
package com.houfukude.support.utils;
import android.webkit.MimeTypeMap;
import java.util.HashMap;
/**
* Created by houfukude on 16-2-24.
*/
public class MimeType {
private static HashMap<String, String> sMimeTypeMap = new HashMap<>();
static void add(String extension, String mimeType) {
sMimeTypeMap.put(extension, mimeType);
}
static {
add("MP3", "audio/mpeg");
add("M4A", "audio/mp4");
add("WAV", "audio/x-wav");
add("AMR", "audio/amr");
add("AWB", "audio/amr-wb");
add("WMA", "audio/x-ms-wma");
add("OGG", "audio/ogg");
add("MID", "audio/midi");
add("XMF", "audio/midi");
add("RTTTL", "audio/midi");
add("SMF", "audio/sp-midi");
add("IMY", "audio/imelody");
add("MP4", "video/mp4");
add("M4V", "video/mp4");
add("3GP", "video/3gpp");
add("3GPP", "video/3gpp");
add("3G2", "video/3gpp2");
add("3GPP2", "video/3gpp2");
add("WMV", "video/x-ms-wmv");
add("JPG", "image/jpeg");
add("JPEG", "image/jpeg");
add("GIF", "image/gif");
add("PNG", "image/png");
add("BMP", "image/x-ms-bmp");
add("WBMP", "image/vnd.wap.wbmp");
add("M3U", "audio/x-mpegurl");
add("PLS", "audio/x-scpls");
add("XML", "application/xml");
//add("WPL", "application/vnd.ms-wpl");
add("APK", "application/vnd.android.package-archive");
}
private static String getMimeTypeByExtension(String path) {
int lastDot = path.lastIndexOf(".");
if (lastDot < 0)
return null;
String ext = path.substring(lastDot + 1).toUpperCase();
return sMimeTypeMap.get(ext);
}
/**
* 通过文件路径获得文件的MIME类型
*
* @param path 真实文件位置
* @return 文件的MIME类型
*/
public static String getMimeType(String path) {
if (path == null) {
return null;
}
String extension = MimeTypeMap.getFileExtensionFromUrl(path);
MimeTypeMap mime = MimeTypeMap.getSingleton();
String type = mime.getMimeTypeFromExtension(extension);
if (type == null) {
return getMimeTypeByExtension(path);
}
return type;
}
}
package com.houfukude.support.utils;
import android.app.DownloadManager;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.net.Uri;
import com.houfukude.support.xENV;
import org.xutils.common.util.LogUtil;
import org.xutils.x;
import java.io.File;
import java.io.FileNotFoundException;
/**
* 统一的调用系统DownloadManager方法
* Created by houfukude on 16-2-24.
*/
public class xDownload {
private static DownloadManager downloadManager = (DownloadManager) x.app().getSystemService(Context.DOWNLOAD_SERVICE);
/**
* 通过下载地址,获取DownloadManager.Request
*
* @param url 下载地址
* @return Request
*/
public static DownloadManager.Request getRequest(String url) {
LogUtil.d(url);
//生成本地文件位置
String path = xENV.createLocalPath(url);
//获取MimeType
String mimeType = MimeType.getMimeType(path);
//创建下载请求
DownloadManager.Request request = new DownloadManager.Request(Uri.parse(url));
/**
* 设置文件的MimeType
*/
request.setMimeType(mimeType);
/**
* 设置默认下载位置
*/
request.setDestinationUri(Uri.fromFile(new File(path)));
/**
* 默认通知栏不显示
* 需要 <uses-permission android:name="android.permission.DOWNLOAD_WITHOUT_NOTIFICATION" />
*/
request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_HIDDEN);
/**
* 设置系统下载管理界面不显示
*/
request.setVisibleInDownloadsUi(false);
return request;
}
/**
* 调用DownloadManager进行文件下载
*
* @param request 下载请求参数
* @param callback 回调方法 查看 {@link DownloadCallback}
* @return 下载对象ID
*/
public static long start(DownloadManager.Request request, DownloadCallback callback) {
//加入下载队列
long downloadId = downloadManager.enqueue(request);
//创建对应的广播监听
CompleteReceiver completeReceiver = new CompleteReceiver(downloadId, callback);
//注册广播监听
x.app().registerReceiver(completeReceiver, new IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE));
//返回下载ID
return downloadId;
}
/**
* 通过IDs 删除下载内容
*
* @param ids 下载ID
* @return the number of downloads actually removed
*/
public static int remove(long... ids) {
return downloadManager.remove(ids);
}
/**
* 下载完成的广播接收器
*/
static class CompleteReceiver extends BroadcastReceiver {
private long downloadId;
private DownloadCallback callback;
/**
* @param downloadId 下载ID
* @param callback 回调方法 查看 {@link DownloadCallback}
*/
public CompleteReceiver(long downloadId, DownloadCallback callback) {
this.downloadId = downloadId;
this.callback = callback;
}
@Override
public void onReceive(Context context, Intent intent) {
/**
* get the id of download which have download success, if the id is my id and it's status is successful,
* then do callback success
**/
long completeDownloadId = intent.getLongExtra(DownloadManager.EXTRA_DOWNLOAD_ID, -1);
if (completeDownloadId == downloadId) {
Uri uri = downloadManager.getUriForDownloadedFile(completeDownloadId);
if (uri != null) {
String path = uri.getPath();
LogUtil.d(path);
File file = new File(path);
if (file.exists()) {
callback.onSuccess(file);
} else {
callback.onError(new FileNotFoundException(uri.getPath()));
}
} else {
callback.onError(new FileNotFoundException("URI IS NULL"));
}
/**
* 注销监听
*/
x.app().unregisterReceiver(this);
}
}
}
public interface DownloadCallback {
void onSuccess(File file);
void onError(FileNotFoundException e);
}
}