简体   繁体   English

xamarin.forms呼叫挂起事件问题

[英]xamarin.forms Call hung event issue

I have xamarin.forms app in which I am using phonestatelistner in android part. 我有xamarin.forms应用程序,其中我在android部分中使用phonestatelistner。 In my app, the user can make a call by moving to dialer. 在我的应用程序中,用户可以通过转到拨号器来拨打电话。 I am trying to achieve the call hung up event.I will calculate an estimated call duration using messaging center according to the hung up event. 我正在尝试实现电话挂断事件。我将根据挂断事件使用消息传递中心来计算估计的通话时间。

This is my MainActivity 这是我的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);
        }

    }
}

In my shared code 在我的共享代码中

   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();

                        });

But I can't get into the class StateListener . 但是我不能进入StateListener类。 How can I get the call hung up an event? 如何使电话挂断事件? Should I implement broadcastreciever or something? 我应该使用广播接收器或其他方法吗? Any help is appreciated. 任何帮助表示赞赏。

Firstly,you can check it your app has permission of Phone in system setting page. 首先,您可以在系统设置页面中检查您的应用是否具有“ Phone权限。

In addition , add the request permission method in runtime in MainActivity . 另外,在运行时在MainActivity中添加请求权限方法。

Download the Plugin.Permissions from nuget. 下载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