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

Make a USSD call in Xamarin Crossplatform app

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

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

在您的共享项目中创建一个界面:

public interface IUssdRenderer
{
    void StartTransaction();
}

然后在您的 android 项目中:

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

[程序集:Xamarin.Forms.Dependency(typeof(IUssdRenderer))] 命名空间 ussd.Droid.Renderers { public class UssdRenderer : IUssdRenderer { public Android.Net.Uri createUriFromString(字符串 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);
    }
}
}

你还需要注册你的界面,我用的是 prism :

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

最后一点是确保您启用了通话权限:

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

make sure CallPhone is selected

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

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

经过左右搜罗,终于用CrossMessaging插件找到了解决我问题的方法。

步骤如下:

  1. 创建项目并命名
  2. 从项目中的 nuget Xam.Plugins.Messaging 安装
  3. 在 Android 项目 MainActivity 的 OnCreate 方法中添加以下行: CrossMessaging.Current.Settings().Phone.AutoDial = true;
  4. android.permission.CALL_PHONE 添加到清单文件。
  5. 调用如下
    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");
    }