Xamarin表格获取通话时间

时间:2019-06-07 12:09:37

标签: c# xamarin xamarin.forms

我有一个xamarin.forms应用程序,当单击标签时,它将打开拨号程序。我想要实现的是

  1. 用户单击“标签”->拨号器(iOS中的Phone App)打开
  2. 用户通话和结束->返回应用程序

单击标签时我可以打开拨号器。

我可以在应用程序中获取通话时间吗?可能吗?如果没有,还有其他变通方法,例如计算从XF应用程序移至拨号器时的空闲状态时间。请指导

1 个答案:

答案 0 :(得分:0)

Android部件

我使用了Xamarin来进行拨号。

*用于获取最后通话号码的持续时间:

在名为 ICallerDialer

的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(); 
    }
} 

在我的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);
}

我根据消息传递中心的值计算了时差,并在共享代码中获得了通话时间。