[英]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.