承前,对于安卓中的东西不是很清楚,即使查了资料,对于context的概念仍然比较模糊。
最近在抽离工程中公共的东西,集成到类库里面,之前已经做过一些抽离,比如数据接口的调用,数据转换等等,具体不说了,就是.net的东西。
今天想把安卓和IOS工程中实现的接口抽离处理,第一个先尝试安卓动态权限的接口处理。
工程是把代码放在MainActivity下。
安卓的权限请求:Activity.RequestPermissions。
结果是通过回调方法告知的,需要在Activity里面重写进行逻辑处理:OnRequestPermissionsResult,注意这个不要复制整个方法,否则会报错,要自己写下override,再复制方法内容。
#region 权限请求
public static Xamarin.AppFramework.AsyncMsg am;
public static void RequestPermission(string[] PermissionNames, Xamarin.AppFramework.AsyncMsg am_request)
{
XamarinApp.StandardLib.PermissionHelper.am_permission = am_request;
System.Collections.Generic.List<string> needrequest = new System.Collections.Generic.List<string>();
for (int i = 0; i < permissionNames.Length; i++)
{
string permissionstring = permissionNames[i].ToString();
if (Android.Support.V4.Content.PermissionChecker.CheckSelfPermission(MainActivity.mainActivity, permissionstring) == (int)Permission.Granted)
{
am.OnCompletion();
}
else
{
needrequest.Add(permissionstring);
}
}
if (needrequest.Count > 0)
{
MainActivity.mainActivity.RequestPermissions(needrequest.ToArray(), (int)Android.Content.PM.RequestedPermission.Granted);
}
}
public override void OnRequestPermissionsResult(int requestCode, string[] permissions, [GeneratedEnum] global::Android.Content.PM.Permission[] grantResults)
{
base.OnRequestPermissionsResult(requestCode, permissions, grantResults);
if (XamarinApp.StandardLib.PermissionHelper.am_permission == null)
return;
bool re = true;
for (var i=0; i<grantResults.Length; i++)
{
if (grantResults[i] == 0) continue;
re = false;
}
if (re )
XamarinApp.StandardLib.PermissionHelper.am_permission.OnCompletion();
else
XamarinApp.StandardLib.PermissionHelper.am_permission.OnCancel();
}
#endregion
现在我要抽离出来,作为一个类库,实现接口
using System;
using System.Collections.Generic;
using Android.Support.V4.Content;
using Android.Telephony;
using Android;
using Android.Content;
using Android.Content.PM;
using Android.OS;
using Android.Runtime;
using Android.Views;
using Android.Widget;
using System.Threading.Tasks;
[assembly: Xamarin.Forms.Dependency(typeof( XamarinApp.AndroidLib.Interface.RequestPermission))]
namespace XamarinApp.AndroidLib.Interface
{
public class RequestPermission : XamarinApp.StandardLib.Interface.IRequestPermission
{
public void Request(string[] permissionNames, XamarinApp.StandardLib.AsyncMsg am)
{
//MainActivity.RequestPermission(PermissionName, am);
//activity的调用
RequestAppPermission(permissionNames, am);
}
//获取当前上下文,相关方法需要参数context的时候就可以使用了。
static Context CurrentContext => Plugin.CurrentActivity.CrossCurrentActivity.Current.Activity;
public static void RequestAppPermission(string[] permissionNames, XamarinApp.StandardLib.AsyncMsg am_request)
{
XamarinApp.StandardLib.PermissionHelper.am_permission = am_request;
System.Collections.Generic.List<string> needrequest = new System.Collections.Generic.List<string>();
//循环权限请求,如果没有,则添加到需要请求组。
for (int i = 0; i < permissionNames.Length; i++)
{
string permissionstring = permissionNames[i].ToString();
if (Android.Support.V4.Content.PermissionChecker.CheckSelfPermission(CurrentContext, permissionstring) == (int)Permission.Granted)
{
am_request.OnCompletion();
}
else
{
needrequest.Add(permissionstring);
}
}
if (needrequest.Count > 0)
{
Plugin.CurrentActivity.CrossCurrentActivity.Current.Activity.RequestPermissions(needrequest.ToArray(), (int)Android.Content.PM.RequestedPermission.Granted);
}
//var intent = new Intent(Plugin.CurrentActivity.CrossCurrentActivity.Current.Activity, typeof(AppPermissionActivity));
//CurrentContext.StartActivity(intent);
//Plugin.CurrentActivity.CrossCurrentActivity.Current.Activity.StartActivity(intent);
}
}
}
注意区别:CheckSelfPermission的参数Context和RequestPermissions前面的Activity变了。
用了插件Plugin.CurrentActivity.dll ,发现用这个插件非常好用。可以帮我们获取到工程当前的activity。
Xamarin通常直用MainActivity,在这个里面初始化
Plugin.CurrentActivity.CrossCurrentActivity.Current.Activity = this;
其他地方需要用到Context都可以用static Context CurrentContext => Plugin.CurrentActivity.CrossCurrentActivity.Current.Activity;
当然,目前我还没有试过如果android中需要启动多个activity,Plugin.CurrentActivity.CrossCurrentActivity.Current.Activity是否会在启动其他activity后改变为其他activity,如果出现了,再跟踪下这个情况。