Anand
Anand

Reputation: 1959

xamarin.forms Call hung event issue

I have xamarin.forms app in which I am using phonestatelistner in android part. 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

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 . How can I get the call hung up an event? Should I implement broadcastreciever or something? Any help is appreciated.

Upvotes: 0

Views: 119

Answers (1)

Lucas Zhang
Lucas Zhang

Reputation: 18861

Firstly,you can check it your app has permission of Phone in system setting page.

In addition , add the request permission method in runtime in MainActivity .

Download the Plugin.Permissions from 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
    }
}

Upvotes: 1

Related Questions