Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/301.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Xamarin表单获取调用持续时间_C#_Xamarin_Xamarin.forms - Fatal编程技术网

C# Xamarin表单获取调用持续时间

C# Xamarin表单获取调用持续时间,c#,xamarin,xamarin.forms,C#,Xamarin,Xamarin.forms,我有一个xamarin.forms应用程序,当标签点击时,它会打开拨号程序 用户单击标签-->拨号器(ios中的电话应用程序)打开 用户呼叫并结束-->返回应用程序 我可以在点击标签时打开拨号器 我可以在我的应用程序中获取通话持续时间吗?是否有可能?如果没有,是否有其他解决方法,如计算从XF应用程序移动到拨号器时的空闲状态时间。请指导Android部分 我使用了Xamarin essential来移动拨号器 *获取上次呼叫号码的持续时间: 在Android文件夹中创建了名为拨号程序的依赖项 [a

我有一个xamarin.forms应用程序,当标签点击时,它会打开拨号程序

  • 用户单击标签-->拨号器(ios中的电话应用程序)打开
  • 用户呼叫并结束-->返回应用程序
  • 我可以在点击标签时打开拨号器


    我可以在我的应用程序中获取通话持续时间吗?是否有可能?如果没有,是否有其他解决方法,如计算从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呼叫,我只需要安卓平台上正常的呼叫日志,你可以通过依赖服务来实现,然后通过游标通过安卓数据库读取呼叫持续时间。有一个类似的例子@