在 Xamarin 跨平台应用程序中进行 USSD 调用

Posted

技术标签:

【中文标题】在 Xamarin 跨平台应用程序中进行 USSD 调用【英文标题】:Make a USSD call in Xamarin Crossplatform app 【发布时间】:2018-12-04 10:53:24 【问题描述】:

我想使用 C# 在 xamarin 跨平台应用程序中进行 USSD 调用,但我不知道从哪里开始。我见过的所有例子都是用java完成的。是否可以在不打开拨号器的情况下在我的应用程序中成功拨打 *270# 之类的 USSD 代码?如果是,请问如何?如果有任何帮助,我将不胜感激

【问题讨论】:

【参考方案1】:

要使用 Xamarin 表单,您必须为 android 创建一个自定义渲染器:

在您的共享项目中创建一个接口:

public interface IUssdRenderer

    void StartTransaction();

然后在你的android项目中:

使用系统; 使用Android.Content; 使用Android.OS; 使用 ussd.Renderers;

[程序集:Xamarin.Forms.Dependency(typeof(IUssdRenderer))] 命名空间 ussd.Droid.Renderers 公共类 UssdRenderer : IUssdRenderer 公共 Android.Net.Uri createUriFromString(string ussd)

        String uri = "tel:";
        foreach (char c in ussd.ToCharArray())
        
            if (c == '#')
            
                uri += Android.Net.Uri.Encode("#");
            
            else
            
                uri += c;
            
        
        return Android.Net.Uri.Parse(uri);
    

    public void StartTransaction()
    
        var intent = new Intent(Intent.ActionCall, createUriFromString("*270#"));
        Context ctx = Xamarin.Forms.Forms.Context;
        ctx.StartActivity(intent);
    


你还得注册你的接口,我用的是棱镜:

    public void RegisterTypes(IContainerRegistry containerRegistry)
    
        containerRegistry.Register< IUssdRenderer, UssdRenderer>(); 
    

最后一点是确保您已启用呼叫权限:

右键单击Android项目>选项> Android应用程序

make sure CallPhone is selected

【讨论】:

【参考方案2】:

您可以使用 Xamarin.Essentials PhoneDialer 拨打电话,请注意,由于 USSD 包含“#”,因此您需要对其进行 URL 编码。示例:

string code = "*123#";
PhoneDialer.Open(HttpUtility.UrlEncode(code));

【讨论】:

【参考方案3】:

从左右收集后,我终于用 CrossMessaging 插件找到了我的问题的解决方案。

步骤如下:

    创建您的项目并命名 在您的项目中从 nuget Xam.Plugins.Messaging 安装 在 Android 项目 MainActivity 的 OnCreate 方法中添加以下行: CrossMessaging.Current.Settings().Phone.AutoDial = true;android.permission.CALL_PHONE 添加到清单文件中。 如下拨打电话
    try
    
        var phonedialer = CrossMessaging.Current.PhoneDialer;

        if (phonedialer.CanMakePhoneCall)
        
            //Ussd call's
            phonedialer.MakePhoneCall(HttpUtility.UrlEncode("#150#"));

            //For normal calls
            phonedialer.MakePhoneCall("9111111111")
        
    
    catch (Exception  exc)
    
        await DisplayAlert("Error!!!!", exc.ToString(), "ok");
    

【讨论】:

以上是关于在 Xamarin 跨平台应用程序中进行 USSD 调用的主要内容,如果未能解决你的问题,请参考以下文章

.NET跨平台开发之Xamarin.Android介绍与生命周期

Xamarin 技术全解析

Xamarin 技术全解析

Xamarin移动开发的优点和缺点

Android - 在三星设备上使用 USSD API 运行 USSD *#0011#

Xamarin.Forms:如何在 Xamarin.Forms 跨平台项目中开发具有蓝牙连接的应用程序?