zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    struts-OGNL
    Linux开发环境配置大全
    Mybartis逆向工程
    开发环境配置大全
    金三银四,你的专属复习宝典
    Java5~11新特性
    Struts2+Spring+Hibernate整合开发(Maven多模块搭建)
    三层架构,Struts2,SpringMVC实现原理图
    Springmvc+Spring+Mybatis整合开发(架构搭建)
    MyBatis面试题整理
  • 原文地址:https://www.cnblogs.com/yujian-bcq/p/4054375.html
Copyright © 2011-2022 走看看