Android 部分
我使用 Xamarin 必不可少的移动到拨号器。
*获取最后被叫号码的持续时间:
在 Android 文件夹中创建了一个名为 Dialer
的依赖项
[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 中获取通话时长,在 My MainPage.xaml.cs 中我这样称呼它。
var duration = DependencyService.Get<ICallerDialer>().GetCallLogs();
ios部分
在 Appdelegate 类中,我添加了苹果电话 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);
}
对于 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.
}