繁体   English   中英

xamarin.forms呼叫挂起事件问题

[英]xamarin.forms Call hung event issue

我有xamarin.forms应用程序,其中我在android部分中使用phonestatelistner。 在我的应用程序中,用户可以通过转到拨号器来拨打电话。 我正在尝试实现电话挂断事件。我将根据挂断事件使用消息传递中心来计算估计的通话时间。

这是我的MainActivity

namespace sample.Droid
{
    [Activity(Label = "sample", Icon = "@mipmap/icon", Theme = "@style/MainTheme", MainLauncher = true, ConfigurationChanges = ConfigChanges.ScreenSize | ConfigChanges.Orientation)]
    public class MainActivity : global::Xamarin.Forms.Platform.Android.FormsAppCompatActivity
    {
        protected override void OnCreate(Bundle savedInstanceState)
        {
            TabLayoutResource = Resource.Layout.Tabbar;
            ToolbarResource = Resource.Layout.Toolbar;
            global::Xamarin.Forms.Forms.SetFlags("CollectionView_Experimental");
            base.OnCreate(savedInstanceState);      
            global::Xamarin.Forms.Forms.Init(this, savedInstanceState);
            ImageCircleRenderer.Init();
            Xamarin.Essentials.Platform.Init(this, savedInstanceState);
            Rg.Plugins.Popup.Popup.Init(this, savedInstanceState);
            RequestPermissionAsync();        
            Xamarin.Essentials.Platform.Init(this, savedInstanceState);         

        }

            async void RequestPermissionAsync()
            {
                var status = await CrossPermissions.Current.CheckPermissionStatusAsync<PhonePermission>();
                if (status != PermissionStatus.Granted)
                {
                    if (await CrossPermissions.Current.ShouldShowRequestPermissionRationaleAsync(Permission.Phone))
                    {
                        // has no permission

                    }

                    status = await CrossPermissions.Current.RequestPermissionAsync<PhonePermission>();
                }

                if (status == PermissionStatus.Granted)
                {
                    //Query permission
                    StateListener phoneStateListener = new StateListener();
                    TelephonyManager telephonyManager = (TelephonyManager)GetSystemService(TelephonyService);
                    telephonyManager.Listen(phoneStateListener, PhoneStateListenerFlags.CallState);
                }

                else if (status != PermissionStatus.Unknown)
                {
                    //permission denied
                }
            }

        public class StateListener : PhoneStateListener
        {
            public override void OnCallStateChanged(CallState state, string incomingNumber)
            {
                base.OnCallStateChanged(state, incomingNumber);
                switch (state)
                {
                    case 
                    CallState.Ringing:

                        try
                        {
                            MessagingCenter.Send<Object>(new Object(), "CallConnectedAndroid");
                        }
                        catch (Exception ex)
                        {
                        }
                        break;
                    case 
                    CallState.Offhook:

                        try
                        {
                            MessagingCenter.Send<Object>(new Object(), "CallEndedAndroid");
                        }
                        catch (Exception ex)
                        {
                        }

                        break;
                    case 
                    CallState.Idle:
                        break;
                }
            }
        }

        public override void OnRequestPermissionsResult(int requestCode, string[] permissions, [GeneratedEnum] Android.Content.PM.Permission[] grantResults)
        {
            Xamarin.Essentials.Platform.OnRequestPermissionsResult(requestCode, permissions, grantResults);

            base.OnRequestPermissionsResult(requestCode, permissions, grantResults);
        }

    }
}

在我的共享代码中

   PhoneDialer.Open(PhoneNumber.Text);

                        MessagingCenter.Subscribe<Object>(this, "CallConnectedAndroid", (sender) => {
                            CallStartTime = DateTime.Parse(DateTime.Now.ToString("hh:mm:ss"));
                        });

                        MessagingCenter.Subscribe<Object>(this, "CallEndedAndroid", async (sender) => {
                            CallEndTime = DateTime.Parse(DateTime.Now.ToString("hh:mm:ss"));
                            CallDuration = CallEndTime - CallStartTime;
                            string duration = CallDuration.ToString();

                        });

但是我不能进入StateListener类。 如何使电话挂断事件? 我应该使用广播接收器或其他方法吗? 任何帮助表示赞赏。

首先,您可以在系统设置页面中检查您的应用是否具有“ Phone权限。

另外,在运行时在MainActivity中添加请求权限方法。

下载Plugin.Permissions从的NuGet。

async void RequestPermissionAsync()
{
  var status = await CrossPermissions.Current.CheckPermissionStatusAsync<PhonePermission>();
  if (status != PermissionStatus.Granted)
  {
    if (await CrossPermissions.Current.ShouldShowRequestPermissionRationaleAsync(Permission.Phone))
    {
      // has no permission

    }

    status = await CrossPermissions.Current.RequestPermissionAsync<PhonePermission>();
   }

   if (status == PermissionStatus.Granted)
   {
     //Query permission
     StateListener phoneStateListener = new StateListener();
     TelephonyManager telephonyManager = (TelephonyManager)GetSystemService(TelephonyService);
     telephonyManager.Listen(phoneStateListener, PhoneStateListenerFlags.CallState);
    }

    else if (status != PermissionStatus.Unknown)
    {
            //permission denied
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM