morristech
3/29/2019 - 6:49 AM

xDownloader

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);
    }


}