Xamarin 表单获取通话时间

Posted

技术标签:

【中文标题】Xamarin 表单获取通话时间【英文标题】:Xamarin forms get call duration 【发布时间】:2019-06-07 12:09:37 【问题描述】:

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

    用户点击标签-->拨号器(ios中的电话应用)打开 用户调用和结束-->返回应用

点击标签可以打开拨号器。

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

【问题讨论】:

android平台可以通过依赖服务来实现,然后通过Cursor读取Android Database的调用时长。有一个类似的案例forums.xamarin.com/discussion/155644/… @LeonLu-MSFT 兄弟 ios 呢? 嘿 @AndroDevil 是的,也可以在 iOS 上使用 CallKit docs.microsoft.com/en-us/xamarin/ios/platform/callkit 您可以覆盖 IsConnected 属性上的 Setter,以便当它为真时,您启动计时器,当它为假时,你停止计时器。没有这样的财产。 @Saamer 感谢您的信息。让我检查一下 @Saamer bro callkit 适用于 Voip 对吗?我不想要 voip 通话。我只想要正常的通话记录 【参考方案1】:

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.  
            

【讨论】:

以上是关于Xamarin 表单获取通话时间的主要内容,如果未能解决你的问题,请参考以下文章

获取联系人图片 Xamarin 表单

通过 Xamarin 表单中的 URL 获取 HTML

从 ViewModel Xamarin 中的动态表单中获取条目值

Xamarin 表单从另一个视图获取数据

在 LongPress 上显示 ContextMenu 以获取 xamarin 表单中的视图

华为。使用 Push Kit 从通知中获取 data(title, body, sentTime)。 Xamarin 表单