C# Xamarin表单获取调用持续时间
我有一个xamarin.forms应用程序,当标签点击时,它会打开拨号程序C# Xamarin表单获取调用持续时间,c#,xamarin,xamarin.forms,C#,Xamarin,Xamarin.forms,我有一个xamarin.forms应用程序,当标签点击时,它会打开拨号程序 用户单击标签-->拨号器(ios中的电话应用程序)打开 用户呼叫并结束-->返回应用程序 我可以在点击标签时打开拨号器 我可以在我的应用程序中获取通话持续时间吗?是否有可能?如果没有,是否有其他解决方法,如计算从XF应用程序移动到拨号器时的空闲状态时间。请指导Android部分 我使用了Xamarin essential来移动拨号器 *获取上次呼叫号码的持续时间: 在Android文件夹中创建了名为拨号程序的依赖项 [a
我可以在我的应用程序中获取通话持续时间吗?是否有可能?如果没有,是否有其他解决方法,如计算从XF应用程序移动到拨号器时的空闲状态时间。请指导Android部分 我使用了Xamarin essential来移动拨号器 *获取上次呼叫号码的持续时间: 在Android文件夹中创建了名为拨号程序的依赖项
[assembly: Dependency(typeof(Dialer))]
namespace DialerDemo.Droid
{
class Dialer : ICallerDialer
{
public string GetCallLogs()
{
string queryFilter = String.Format("{0}={1}", CallLog.Calls.Type, (int)CallType.Outgoing);
string querySorter = String.Format("{0} desc ", CallLog.Calls.Date);
ICursor queryData1 = Android.App.Application.Context.ContentResolver.Query(CallLog.Calls.ContentUri, null, queryFilter ,null, querySorter);
int number = queryData1.GetColumnIndex(CallLog.Calls.Number);
int duration1 = queryData1.GetColumnIndex(CallLog.Calls.Duration);
if (queryData1.MoveToFirst() == true)
{
String phNumber = queryData1.GetString(number);
String callDuration = queryData1.GetString(duration1);
return callDuration;
}
return string.Empty;
}
}
}
在我的共享代码中创建了接口
namespace DialerDemo
{
public interface ICallerDialer
{
string GetCallLogs();
}
}
为了在android中获得通话持续时间,我在MainPage.xaml.cs中这样称呼它
var duration = DependencyService.Get<ICallerDialer>().GetCallLogs();
var duration=DependencyService.Get().GetCallLogs();
ios部分
在Appdelegate类中,我添加了apple telephony API代码
public CTCallCenter c { get; set; }
public override bool FinishedLaunching(UIApplication app, NSDictionary options)
{
global::Xamarin.Forms.Forms.Init();
LoadApplication(new App());
c = new CTCallCenter();
c.CallEventHandler = delegate (CTCall call)
{
if (call.CallState == call.StateIncoming)
{
}
else if (call.CallState == call.StateDialing)
{
}
else if (call.CallState == call.StateConnected)
{
try
{
MessagingCenter.Send<Object>(new Object(), "CallConnected");
}
catch (Exception ex)
{
}
}
else if (call.CallState == call.StateDisconnected)
{
try {
MessagingCenter.Send<Object>(new Object(), "CallEnded");
}
catch( Exception ex)
{
}
}
};
return base.FinishedLaunching(app, options);
}
public CTCallCenter c{get;set;}
公共覆盖bool FinishedLaunching(UIApplication应用程序、NSDictionary选项)
{
全局::Xamarin.Forms.Forms.Init();
加载应用程序(新应用程序());
c=新CTCallCenter();
c、 CallEventHandler=委托(CTCall-call)
{
if(call.CallState==call.StateIncoming)
{
}
else if(call.CallState==call.statedilling)
{
}
else if(call.CallState==call.StateConnected)
{
尝试
{
Send(新对象(),“CallConnected”);
}
捕获(例外情况除外)
{
}
}
else if(call.CallState==call.StateDisconnected)
{
试试{
Send(新对象(),“被调用”);
}
捕获(例外情况除外)
{
}
}
};
返回基地。完成发射(应用程序,选项);
}
对于ios,我根据消息中心的值计算了时差,并在我的共享代码中得到了通话持续时间,如下所示
try
{
PhoneDialer.Open(number);
MessagingCenter.Subscribe<Object>(this, "CallConnected", (sender) => {
CallStartTime = DateTime.Parse(DateTime.Now.ToString("hh:mm:ss"));
});
MessagingCenter.Subscribe<Object>(this, "CallEnded", (sender) => {
CallEndTime = DateTime.Parse(DateTime.Now.ToString("hh:mm:ss"));
CallDuration = CallEndTime - CallStartTime;
});
}
catch (FeatureNotSupportedException ex)
{
// Phone Dialer is not supported on this device.
}
试试看
{
电话拨号器。打开(号码);
MessagingCenter.Subscribe(此“CallConnected”,(发件人)=>{
CallStartTime=DateTime.Parse(DateTime.Now.ToString(“hh:mm:ss”);
});
MessagingCenter.Subscribe(此为“被调用的”),(发件人)=>{
CallEndTime=DateTime.Parse(DateTime.Now.ToString(“hh:mm:ss”);
CallDuration=CallEndTime-CallStartTime;
});
}
捕获(功能不支持例外)
{
//此设备不支持电话拨号程序。
}
Android部分
我使用了Xamarin essential来移动拨号器
*获取上次呼叫号码的持续时间:
在Android文件夹中创建了名为拨号程序的依赖项
[assembly: Dependency(typeof(Dialer))]
namespace DialerDemo.Droid
{
class Dialer : ICallerDialer
{
public string GetCallLogs()
{
string queryFilter = String.Format("{0}={1}", CallLog.Calls.Type, (int)CallType.Outgoing);
string querySorter = String.Format("{0} desc ", CallLog.Calls.Date);
ICursor queryData1 = Android.App.Application.Context.ContentResolver.Query(CallLog.Calls.ContentUri, null, queryFilter ,null, querySorter);
int number = queryData1.GetColumnIndex(CallLog.Calls.Number);
int duration1 = queryData1.GetColumnIndex(CallLog.Calls.Duration);
if (queryData1.MoveToFirst() == true)
{
String phNumber = queryData1.GetString(number);
String callDuration = queryData1.GetString(duration1);
return callDuration;
}
return string.Empty;
}
}
}
在我的共享代码中创建了接口
namespace DialerDemo
{
public interface ICallerDialer
{
string GetCallLogs();
}
}
为了在android中获得通话持续时间,我在MainPage.xaml.cs中这样称呼它
var duration = DependencyService.Get<ICallerDialer>().GetCallLogs();
var duration=DependencyService.Get().GetCallLogs();
ios部分
在Appdelegate类中,我添加了apple telephony API代码
public CTCallCenter c { get; set; }
public override bool FinishedLaunching(UIApplication app, NSDictionary options)
{
global::Xamarin.Forms.Forms.Init();
LoadApplication(new App());
c = new CTCallCenter();
c.CallEventHandler = delegate (CTCall call)
{
if (call.CallState == call.StateIncoming)
{
}
else if (call.CallState == call.StateDialing)
{
}
else if (call.CallState == call.StateConnected)
{
try
{
MessagingCenter.Send<Object>(new Object(), "CallConnected");
}
catch (Exception ex)
{
}
}
else if (call.CallState == call.StateDisconnected)
{
try {
MessagingCenter.Send<Object>(new Object(), "CallEnded");
}
catch( Exception ex)
{
}
}
};
return base.FinishedLaunching(app, options);
}
public CTCallCenter c{get;set;}
公共覆盖bool FinishedLaunching(UIApplication应用程序、NSDictionary选项)
{
全局::Xamarin.Forms.Forms.Init();
加载应用程序(新应用程序());
c=新CTCallCenter();
c、 CallEventHandler=委托(CTCall-call)
{
if(call.CallState==call.StateIncoming)
{
}
else if(call.CallState==call.statedilling)
{
}
else if(call.CallState==call.StateConnected)
{
尝试
{
Send(新对象(),“CallConnected”);
}
捕获(例外情况除外)
{
}
}
else if(call.CallState==call.StateDisconnected)
{
试试{
Send(新对象(),“被调用”);
}
捕获(例外情况除外)
{
}
}
};
返回基地。完成发射(应用程序,选项);
}
对于ios,我根据消息中心的值计算了时差,并在我的共享代码中得到了通话持续时间,如下所示
try
{
PhoneDialer.Open(number);
MessagingCenter.Subscribe<Object>(this, "CallConnected", (sender) => {
CallStartTime = DateTime.Parse(DateTime.Now.ToString("hh:mm:ss"));
});
MessagingCenter.Subscribe<Object>(this, "CallEnded", (sender) => {
CallEndTime = DateTime.Parse(DateTime.Now.ToString("hh:mm:ss"));
CallDuration = CallEndTime - CallStartTime;
});
}
catch (FeatureNotSupportedException ex)
{
// Phone Dialer is not supported on this device.
}
试试看
{
电话拨号器。打开(号码);
MessagingCenter.Subscribe(此“CallConnected”,(发件人)=>{
CallStartTime=DateTime.Parse(DateTime.Now.ToString(“hh:mm:ss”);
});
MessagingCenter.Subscribe(此为“被调用的”),(发件人)=>{
CallEndTime=DateTime.Parse(DateTime.Now.ToString(“hh:mm:ss”);
CallDuration=CallEndTime-CallStartTime;
});
}
捕获(功能不支持例外)
{
//此设备不支持电话拨号程序。
}
在android平台上,您可以通过依赖服务来实现,然后通过光标通过android数据库读取通话时长。有一个类似的例子@LeonLu MSFT bro关于ios呢?嘿@AndroDevil是的,在ios上也可以这样做,使用CallKit您可以覆盖IsConnected属性上的Setter,这样当它为真时,您启动计时器,当它为假时,您停止计时器。没有这样的财产。@Saamer谢谢你提供的信息。让我检查一下that@Saamerbro callkit是用于Voip的,对吗?我不需要voip呼叫,我只需要安卓平台上正常的呼叫日志,你可以通过依赖服务来实现,然后通过游标通过安卓数据库读取呼叫持续时间。有一个类似的例子@