我正在使用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" />
我为应用程序编写的所有代码都在一个可移植的类库中。所以我还没有任何特定于平台的代码。
如何从便携式类库中检查并请求互联网许可?
答案 0 :(得分:3)
有Normal
和Dangerous
权限,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);
}