【发布时间】:2018-12-04 10:53:24
【问题描述】:
我想使用 C# 在 xamarin 跨平台应用程序中进行 USSD 调用,但我不知道从哪里开始。我见过的所有例子都是用java完成的。是否可以在不打开拨号器的情况下在我的应用程序中成功拨打 *270# 之类的 USSD 代码?如果是,请问如何?如果有任何帮助,我将不胜感激
【问题讨论】:
标签: c# xamarin xamarin.android cross-platform ussd
我想使用 C# 在 xamarin 跨平台应用程序中进行 USSD 调用,但我不知道从哪里开始。我见过的所有例子都是用java完成的。是否可以在不打开拨号器的情况下在我的应用程序中成功拨打 *270# 之类的 USSD 代码?如果是,请问如何?如果有任何帮助,我将不胜感激
【问题讨论】:
标签: c# xamarin xamarin.android cross-platform ussd
要使用 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
【讨论】:
您可以使用 Xamarin.Essentials PhoneDialer 拨打电话,请注意,由于 USSD 包含“#”,因此您需要对其进行 URL 编码。示例:
string code = "*123#";
PhoneDialer.Open(HttpUtility.UrlEncode(code));
【讨论】:
从左右收集后,我终于用 CrossMessaging 插件找到了我的问题的解决方案。
步骤如下:
Xam.Plugins.Messaging 安装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");
}
【讨论】: