• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

Android开发 APP代码安装APK安装包

武飞扬头像
安静的男孩
帮助3

一、需求

 在Android 项目上架后,需要迭代更新,一般更新方式有:手动下载apk包手动安装、通过浏览器下载手动安装、APP内部下载内部安装。本文章就只讲解APP内部下载内部安装这个APP 更新方式。虽然网上关于APP内部apk安装的代码和文章很多,但太过于绝对,没有考虑一些特殊情况。此文章就是对一些特殊情况处理和代码的说明。

二、权限

在AndroidManifest.xml注册文件中,添加安装apk包权限

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

虽然在在AndroidManifest.xml添加了权限,但还是需求判断和授权,而且在Android 8.0(即Android O) 之前,设置 中的 允许安装未知来源 是针对所有APP的,只要开启了,那么所有的未知来源APP都可以安装。但是,8.0之后,将这个权限挪到了每一个APP内部,这样提高了手机的安全性。

注意:这个权限是需要用户跳转到系统的未知来源权限界面 ,手动开启。所以授权方式和普通申请授权是有区别的。

我这里是以APP 私有空间存储apk 文件,所以没有使用外部存储权限,如果apk需要存储在外部空间记得手动请求外部读写权限。

  1.  
    boolean isInstallPermission = getPackageManager().canRequestPackageInstalls();
  2.  
    if(!isInstallPermission){
  3.  
    //权限没有打开则提示用户去手动打开
  4.  
    openInstallPermission()
  5.  
    }
  6.  
     
  7.  
    /**
  8.  
    * 跳转到设置-允许安装未知来源-页面
  9.  
    */
  10.  
    private void openInstallPermission() {
  11.  
    Intent intent = null
  12.  
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
  13.  
    intent = new Intent(Settings.ACTION_MANAGE_UNKNOWN_APP_SOURCES
  14.  
    ,Uri.parse("package:" getPackageName()));
  15.  
    }else {
  16.  
    intent = new Intent(Settings.ACTION_SECURITY_SETTINGS
  17.  
    ,Uri.parse("package:" getPackageName()));
  18.  
     
  19.  
    }
  20.  
     
  21.  
    startActivityForResult(intent, INSTALL_PERMISS_CODE);
  22.  
    }
  23.  
     
  24.  
     
  25.  
     
  26.  
     
  27.  
    @Override
  28.  
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
  29.  
    super.onActivityResult(requestCode, resultCode, data);
  30.  
     
  31.  
    if (resultCode == RESULT_OK && requestCode == INSTALL_PERMISS_CODE) {
  32.  
     
  33.  
    }
  34.  
    }
学新通

三、配置内容提供者

注意:<provider> 的name 在一些情况 可能重复 造成冲突,如果已有直接  则我们需要一个自定义的FileProvider,自定义FileProvider 只需继承FileProvider 即可 。当然name就是使用我们自定义的xxxxFileProvider地址。

authorities="自已的包名.fileprovider" ,自己的包名获取 可以通过${applicationId}来获取,如 “${applicationId}.fileprovider” ,当然不一定使用“fileprovider” 也可以 但要注意保持和下面安装代码一致就可以了。

  1.  
    <provider
  2.  
    android:name="androidx.core.content.FileProvider"
  3.  
    android:authorities="自已的包名.fileprovider"
  4.  
    android:exported="false"
  5.  
    android:grantUriPermissions="true">
  6.  
    <meta-data
  7.  
    android:name="android.support.FILE_PROVIDER_PATHS"
  8.  
    android:resource="@xml/filepaths" />
  9.  
    </provider>

android.support.FILE_PROVIDER_PATHS 注意不能随意修改,它是常量。resource:就是引用下面的配置文件的地址,文件保存在项目app/src/main/res文件夹下xml文件夹里,并新建一个filepaths.xml文件,编写需要安装apk 的存在路径或者上级路径,当然文件名可以自定义。

我这里是根目录下,name 可以自定义,path 则需要根据实际目的来,我这里为了方便采用了根目录。

  1.  
    <paths xmlns:android="http://schemas.android.com/apk/res/android">
  2.  
    <path>
  3.  
    <root-path name="files_apk"
  4.  
    path="/"/>
  5.  
    </path>
  6.  
     
  7.  
    </paths>

四 、代码安装APK

注意:“.fileprovider” 需要和<provider>的authorities的后缀一致。newApkPath就是你需要安装apk的绝对地址,其他消息除“.fileprovider” 信息可以自定义外,其他皆不需要更改,自定义时需要和AndroidManifest.xml 注册文件 一致。

  1.  
     
  2.  
    Intent intent = new Intent(Intent.ACTION_VIEW);
  3.  
    File apkFile = new File(newApkPath);
  4.  
    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
  5.  
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
  6.  
    intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
  7.  
    Uri uri = FileProvider.getUriForFile(mContext, mContext.getPackageName() ".fileprovider", apkFile);
  8.  
    intent.setDataAndType(uri, "application/vnd.android.package-archive");
  9.  
    } else {
  10.  
    intent.setDataAndType(Uri.fromFile(apkFile), "application/vnd.android.package-archive");
  11.  
    }
  12.  
    startActivity(intent);

如果对您有一些意义,希望您给博主一些鼓励(点赞、关注、收藏),如果有错误欢迎大家评论。

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhfficki
系列文章
更多 icon
同类精品
更多 icon
继续加载