使用DownloadManager 自动更新apk

来源:互联网 发布:java细粒度数据级权限 编辑:程序博客网 时间:2024/05/18 01:42

添加DownloadManager 权限

<uses-permission android:name="android.permission.DOWNLOAD_WITHOUT_NOTIFICATION"/>

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>


在onCreate中

DownloadManager  downloadManager = (DownloadManager) getSystemService(DOWNLOAD_SERVICE);


检查更新的方法,activity中调用。

    public void checkUpdate(Context context) {
        try {
            int curVer = getPackageManager().getPackageInfo(packageName, 0).versionCode;

//读取远端配置的版本信息。
            JSONObject resource = config.getJSONObject("resources");
            int newVer = resource.getInt("versionCode");
            Log.d(TAG, String.format("checkUpdate curVer:%1$s newVer:%2$s", curVer, newVer));

//比较版本

            if (curVer >= newVer) {
                return;
            }

//取得远端的apk下载路径
            final String downUri = resource.getString("downloadUri");

            AlertDialog.Builder builder = new AlertDialog.Builder(context);
            builder.setTitle("软件更新");
            builder.setMessage("检测到新版本,是否下载更新?");
            builder.setPositiveButton("更新", new AlertDialog.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    dialog.dismiss();
                    //开始下载。
                    downNewApk(downUri);
                }
            });
            // 稍后更新
            builder.setNegativeButton("稍后更新", new AlertDialog.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    dialog.dismiss();
                }
            });
            builder.create().show();


        } catch (Exception e) {
            e.printStackTrace();
        }
    }


//使用downloadmanager下载apk的方法.

    private void downNewApk(String downUri) {

//初始化下载的request
        DownloadManager.Request request = new DownloadManager.Request(Uri.parse(downUri));
        request.setAllowedNetworkTypes(DownloadManager.Request.NETWORK_MOBILE | DownloadManager.Request.NETWORK_WIFI);
        request.setAllowedOverRoaming(false);
        //设置文件类型
        MimeTypeMap mimeTypeMap = MimeTypeMap.getSingleton();
        String mimeString = mimeTypeMap.getMimeTypeFromExtension(MimeTypeMap.getFileExtensionFromUrl(downUri));
        request.setMimeType(mimeString);
        //在通知栏中显示
//        request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE);
        request.setShowRunningNotification(true);
//        request.setVisibleInDownloadsUi(true);
        //sdcard的目录下的download文件夹

//设置下载目录到sdcard download文件夹,自定义文件名,注意如果有同名文件系统会自动加_n的后缀.
        request.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, packageName + ".apk");
        request.setTitle("下载更新");

//插入下载队列.返回下载对象Id

        downId = downloadManager.enqueue(request);

//注册广播,下载完成后通知.

        regReceiver();

    }


//注册广播.文件下载完成后通知.

    private void regReceiver() {
        Log.d(TAG, String.format("receiver ACTION_MEDIA_MOUNTED :%1$s", "ok"));
        registerReceiver(new BroadcastReceiver() {
            @Override
            public void onReceive(Context context, Intent intent) {
                Log.d(TAG, String.format("regReceiver intent:%1$s", intent));
                long id = intent.getLongExtra(DownloadManager.EXTRA_DOWNLOAD_ID, 0);

//下载完成的文件是不是我们要的.

                if (downId != id) {
                    return;
                }

//通过游标取得下载真实文件名称
                Cursor cursor = downloadManager.query(new DownloadManager.Query().setFilterById(id));
                cursor.moveToFirst();
                String localFileName = cursor.getString(cursor.getColumnIndex(DownloadManager.COLUMN_LOCAL_FILENAME));

//启动安装.

                Intent fileIntent = new Intent(Intent.ACTION_VIEW);
                File apkfile = new File(localFileName);
                Log.d(TAG, "filepath=" + apkfile.toString() + "  " + apkfile.getPath());
                fileIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                fileIntent.setDataAndType(Uri.parse("file://" + apkfile.toString()), "application/vnd.android.package-archive");
                context.startActivity(fileIntent);
                android.os.Process.killProcess(android.os.Process.myPid());
            }
        }, new IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE));
    }

1 0