使用系统下载管理类DownloadManager

import java.io.File;
import java.util.HashMap;


import android.annotation.TargetApi;
import android.app.DownloadManager;
import android.app.DownloadManager.Query;
import android.app.DownloadManager.Request;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.database.Cursor;
import android.net.Uri;
import android.os.Build;
import android.text.TextUtils;
import android.webkit.MimeTypeMap;
import android.widget.Toast;

/**
 * @Description: 调用系统下载管理类(api>=9)
 * @time: 2014-4-25 下午5:16:17
 * @version: 1.0
 */
public class DownloadManagerCtrl {

    private static DownloadManagerCtrl mInstance;

    private DownloadManager dm;

    private Context mContext;

    private DownloadReceiver mReceiver;

    private HashMap<String, Long> downloadQueues = new HashMap<String, Long>();

    private DownloadManagerCtrl(Context context) {
        mContext = context;
        mReceiver = new DownloadReceiver();
        dm = (DownloadManager)context.getSystemService( Context.DOWNLOAD_SERVICE);
    }

    public static synchronized DownloadManagerCtrl getInstance(Context context) {
        if(null == mInstance) {
            mInstance = new DownloadManagerCtrl( context);
        }
        return mInstance;
    }

    @TargetApi(Build.VERSION_CODES.HONEYCOMB)
    private void addToDownload(String url) {
        Uri uri = Uri.parse( url);
        Request request = new Request( uri);
        // 设置可下载网络类型
        request.setAllowedNetworkTypes( Request.NETWORK_MOBILE | Request.NETWORK_WIFI);
        // 不允许漫游
        request.setAllowedOverRoaming( false);
        // 设置文件类型
        MimeTypeMap mimeTypeMap = MimeTypeMap.getSingleton();
        String mimeString = mimeTypeMap.getMimeTypeFromExtension( MimeTypeMap.getFileExtensionFromUrl( url));
        request.setMimeType( mimeString);
        // 在通知栏中显示
        request.setVisibleInDownloadsUi( true);
        request.setDescription( mContext.getResources().getString( R.string.app_download_description));
        if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
            request.setNotificationVisibility( Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);
        }
        else {   
            request.setShowRunningNotification( true);
        }
        // 下载路径
        String fileName = url.substring( url.lastIndexOf( '/') + 1);
        int i = fileName.indexOf( '?');
        if(i != -1) {
            fileName = fileName.substring( 0, i);
        }
        String dirType = FileUtil.getDownlaodPath( mContext);
        request.setDestinationInExternalPublicDir( dirType, fileName);
        long downloadId = dm.enqueue( request);// 加入下载队列
        downloadQueues.put( url, downloadId);
    }

    public DownloadReceiver getReceiver() {
        return mReceiver;
    }

    public void startDownload(String url) {
        if(TextUtils.isEmpty( url)) {
            return;
        }
        Long downloadId = downloadQueues.get( url);
        if(null == downloadId) {
            addToDownload( url);
        }
        else {
            checkDownloadStatus( downloadId.longValue(), url);
        }
    }

    @TargetApi(Build.VERSION_CODES.HONEYCOMB)
    private void checkDownloadStatus(long downloadId, String url) {
        Query query = new Query();
        query.setFilterById( downloadId);
        Cursor c = dm.query( query);
        if(c.moveToFirst()) {
            int columnIndex = c.getColumnIndex( DownloadManager.COLUMN_STATUS);
            int status = c.getInt( columnIndex);
            System.out.println( " status " + status);
            switch(status) {
                case DownloadManager.STATUS_SUCCESSFUL:
                    // 已下载完成,若再次点击就进入安装界面
                    boolean installOk = false;
                    if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
                        installOk = startInstall( dm.getUriForDownloadedFile( downloadId));
                    }
                    else {
                        String downloadFileUrl = c.getString( c.getColumnIndex( DownloadManager.COLUMN_LOCAL_URI));
                        installOk = startInstall( Uri.parse( downloadFileUrl));
                    }
                    if(!installOk) {
                        addToDownload( url);
                    }
                    break;
                case DownloadManager.STATUS_PAUSED:
                case DownloadManager.STATUS_PENDING:
                case DownloadManager.STATUS_RUNNING:
                    // 暂定、挂起、下载中;提示已加入下载队列
                    Toast.makeText( mContext, "已加入下载队列", Toast.LENGTH_LONG).show();
                    break;
                case DownloadManager.STATUS_FAILED:
                    // 下载失败,重新下载
                    addToDownload( url);
                    break;
                default:
                    break;
            }
        }
        else {
            // 本地文件已被删除,重新下载
            addToDownload( url);
        }
        if(null != c) {
            c.close();
        }
    }

    private class DownloadReceiver extends BroadcastReceiver {

        @TargetApi(Build.VERSION_CODES.HONEYCOMB)
        @Override
        public void onReceive(Context context, Intent intent) {
            String action = intent.getAction();
            if(DownloadManager.ACTION_DOWNLOAD_COMPLETE.equals( action)) {
                long downloadId = intent.getLongExtra( DownloadManager.EXTRA_DOWNLOAD_ID, 0);
                Query query = new Query();
                query.setFilterById( downloadId);
                Cursor c = dm.query( query);
                if(c.moveToFirst()) {
                    int columnIndex = c.getColumnIndex( DownloadManager.COLUMN_STATUS);
                    if(DownloadManager.STATUS_SUCCESSFUL == c.getInt( columnIndex)) {
                        if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.GINGERBREAD) {
                            startInstall( dm.getUriForDownloadedFile( downloadId));
                        }
                        else {
                            String downloadFileUrl = c.getString( c.getColumnIndex( DownloadManager.COLUMN_LOCAL_URI));
                            startInstall( Uri.parse( downloadFileUrl));
                        }
                        c.close();
                    }
                }
            }
        }
    }

    private boolean startInstall(Uri uri) {
        if(!new File( uri.getPath()).exists()) {
            System.out.println( " local file has been deleted! ");
            return false;
        }
        Intent intent = new Intent();
        intent.addFlags( Intent.FLAG_ACTIVITY_NEW_TASK);
        intent.setAction( Intent.ACTION_VIEW);
        intent.setDataAndType( uri, "application/vnd.android.package-archive");
        mContext.startActivity( intent);
        return true;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值