承前,对于安卓中的东西不是很清楚,即使查了资料,对于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,如果出现了,再跟踪下这个情况。