android 原生的DownloadManager

代码:

 

public class MainActivity extends Activity {
    private DownloadManager downloadManager;
    public static final String DOWNLOAD_FOLDER_NAME = "Trinea";
    public static final String DOWNLOAD_FILE_NAME = "MeiLiShuo.apk";
    public static final String APK_URL = "http://img.meilishuo.net/css/images/AndroidShare/Meilishuo_3.6.1_10006.apk";
    public static final String KEY_NAME_DOWNLOAD_ID = "downloadId";
    private long downloadId = 0;
    private CompleteReceiver completeReceiver;

    @TargetApi(Build.VERSION_CODES.HONEYCOMB)
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        init();
        findViewById(R.id.button1).setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                File folder = Environment
                        .getExternalStoragePublicDirectory(DOWNLOAD_FOLDER_NAME);
                if (!folder.exists() || !folder.isDirectory()) {
                    folder.mkdirs();
                }

                DownloadManager.Request request = new DownloadManager.Request(
                        Uri.parse(APK_URL));
                request.setDestinationInExternalPublicDir(DOWNLOAD_FOLDER_NAME,
                        DOWNLOAD_FILE_NAME);
                request.setTitle("美丽传说");
                request.setDescription("meilishuo desc");
                request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);
                request.setVisibleInDownloadsUi(false);
                // request.allowScanningByMediaScanner();
                // request.setAllowedNetworkTypes(DownloadManager.Request.NETWORK_WIFI);
                // request.setShowRunningNotification(false);
                // request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_HIDDEN);
                //application/cn.trinea.download.file
                request.setMimeType("application/vnd.android.package-archive");
                downloadId = downloadManager.enqueue(request);
                /** save download id to preferences **/
            }
        });
    }

    private void init() {
        // TODO Auto-generated method stub
        completeReceiver = new CompleteReceiver();
        /** register download success broadcast **/
        registerReceiver(completeReceiver, new IntentFilter(
                DownloadManager.ACTION_DOWNLOAD_COMPLETE));
        downloadManager = (DownloadManager) getSystemService(DOWNLOAD_SERVICE);
    }

    private int getInt(long downloadId, String columnName) {
        DownloadManager.Query query = new DownloadManager.Query()
                .setFilterById(downloadId);
        int result = -1;
        Cursor c = null;
        try {
            c = downloadManager.query(query);
            if (c != null && c.moveToFirst()) {
                result = c.getInt(c.getColumnIndex(columnName));
            }
        } finally {
            if (c != null) {
                c.close();
            }
        }
        return result;
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        unregisterReceiver(completeReceiver);
    }

    class CompleteReceiver extends BroadcastReceiver {

        @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 install it
             **/
            long completeDownloadId = intent.getLongExtra(
                    DownloadManager.EXTRA_DOWNLOAD_ID, -1);
            if (completeDownloadId == downloadId) {

                // if download successful, install apk
                // if (downloadManagerPro.getStatusById(downloadId) ==
                // DownloadManager.STATUS_SUCCESSFUL) {
                if (getInt(downloadId, DownloadManager.COLUMN_STATUS) == DownloadManager.STATUS_SUCCESSFUL) {
                    String apkFilePath = new StringBuilder(Environment
                            .getExternalStorageDirectory().getAbsolutePath())
                            .append(File.separator)
                            .append(DOWNLOAD_FOLDER_NAME)
                            .append(File.separator).append(DOWNLOAD_FILE_NAME)
                            .toString();
                    install(context, apkFilePath);
                }
            }
        }
    };

    /**
     * install app
     * 
     * @param context
     * @param filePath
     * @return whether apk exist
     */
    public static boolean install(Context context, String filePath) {
        Intent i = new Intent(Intent.ACTION_VIEW);
        File file = new File(filePath);
        if (file != null && file.length() > 0 && file.exists() && file.isFile()) {
            i.setDataAndType(Uri.parse("file://" + filePath),
                    "application/vnd.android.package-archive");
            i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            context.startActivity(i);
            return true;
        }
        return false;
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

}

清单文件里的权限:

 <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.BROADCAST_STICKY" />
    <uses-permission android:name="android.permission.DOWNLOAD_WITHOUT_NOTIFICATION" />

 

但是在做系统适配的时会出问题,上面的这种不支持低版本的,所以自己写service来后台更新

/**
 * 更新apk
 * 
 * @author jian.zhou test
 */
@SuppressLint("HandlerLeak")
public class UpdateService extends Service {
    private static final int DOWN_OK = 1;
    private static final int DOWN_ERROR = 0;
    private String app_name;
    private NotificationManager notificationManager;
    private PendingIntent pendingIntent;
    private int notification_id = 0;
    protected FinalHttp finalHttp;

    @Override
    public IBinder onBind(Intent arg0) {
        return null;
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        finalHttp = new FinalHttp();
        app_name=intent.getStringExtra("app_name");
        createNotification();
        createThread();
        return super.onStartCommand(intent, flags, startId);

    }

    Handler handler = new Handler() {
        @SuppressWarnings("deprecation")
        @Override
        public void handleMessage(Message msg) {
            switch (msg.what) {
            case DOWN_OK:
                Uri uri = Uri.fromFile(new File(FileUtlis.getSDKPath()
                        + app_name));
                Intent intent = new Intent(Intent.ACTION_VIEW);
                intent.setDataAndType(uri,
                        "application/vnd.android.package-archive");
                pendingIntent = PendingIntent.getActivity(UpdateService.this,
                        0, intent, 0);
                contentViews.setTextViewText(R.id.notificationTitle,
                        "下载完成!点击安装");
                mBuilder.setContentIntent(pendingIntent);
                notificationManager.notify(notification_id, mBuilder.build());
                stopService(new Intent("mmdops.services.UpdateService"));
                break;
            case DOWN_ERROR:
                contentViews.setTextViewText(R.id.notificationTitle, "下载失败!");
                notificationManager.notify(notification_id, mBuilder.build());
                break;

            default:
                stopService(new Intent("mmdops.services.UpdateService"));
                break;
            }
        }
    };

    /***
     * 开线程下载
     */
    public void createThread() {
        String path = FileUtlis.createFile(app_name);
        Logger.e("PATH---->"+path);
        finalHttp.download(Cants.HTTP_DOWN_APK, path, new AjaxCallBack<File>() {

            @Override
            public void onStart() {
                // TODO Auto-generated method stub
                super.onStart();
                Logger.e("----------->下载开始!");
            }

            @Override
            public void onLoading(long count, long current) {
                // TODO Auto-generated method stub
                super.onLoading(count, current);
                Logger.e("----------->下载...");
                contentViews.setProgressBar(R.id.notificationProgress,
                        (int) count, (int) current, false);
                // show_view
                notificationManager.notify(notification_id, mBuilder.build());
            }

            @Override
            public void onSuccess(File t) {
                // TODO Auto-generated method stub
                super.onSuccess(t);
                Logger.e("----------->下载onSuccess!");
                handler.obtainMessage(DOWN_OK).sendToTarget();
            }

            @Override
            public void onFailure(Throwable t, int errorNo, String strMsg) {
                // TODO Auto-generated method stub
                super.onFailure(t, errorNo, strMsg);
                handler.obtainMessage(DOWN_ERROR).sendToTarget();
            }
        });
    }

    /***
     * 创建通知栏
     */
    private RemoteViews contentViews;
    private NotificationCompat.Builder mBuilder;

    public void createNotification() {

        contentViews = new RemoteViews(getPackageName(),
                R.layout.notification_item);
        contentViews.setTextViewText(R.id.notificationTitle, "正在下载");
        contentViews.setProgressBar(R.id.notificationProgress, 100, 0, false);

        Intent intent = new Intent(this, LoginActivity.class);
        pendingIntent = PendingIntent.getActivity(this, 0, intent,
                PendingIntent.FLAG_CANCEL_CURRENT);
        mBuilder = new NotificationCompat.Builder(this).setSmallIcon(
                R.drawable.logo_jm).setTicker("后台更新中");
        mBuilder.setAutoCancel(true);

        mBuilder.setContentIntent(pendingIntent);
        mBuilder.setContent(contentViews);
        mBuilder.setAutoCancel(true);

        notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
        notificationManager.notify(notification_id, mBuilder.build());
    }

}
View Code

 

posted on 2014-10-27 15:47  yujian_bcq  阅读(392)  评论(0编辑  收藏  举报

导航