基于USSD应用开发Android应用:Java实现USSD请求收发可行吗?
能否用Java在Android平台实现USSD请求的发送与接收?
当然可以!用Java开发Android应用来处理USSD请求完全可行,不过这里有几个关键点和实现方案需要你留意——毕竟USSD的处理在Android系统里有一些权限和版本相关的限制。
核心实现方案
1. 发送USSD请求
基础方案(跳转系统拨号器)
最直接的方式是通过Intent调用系统拨号器发送USSD码,代码简单,但会离开你的应用,且需要CALL_PHONE权限:
String ussdCode = "*123#"; Intent dialIntent = new Intent(Intent.ACTION_CALL); // 对特殊字符(比如#)进行编码,避免解析错误 dialIntent.setData(Uri.parse("tel:" + Uri.encode(ussdCode))); startActivity(dialIntent);
进阶方案(应用内静默处理)
如果你想在应用内直接获取USSD响应,不跳转拨号器,Android 8.0(API 26)及以上提供了官方的TelephonyManager.sendUssdRequest()方法,这是最推荐的方案,需要READ_PHONE_STATE权限:
// 获取TelephonyManager实例 TelephonyManager telephonyManager = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE); // 先检查权限,Android 6.0+需要动态申请 if (ActivityCompat.checkSelfPermission(this, Manifest.permission.READ_PHONE_STATE) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_PHONE_STATE}, 1001); return; } String targetUssdCode = "*123#"; // 发送USSD请求并监听响应 telephonyManager.sendUssdRequest(targetUssdCode, new TelephonyManager.UssdResponseCallback() { @Override public void onReceiveUssdResponse(TelephonyManager manager, String request, CharSequence response) { // 成功收到USSD响应,在这里处理内容 Log.d("USSD_DEBUG", "收到响应: " + response.toString()); } @Override public void onReceiveUssdResponseFailed(TelephonyManager manager, String request, int failureCode) { // 请求失败,处理错误(比如网络问题、运营商限制) Log.e("USSD_DEBUG", "请求失败,错误码: " + failureCode); } }, new Handler(Looper.getMainLooper()));
2. 旧版本兼容(Android 8.0以下)
对于Android 8.0之前的系统,官方没有提供直接拦截USSD响应的API,只能通过AccessibilityService辅助服务监听系统拨号界面的文本内容来间接获取响应。这种方式属于变通方案,需要用户手动开启辅助权限,且在部分定制ROM上可能被限制,体验不如官方API。
关键注意事项
- 权限要求:Android 6.0及以上需要动态申请对应权限;Android 10(API 29)及以上,
READ_PHONE_STATE权限的获取更严格,可能需要用户授予特殊权限。 - 兼容性:部分国产定制ROM(如小米、华为)可能会限制应用调用USSD相关API,务必在目标设备上做兼容性测试。
- USSD码编码:USSD中的特殊字符(如
#、*)需要用Uri.encode()编码,避免解析错误。
内容的提问来源于stack exchange,提问作者I4seeu2




