Xamarin表单要求从PCL获得Android 6的互联网许可

本文关键字:Android 互联网 许可 获得 PCL 表单 Xamarin | 更新日期: 2023-09-27 18:13:26

我正在用Xamarin.Forms构建一个跨平台应用程序。对于内容,我使用对返回JSON的API的异步调用。所以我需要互联网许可。

连接API的代码示例:

var data = await wc.GetStringAsync("http://website.for.content/content-api/Category/?format=json");

这一行在Android Manifest中:

  <uses-permission android:name="android.permission.INTERNET" />

我为应用程序编写的所有代码都在一个可移植的类库中。所以我还没有任何平台特定的代码。

如何检查和请求可移植类库的上网权限?

Xamarin表单要求从PCL获得Android 6的互联网许可

NormalDangerous权限,Internet访问是一个正常权限,因此只需要在应用程序的清单中定义用于安装目的,并在运行时自动授予。

正常权限涵盖应用程序需要访问应用程序沙盒之外的数据或资源,但对用户隐私或其他应用程序的操作风险很小的区域。例如,设置时区的权限为正常权限。如果一个应用程序声明它需要一个正常的权限,系统会自动授予该应用程序的权限

裁判:https://developer.android.com/guide/topics/security/normal-permissions.html

您确定需要检查的是权限吗?权限是一个静态的,声明性的东西,在用户安装应用程序之前需要用户。应用程序的权限不能在不更新应用程序和用户明确接受的情况下更改。所以权限背后的逻辑很简单:如果你的应用有

<uses-permission android:name="android.permission.INTERNET" />

在它的manifest中,并且应用程序正在运行,那么你可以确定用户已经接受了应用程序的要求。

如果您的应用程序针对SDK 23或更高版本(Android 6.0或更高版本),并且您的应用程序需要危险的权限,则需要在运行时请求权限:

//假设thisActivity是当前activityint permissionCheck = ContextCompat.checkSelfPermission(thisActivity,Manifest.permission.WRITE_CALENDAR);

无论如何,在运行时你可能愿意检查是否可以访问互联网,这与权限无关。

请看这里:如何在Android上检查互联网访问:

公共布尔isOnline() {ConnectivityManager cm =(ConnectivityManager) getSystemService (Context.CONNECTIVITY_SERVICE);NetworkInfo = cm.getActiveNetworkInfo();= null &&netInfo.isConnectedOrConnecting ();}

注意代码是Android特有的,不能放入PCL中。所以你需要一个pcl声明的接口和Android特定的实现。

我在尝试使用Xzing条码扫描器的相机权限时遇到了这个问题(当然它可以帮助任何其他权限)我的解决方案是在我的MainActivity: FormsAppCompatActivity OnCreate(Bundle Bundle)添加这段代码:

  if (Android.OS.Build.VERSION.SdkInt >= Android.OS.BuildVersionCodes.M)
        {
            int mycode = 0;
            Android.Support.V4.App.ActivityCompat.RequestPermissions(this, new String[] { Manifest.Permission.Camera }, mycode);
        }    
 public override void OnRequestPermissionsResult(int requestCode, string[] permissions, Permission[] grantResults)
    {            
        ZXing.Net.Mobile.Forms.Android.PermissionsHandler.OnRequestPermissionsResult(requestCode, permissions, grantResults);
    }