Android 6.0 的时候增加了 Android 运行时权限,在7.0的时候权限又增加了,可能这也是 Android 越来越安全的一个做法吧.
在做更新 App 的时候因为 7.0 系统的手机没有配置,导致强制更新下载下来的时候, App 没有自动安装,后来查资料才知道,原来是没有添加临时权限,所以今天在这记录一下.供后面参考
首先需要再清单文件里注册一个 provider 这个就是用来保存一个临时的 uri ,(可能我的理解是不对的,我是这么想的), 7.0 的这块主要就是 uri 和 7.0 之前不同,不能直接被使用,只能使用代理的形式来获得.
清单文件的内容:
android:name="android.support.v4.content.FileProvider"
android:authorities=""这里是你的包名".fileprovider"
android:exported="false"
android:grantUriPermissions="true">
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_paths"/>
另外还需要写一个 xml 文件 xml/file_paths ,内容是这样的:
<?xml version="1.0"encoding="utf-8"?>
<resources>
<path>
<external-pathpath=""name="download"/>
</paths>
</resources>
另外安装 apk 的方法是这样的:
/**
*安装软件
*/
private void installApk() {
if(Build.VERSION.SDK_INT>=24) {//判读版本是否在7.0以上
Filefile= newFile(fileStoreDir,fileName);
Stringauthorities=SchoolMateChatApplication.getInstance().getPackageName()+".fileprovider";
UriapkUri=FileProvider.getUriForFile(mContext,authorities,file);//在AndroidManifest中的android:authorities值
Intentinstall= newIntent(Intent.ACTION_VIEW);
install.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
install.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);//添加这一句表示对目标应用临时授权该Uri所代表的文件
install.setDataAndType(apkUri,"application/vnd.android.package-archive");
mContext.startActivity(install);
}else{
Filefile= newFile(fileStoreDir,fileName);
Uriuri=Uri.fromFile(file);
Intentinstall= newIntent(Intent.ACTION_VIEW);
install.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
install.setDataAndType(uri,"application/vnd.android.package-archive");
//执行意图进行安装
mContext.startActivity(install);
}
}
卸载的方法:
/**
*强制卸载某个包名(旧版本app)的程序
*/
private voiduninstallAPK() {
StringpackageName="以前版本包名";//以前版本包名
PackageManagerpageManage=mContext.getPackageManager();
Listpackages=pageManage.getInstalledPackages(0);
for(inti=0;i
PackageInfopackageInfo=packages.get(i);
StringpagName=packageInfo.packageName;
if(pagName.equals(packageName)) {//判断该应用是否存在
Uriuri=Uri.parse("package:"+packageName);
Intentintent= newIntent(Intent.ACTION_DELETE,uri);
mContext.startActivity(intent);
}
}
}
希望能对大家有所帮助,欢迎大家一起讨论交流.