美文网首页
android 安装apk 遇到的问题

android 安装apk 遇到的问题

作者: 程序员阿兵 | 来源:发表于2019-07-10 10:34 被阅读0次

    很多应用都是采用内部下载的方式,版本升级后可以实时更新最新应用,这样的体验肯定比跳转到浏览器好得多!而应用商店审核周期长,所以内部下载更新就显得尤为重要!

    下面是Android不同版本需要适配安装的问题:

    • Android6.0,需要动态申请权限,读取写入。
    • Android7.0,需要通过fileprovider的方式创建Uri
    • Android8.0,需要申请【安装未知来源应用权限】

    具体代码:

    /**
       * 兼容8.0安装位置来源的权限
       */
      private void installApk(Context context, String downloadApkPath) {
          if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
              //是否有安装位置来源的权限
              boolean haveInstallPermission = getPackageManager().canRequestPackageInstalls();
              if (haveInstallPermission) {
                  AppUtils.installApk(context, downloadApkPath);
              } else {
                  new ResolveInstallDialog(context, "安装应用需要打开安装未知来源应用权限,请去设置中开启权限", new ResolveInstallDialog.OnOkListener() {
                      @Override
                      public void onOkClick() {
                        Uri packageUri = Uri.parse("package:"+ AppUtils.getAppPackageName());
                          Intent intent = new Intent(Settings.ACTION_MANAGE_UNKNOWN_APP_SOURCES,packageUri);
                      }
                  }).show();
              }
          } else {
              AppUtils.installApk(context, downloadApkPath);
          }
      }
    

    具体安装代码:

       /**
         * 根据安装包路径安装apk
         *
         * @param mContex 上下文
         * @param apkPath apk路径
         */
        public static void installApk(Context mContex, String apkPath) {
            Intent intent = new Intent(Intent.ACTION_VIEW);
            File apkFile = new File(apkPath);
            intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
                intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
                Uri contentUri = FileProvider.getUriForFile(
                        mContex
                        , mContex.getPackageName()+".accomponentcheckupdate.provider"
                        , apkFile);
                intent.setDataAndType(contentUri, "application/vnd.android.package-archive");
            } else {
                intent.setDataAndType(Uri.fromFile(apkFile), "application/vnd.android.package-archive");
            }
            mContex.startActivity(intent);
        }
    

    7.0 配置fileProvider

    新建xml目录创建 fileprovider

    <?xml version="1.0" encoding="utf-8"?>
    <paths>
        <external-path path="." name="external_storage_root" />
    </paths>
    

    自定义FileProvider

    public class ACComponentItemCheckUpDateFileProvider extends FileProvider {
    
    }
    
    

    在manifest 配置FileProvider

        <application>
    
            <service
                android:name=".update.VersionUpdateService"
                android:process=":versionUpdateService" />
            <provider
                android:authorities="${applicationId}.accomponentcheckupdate.provider"
                android:name=".ACComponentItemCheckUpDateFileProvider"
                android:exported="false"
                android:grantUriPermissions="true">
                <meta-data
                    android:name="android.support.FILE_PROVIDER_PATHS"
                    android:resource="@xml/provider_paths"/>
            </provider>
        </application>
    

    相关文章

      网友评论

          本文标题:android 安装apk 遇到的问题

          本文链接:https://www.haomeiwen.com/subject/vbjckctx.html