Android APP的升级

前置条件:

1.权限:


<!--  网络权限,不用在程序中动态申请 -->
    <uses-permission android:name="android.permission.INTERNET"/>
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
<!--  外部存储读写,需要在程序中动态申请,用于存储运行日志,以及下载的升级版本-->
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" tools:ignore="ScopedStorage" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<!-- 安装APK权限,需要在程序中动态申请,并且不同于外部存储读写权限申请 -->
    <uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />

2.后端告诉了我们有升级,且有下载文件的路径

第一步,下载apk:

private void downloadNewVersion(String uri) {
        clearDownloadFiles();
        Log.e("", "正在下载最新版本...");
        // 创建下载请求
        DownloadManager.Request request = new DownloadManager.Request(Uri.parse(uri));
        request.setTitle("新版本下载");
        request.setDescription("正在下载最新版本...");
        request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);
        String filePath = getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS).getPath() + "/new_version.apk";
        request.setDestinationUri(Uri.fromFile(new File(filePath)));

        // 开始下载
        DownloadManager downloadManager = (DownloadManager) getSystemService(DOWNLOAD_SERVICE);
        long downloadId = downloadManager.enqueue(request);

        // 监听下载完成事件
        BroadcastReceiver receiver = new BroadcastReceiver() {
            @Override
            public void onReceive(Context context, Intent intent) {
                long id = intent.getLongExtra(DownloadManager.EXTRA_DOWNLOAD_ID, -1);
                if (id == downloadId) {
                    is_install = true;
                    String filePath = getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS).getPath() + "/new_version.apk";
                    File downloadedFile = new File(filePath);
                    // 下载完成,启动安装程序
//                    installNewVersion(context,downloadedFile);
//                    TextView t = (TextView) findViewById(R.id.tv_keycode);
//                    t.setText("下载完成,安装中...");
                    installApp(filePath);
                }
            }
        };
        registerReceiver(receiver, new IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE));
    }

第二步安装:

private void installApp(String path) {
        Log.e("----", "进入安装");
        File apkFile = new File(getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS).getPath(), "new_version.apk");
        if (apkFile.exists()) {
            if (is_machine) {
                Intent intent = new Intent(Intent.ACTION_VIEW);
                Uri uri;
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
                    // Android 7.0 及以上版本需要使用 FileProvider
                    Log.e("-----", BuildConfig.APPLICATION_ID);
                    uri = FileProvider.getUriForFile(this, BuildConfig.APPLICATION_ID + ".provider", apkFile);
                    intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
                    Log.e("----", "7.0以上授权");
                } else {
                    uri = Uri.fromFile(apkFile);
                }
                intent.setDataAndType(uri, "application/vnd.android.package-archive");
                intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                startActivity(intent);
                //销毁副屏
                if (secondary != null) {
                    secondary.dismiss();
                    secondary = null;
                }
                Log.e("----", "执行了startActivity");
            }
           
        } else {
            Log.e("----", "文件不存在");
            Toast.makeText(this, "文件不存在", Toast.LENGTH_SHORT).show();
        }
    }

结果:

要注意,adb安装的应用并不能完全升级,出现类似以下的页面就证明使用成功了

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值