You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

基于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

火山引擎 最新活动