升级包下载后安卓,在context.startactivity(intent)时报错。
private bool installApk(string filePath)
{
var context = Saobag.Droid.MainActivity.mainActivity;
if (context == null)
return false;
try
{
// 通过Intent安装APK文件
Intent intent = new Intent(Intent.ActionView);
intent.SetDataAndType(Android.Net.Uri.Parse("file://" + filePath), "application/vnd.android.package-archive");
intent.SetFlags(ActivityFlags.NewTask);
context.StartActivity(intent);
}
catch (System.Exception ex)
{
return false;
}
return true;
}
百度说是因为目标版本高于24的会出现,我安装的SDK版本都到28了。
解决办法,编译的时候目标版本选择“利用使用SDK版本”的编译就行了。
虽然解决了,但是这里我不是很明白选择这个编译到底目标版本是什么?
2019-06-01 更新
根据这段时间对动态权限的了解及开发测试看,利用SDK版本的编辑生成的版本绝对是在7.0也就是24以下,这样生成的包安装时权限全部赋予,符合低版本的手机权限情况(用户不给权限就无法安装)。
而在目标版本选择了8.0或者9.0之后,生成的包只有权限列表,但是权限没有开启,需要在程序中用代码请求权限,符合6.0之后的权限情况。
注意,所有需要用到的权限,都必须在清单里面,否则调用动态权限请求时,会一闪而过,直接被拒绝掉。
回到我们升级安装的问题:
原因在于7.0的增加了特性,禁止应用外部公开 "file://" uri, 要使用fileprovider类.
所以我们判断不同的sdk版本的处理.
private bool installApk(string filePath)
{
var context = Saobag.Droid.MainActivity.mainActivity;
if (context == null)
return false;
Intent intent = new Intent(Intent.ActionView);
if (Build.VERSION.SdkInt >= Android.OS.BuildVersionCodes.N)//判断Android sdk版本是否大于7.0即24 {
try
{
Java.IO.File file = new Java.IO.File(filePath);
Android.Net.Uri apkUri = FileProvider.GetUriForFile(context, "com.cstc.SaoBag.fileProvider", file);
Intent install = new Intent(Intent.ActionView);
install.SetFlags(ActivityFlags.NewTask);
install.SetFlags(ActivityFlags.GrantReadUriPermission);
install.SetDataAndType(apkUri, "application/vnd.android.package-archive");
context.StartActivity(install);
}
catch (System.Exception ex)
{
return false;
}
return true;
}
else
{
try
{
// 通过Intent安装APK文件
intent.SetDataAndType(Android.Net.Uri.Parse("file://" + filePath), "application/vnd.android.package-archive");
intent.SetFlags(ActivityFlags.NewTask);
context.StartActivity(intent);
}
catch (System.Exception ex)
{
return false;
}
return true;
}
}