如何在 Xamarin Forms 中从 DependencyServic 打开 ActionCall Activity?

有创造力的

嗨,我面临一个非常简单的问题,但我不确定为什么?

我试图直接从 xamarin 表单应用程序呼叫,而不显示拨号器屏幕,用户将在屏幕中看到其联系人列表,单击一个按钮进行呼叫,并且它会在不显示拨号器屏幕的情况下直接拨打电话。

为了实现这一点,我使用了 DependencyServic,并将其用作我的基础https://www.c-sharpcorner.com/UploadFile/e4bad6/code-to-start-call-in-xamarin-forms/

唯一的区别是这是 PCL,我正在使用共享库

我在哪里遇到问题?

我的界面

public interface IPhoneCall
    {
        void MakeQuickCall(string PhoneNumber);
    }

我对依赖服务的调用

private void makeCall_Clicked(object sender, EventArgs e)
        {
            try
            {
                DependencyService.Get<IPhoneCall>().MakeQuickCall("+xxxxxxxxx");
            } catch(Exception ex)
            {
                DisplayAlert("Alert!!!", ex.Message, "ok");
            }
        }

Android 的 My Dependency 服务调用:

[assembly: Dependency(typeof(PhoneCall_Droid))]
namespace MakeCall.Droid
{
    public class PhoneCall_Droid : IPhoneCall
    {
        public void MakeQuickCall(string PhoneNumber)
        {
            try
            {
                var uri = Android.Net.Uri.Parse(string.Format("tel:{0}", PhoneNumber));
                var intent = new Intent(Intent.ActionCall, uri);
                Xamarin.Forms.Forms.Context.StartActivity(intent);
            }
            catch (Exception ex)
            {
                new AlertDialog.Builder(Android.App.Application.Context).SetPositiveButton("OK", (sender, args) =>
                {
                    //User pressed OK
                })
                .SetMessage(ex.ToString())
                .SetTitle("Android Exception")
                .Show();
            }
        }

    }
}

此警报返回异常无法添加窗口 - 令牌空无效;您的活动正在运行吗?

我看过像这样的不同解决方案

Intent ActionCall 不以 xamarin 形式拨打电话

和这个https://forums.xamarin.com/discussion/129166/unable-to-add-window-token-null-is-not-for-an-application-alertbuilder

但我仍然无法解决这个问题,

我也在我的主要活动中尝试过这个

internal static MainActivity Instance { get; private set; }

然后在OnCreate方法中添加这一行

Instance = this;

并将我的 Android 依赖服务类方法更改为此

public void MakeQuickCall(string PhoneNumber)
        {
            var context = MainActivity.Instance;
            try
            {

                new AlertDialog.Builder(context ).SetPositiveButton("OK", (sender, args) =>
                {
                    //User pressed OK
                })
                .SetMessage(Android.Net.Uri.Parse(string.Format("tel:{0}", PhoneNumber)).ToString())
                .SetTitle("Android Exception")
                .Show();



                Intent intent = new Intent(Intent.ActionCall, Android.Net.Uri.Parse(string.Format("tel:{0}", PhoneNumber)));
                context.StartActivity(intent);
            }
            catch (Exception ex)
            {
                new AlertDialog.Builder(Android.App.Application.Context).SetPositiveButton("OK", (sender, args) =>
                {
                    //User pressed OK
                })
                .SetMessage(ex.ToString())
                .SetTitle("Android Exception")
                .Show();
            }
        }

并且通过执行此警报显示已拨电话号码,但它没有呼叫并且呼叫部分仍然显示无法添加窗口..,

Cherry Bu - MSFT

我可以在我身边重现您的问题,如果您在 Android 6.0 之后请求运行时权限,您将解决您的问题。

首先,您可以在 MainActiviy 中定义一个静态变量:

 public static MainActivity macvivity;

    protected override void OnCreate(Bundle savedInstanceState)
    {
        TabLayoutResource = Resource.Layout.Tabbar;
        ToolbarResource = Resource.Layout.Toolbar;
        base.OnCreate(savedInstanceState);

        macvivity = this;    

        global::Xamarin.Forms.Forms.Init(this, savedInstanceState);          
        LoadApplication(new App());


    }

然后在调用之前请求权限:

 public void MakeQuickCall(string PhoneNumber)
    {
        try
        {
            if (ActivityCompat.CheckSelfPermission(MainActivity.macvivity, Android.Manifest.Permission.CallPhone) != Android.Content.PM.Permission.Granted)
            {

                ActivityCompat.RequestPermissions(MainActivity.macvivity, new string[] { Android.Manifest.Permission.CallPhone }, 1);
                return;
            }
            else
            {
                var uri = Android.Net.Uri.Parse(string.Format("tel:{0}", PhoneNumber));
                var intent = new Intent(Intent.ActionCall, uri);
                Xamarin.Forms.Forms.Context.StartActivity(intent);
                //MainActivity.macvivity.StartActivity(intent);
            }               
        }
        catch (Exception ex)
        {
            new AlertDialog.Builder(Android.App.Application.Context).SetPositiveButton("OK", (sender, args) =>
            {
                //User pressed OK
            })
            .SetMessage(ex.ToString())
            .SetTitle("Android Exception")
            .Show();
        }
    }

如果我的回复对您有帮助,请记得将我的回复标记为回复,谢谢。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何在Xamarin.Forms中修改WebView以在设备上的浏览器中打开链接?

如何在xamarin.forms中的应用程序中打开设置?

如何在Xamarin Forms App中拦截Android设备的音量增大/减小按钮以打开相机?

如何在Xamarin Forms的默认应用程序中打开PDF或TXT文件

如何在 Xamarin Forms 中打开默认电子邮件应用收件箱

在Xamarin.Forms中打开通知

如何使Xamarin Forms关闭打开的滑动视图?

如何在Xamarin.forms中恢复应用程序并打开带有推送通知的特定页面

OneSignal:如何处理Xamarin.Forms应用的AppDelegate中打开的通知?

如何使用 Xamarin Forms 中的按钮打开手机上安装的 Slack 应用程序?

如何在Activity(non-AppCompatAcitivity)中打开片段?[Android]

如何在Activity(non-AppCompatAcitivity)中打开片段?

Xamarin Forms HybridWebview始终在浏览器中打开

如何在Xamarin.Forms中的网格中启用边框

如何通过Xamarin Forms代码从Android Fragment打开或访问数据?

如何在Android Xamarin.Forms中修复Renderer警告

如何在Xamarin.Forms中显示“向上” /“返回”按钮?

如何在Xamarin.Forms中绑定Picker

如何在Xamarin.Forms XAML中绘制路径

如何在xamarin.forms中升级Firebase crashlytics

如何在Xamarin Forms for iOS中创建导航栏?

如何在 Xamarin.Forms 中实现 Android 服务

如何在Xamarin.Forms中隐藏Android ActionBar?

如何在Xamarin Forms中处理/取消向后导航

如何在Xamarin.forms中实现面板功能

如何在Xamarin Forms中向文本单元添加图标

如何在xamarin.forms中制作日历视图?

如何在Xamarin.Forms中强制使用灯光模式?

如何在Xamarin Forms网格布局中嵌入图像