【发布时间】:2011-03-29 19:05:19
【问题描述】:
一些自定义拨号器应用(例如,MotoBlur 的拨号器)能够执行 USSD 请求。通过SDK真的不可能做到这一点吗?
【问题讨论】:
一些自定义拨号器应用(例如,MotoBlur 的拨号器)能够执行 USSD 请求。通过SDK真的不可能做到这一点吗?
【问题讨论】:
在 API26 中添加了 Ussd api。 因此,由于 Oreo 与 ussd 合作看起来像这样:
TelephonyManager manager = (TelephonyManager)getSystemService(TELEPHONY_SERVICE);
manager.sendUssdRequest("*100#", new TelephonyManager.UssdResponseCallback() {
@Override
public void onReceiveUssdResponse(TelephonyManager telephonyManager, String request, CharSequence response) {
super.onReceiveUssdResponse(telephonyManager, request, response);
}
@Override
public void onReceiveUssdResponseFailed(TelephonyManager telephonyManager, String request, int failureCode) {
super.onReceiveUssdResponseFailed(telephonyManager, request, failureCode);
}
}, new Handler());
TelephonyManager manager2 = manager.createForSubscriptionId(subIdForSecondSlotFromSubscriptonManager);
manager2.sendUssdRequest(...);
要获取 simID,您可以使用以下方法:
SubscriptionManager subscriptionManager = (SubscriptionManager) getSystemService(Context.TELEPHONY_SUBSCRIPTION_SERVICE);
List<SubscriptionInfo> subscriptionInfoList = subscriptionManager.getActiveSubscriptionInfoList();
for (SubscriptionInfo subscriptionInfo : subscriptionInfoList) {
int subscriptionId = subscriptionInfo.getSubscriptionId();
Log.d("Sims", "subscriptionId:" + subscriptionId);
}
if (subscriptionInfoList != null) {
if (subscriptionInfoList.size() == 1) {
sim1 = subscriptionInfoList.get(0).getDisplayName().toString();
tvSim1.setText(sim1);
} else {
sim1 = subscriptionInfoList.get(0).getDisplayName().toString();
sim2 = subscriptionInfoList.get(1).getDisplayName().toString();
tvSim1.setText(sim1);
tvSim2.setText(sim2);
}
}
【讨论】:
manager2 createForSubscriptionId 的代码.... 所以现在我的 USSD 还没有发送
subIdForSecondSlotFromSubscriptonManager 的值?另外,第一个插槽是否有 subIdForFirstSlotFromSubscriptonManager 值?我是说如果插槽 2 是我的双卡手机中的主插槽
List<SubscriptionInfo> sims = SubscriptionManager.from(context).getActiveSubscriptionInfoList(); for(SubscriptionInfo subInfo : sims){ ... slotIndex = subInfo.getSimSlotIndex() ... subscriptionForSlot = subInfo.getSubscriptionId() }的订阅
您可以拦截 USSD 响应,为此您需要实现 IExtendedNetworkService.aidl 接口,该接口将服务与 PhoneUtils 绑定。然后它可以拦截任何 USSD 响应,您可以轻松地在您的应用程序中读取它。 供参考 https://github.com/alaasalman/ussdinterceptor
【讨论】:
您可以像任何其他号码一样拨打 ussd 请求,呼叫意图如下:
String encodedHash = Uri.encode("#");
String ussd = "*" + encodedHash + "12345" + encodedHash;
startActivityForResult(new Intent("android.intent.action.CALL", Uri.parse("tel:" + ussd)), 1);
但是,afaik,目前无法在您的应用中解析结果字符串。
【讨论】:
Uri.fromParts("tel", "*#12345#", null)。你不需要编码/解析。
从 Android O 开始,可以使用 TelephonyManager 发送 USSD 请求。
【讨论】:
希望它对你有用:
String suffix = Uri.encode("#");
String ussd = suffix+"919"+"*"+number+suffix;
Intent callIntent = new Intent(Intent.ACTION_CALL);
callIntent.setData(Uri.parse("tel:"+ ussd));
startActivity(callIntent);
【讨论】: