xamarin.forms开发学习 三 :Android平台下的Activity和Context

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

 

 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值