APP自动安装 --踩坑记录

2020-10-29  本文已影响0人  Journey_lm

前段时间电脑升级,脑残的也罢android studio也给升级到了最新版 'com.android.tools.build:gradle:3.4.2',android sdk 28.0.3 (9.0)导致项目中android support 包基本上不能用,需要更新到 androidx ,更换包也在别人博客中找到了解决办法 https://blog.csdn.net/chenhuakang/article/details/90267389, 更新后还是发现一些坑。

1、APP访问本地文件时找不到路径

androidx后,发现清单文件中配置不一样,

(1)配置清单文件
<provider
          android:name="android.support.v4.content.FileProvider"
          android:authorities="你的包名.fileprovider"
          android:exported="false"
          android:grantUriPermissions="true">
          <meta-data
              android:name="android.support.FILE_PROVIDER_PATHS"
              android:resource="@xml/provider_paths" />
      </provider>

改动后

<provider
          android:name="androidx.core.content.FileProvider"
          android:authorities="你的包名.fileprovider"
          android:exported="false"
          android:grantUriPermissions="true">
          <meta-data
              android:name="android.support.FILE_PROVIDER_PATHS"
              android:resource="@xml/provider_paths" />
      </provider>
(2)在res中建立一个xml文件夹,在文件夹中创建filepaths.xml文件
  <?xml version="1.0" encoding="utf-8"?>
  <paths>
      <external-cache-path
          name="external_cache_path"
          path="" />
   
  </paths>
(3)需要在访问文件时判断版本来获取对应的路径,比如查看本地相册时
/**
   * 开启相机
   */
  public void openCamera() {
      Intent intent=new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
      File file = new File(mContext.getExternalCacheDir(), getPhotoFileName());
      photoFileName = file.getAbsolutePath();
      Uri uri;
      if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
          uri = FileProvider.getUriForFile(mContext.getApplicationContext(),mContext.getPackageName() + ".fileprovider", file);
      } else {
          uri = Uri.fromFile(file);
      }
      intent.putExtra(MediaStore.EXTRA_OUTPUT,uri);
      ((Activity)mContext)startActivityForResult(intentphotograph, requestCode);
  }

2、在做应用版本自动更新时,发现不能自动安装,调不起来安装的apk。现在后的文件路径都正常,就是打不开应用。

最终发现android 8.0以后有了一个权限叫安装未知应用或者是安装未知来源应用,如下图

b.png
a.png

如果想让应用自动安装下载的新版本apk,那么必须打开应用的这个权限,不然是不会自动安装的。代码中的打开方式

// 安装下载后的apk文件
  private void Instanll(String path, Context context) {
      Util.SystemToPrintln(TAG, "file=============" + path,
              2);
      boolean haveInstallPermission;
      if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
          //先获取是否有安装未知来源应用的权限
          haveInstallPermission = mContext.getPackageManager().canRequestPackageInstalls();
          if (!haveInstallPermission) {//没有权限
              AlertDialog alertDialog = new AlertDialog.Builder(mContext)
                      .setTitle("请开启未知来源权限")
                      .setMessage("应用需要打开安装未知来源应用权限,请去设置中开启权限")
                      .setCancelable(false)
                      .setNegativeButton(mContext.getResources().getString(R.string.cancel), new DialogInterface.OnClickListener() {
                          @Override
                          public void onClick(DialogInterface dialog, int which) {
                              dialog.dismiss();
                              Toast.makeText(mContext,"您拒绝了权限,应用无法正常使用!",Toast.LENGTH_SHORT);
                          }
                      })
                      .setPositiveButton(mContext.getResources().getString(R.string.gosystem), new DialogInterface.OnClickListener() {
                          @Override
                          public void onClick(DialogInterface dialog, int which) {
                              dialog.dismiss();
                              toInStallPermissionSettingActivity();
                          }
                      }).create();
              alertDialog.show();
              return;
          }
      }
      if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {//判读版本是否在7.0以上
          Uri apkUri = FileProvider.getUriForFile(context, "包名.fileprovider", new File(path));//在AndroidManifest中的android:authorities值
          Intent install = new Intent(Intent.ACTION_VIEW);
          install.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
          install.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
          install.setDataAndType(apkUri, "application/vnd.android.package-archive");
          context.startActivity(install);
      } else{
          Intent intent = new Intent(Intent.ACTION_VIEW);
          intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
          intent.setDataAndType(Uri.fromFile(new File(path)),
                  "application/vnd.android.package-archive");
          ((Activity)mContext).startActivity(intent);
      }
  }

  @RequiresApi(api = Build.VERSION_CODES.O)
  private void toInStallPermissionSettingActivity() {
      Uri packageURI = Uri.parse("package:" + mContext.getPackageName());
      //注意这个是8.0新API
      Intent intent = new Intent(Settings.ACTION_MANAGE_UNKNOWN_APP_SOURCES, packageURI);
      ((Activity)mContext).startActivityForResult(intent, 1);
  }

好了,完美解决

上一篇下一篇

猜你喜欢

热点阅读