Android7.0 应用内升级

Android7.0应用内升级

最近线上项目在7.0机器上出现应用内升级失败,原来是由于Android7.0权限问题导致。

如果项目的 targetSdkVersion>=24 在处理应用内升级的时候需要兼容7.0。

1、创建file_paths.xml文件

  在res下创建xml文件夹,然后在xml文件夹下创建file_paths.xml文件。

  

1 <?xml version="1.0" encoding="utf-8"?>
2 <resources xmlns:android="http://schemas.android.com/apk/res/android">
3     <paths>
4         <external-path
5             name="download"
6             path=""/>
7     </paths>
8 </resources>

说明:apk是下载在Environment.getExternalStorageDirectory()路径下的。

   external-path代表 Environment.getExternalStorageDirectory()目录。

   name:必须有。为Environment.getExternalStorageDirectory()的别名

   path:可以为空。空代表Environment.getExternalStorageDirectory()目录下所有的文件夹和文件。

2、配置AndroidManifest.xml文件添加provider标签

 1         <provider
 2             android:name="android.support.v4.content.FileProvider"
 3             android:authorities="com.ntjr.std.provider"
 4             android:exported="false"
 5             android:grantUriPermissions="true"
 6             >
 7             <meta-data
 8                 android:name="android.support.FILE_PROVIDER_PATHS"
 9                 android:resource="@xml/file_paths"/>
10         </provider>

3、安装apk的方法进行版本判断:

  

 1     public void installApk(Context context, File file) {
 2         if (!file.exists()) {
 3             ToastUtil.show(mContext, "安装失败");
 4             return;
 5         }
 6         Intent intent = new Intent();
 7         intent.setAction(android.content.Intent.ACTION_VIEW);

      //版本>=24
8 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
       
      //参数说明:
       
context:上下文
       authority:必须和provider中声明的android:authorities值一致
file:所下载的apk文件
 9             Uri contentUri = FileProvider.getUriForFile(context, "com.ntjr.std.provider", file);
10             intent.setDataAndType(contentUri, "application/vnd.android.package-archive");
11             intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
12             intent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
13         } else {
14             Uri uri = Uri.fromFile(file);
15             intent.setDataAndType(uri, "application/vnd.android.package-archive");
16         }
17         intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
18         context.startActivity(intent);
19     }

要注意使用的是 addFlags还是setFlags。setFlags会清除掉上面所设置的flag。

 

posted @ 2017-06-06 14:29  IT-執念  阅读(1948)  评论(0编辑  收藏  举报