xamarin.android升级错误 exposed beyond app through Intent.getData()

升级包下载后安卓,在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版本”的编译就行了。

虽然解决了,但是这里我不是很明白选择这个编译到底目标版本是什么?

xamarin.android升级错误 exposed beyond app through Intent.getData()_第1张图片

 

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;
            }

        }

 

你可能感兴趣的:(xamarin.android升级错误 exposed beyond app through Intent.getData())