前段时间电脑升级,脑残的也罢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.pnga.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);
}
好了,完美解决
网友评论