• 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
  • 相关阅读:
    关于返回上一页功能
    Mybatis Update statement Date null
    SQLite reset password
    Bootstrap Validator使用特性,动态(Dynamic)添加的input的验证问题
    Eclipse使用Maven2的一次环境清理记录
    Server Tomcat v7.0 Server at localhost failed to start
    PowerShell一例
    Server Tomcat v7.0 Server at libra failed to start
    商标注册英语
    A glance for agile method
  • 原文地址:https://www.cnblogs.com/yujian-bcq/p/4054375.html
Copyright © 2020-2023  润新知