Xamarin Forms从PCL请求Android 6的互联网权限

时间:2016-10-17 14:15:26

标签: c# android xamarin permissions xamarin.forms

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

与API联系的代码示例:

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

此行在Android Manifest中:

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

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

如何从便携式类库中检查并请求互联网许可?

3 个答案:

答案 0 :(得分:3)

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

  

正常权限涵盖了应用需要访问应用程序沙箱外部数据或资源的区域,但用户隐私或其他应用程序操作的风险非常小。例如,设置时区的权限是正常权限。如果某个应用声明需要正常权限,系统会自动向该应用授予权限

参考:https://developer.android.com/guide/topics/security/normal-permissions.html

答案 1 :(得分:1)

您确定需要检查的是权限吗?权限是用户在安装应用程序之前需要的静态声明式事物。如果不更新应用程序并因此明确接受用户,则无法更改应用程序权限。所以权限背后的逻辑很简单:如果你的应用有

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

在其清单中,应用程序正在运行,然后您可以确定用户已接受应用程序要求。

如果您的应用针对SDK 23或更高版本(Android 6.0或更高版本)并且您的应用需要dangerous权限,则需要request permissions in run-time

  

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

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

为此,请查看:How to check internet access on Android

  

public boolean isOnline(){       ConnectivityManager cm =           (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);       NetworkInfo netInfo = cm.getActiveNetworkInfo();       return netInfo!= null&amp;&amp; netInfo.isConnectedOrConnecting();   }

请注意,该代码是特定于Android的,无法放入PCL。因此,您需要一个PCL声明的接口和一个Android特定的实现。

答案 2 :(得分:0)

我有这个问题,相机权限试图使用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);
    }