Reputation: 1959
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
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