You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何获取USSD消息字符串值?求API onClick集成分步指导

USSD API集成到Android onClick方法的分步指南

我看了你当前的代码,发现你同时使用了系统拨号Intent和USSD API的callUSSDInvoke方法,这会导致重复触发操作,而且系统拨号的方式无法捕获USSD的返回结果。下面是分步的集成指导,帮你正确完成需求:

1. 确认必要权限与配置

首先确保你的AndroidManifest.xml中添加了所需权限:

<uses-permission android:name="android.permission.CALL_PHONE" />
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />

同时,USSDController依赖辅助功能来监听USSD界面,你代码里的USSDController.verifyAccesibilityAccess(this)已经做了授权引导检查,这部分逻辑是正确的。

2. 修正onClick方法核心逻辑

你不需要同时启动系统拨号Intent,USSD API的callUSSDInvoke方法已经封装了拨号和结果监听的完整逻辑。修正后的onClick代码如下:

atidabira.setOnClickListener(new View.OnClickListener() {
    @RequiresApi(api = Build.VERSION_CODES.M)
    @Override
    public void onClick(View v) {
        // 构造正确编码的USSD指令
        String suffix = Uri.encode("#");
        String ussd = "*" + "804" + suffix;

        // 检查CALL_PHONE权限状态
        if (checkSelfPermission(Manifest.permission.CALL_PHONE) != PackageManager.PERMISSION_GRANTED) {
            String[] PERMISSIONS = {Manifest.permission.CALL_PHONE};
            ActivityCompat.requestPermissions(MainActivity.this, PERMISSIONS, REQUEST);
        } else {
            // 直接调用USSD API处理拨号与结果监听
            ussdApi.callUSSDInvoke(ussd, map, new USSDController.CallbackInvoke() {
                @Override
                public void responseInvoke(String message) {
                    // 拿到USSD返回的字符串消息,根据预设关键词判断后续操作
                    Toast.makeText(mContext, "USSD返回: " + message, Toast.LENGTH_SHORT).show();
                    
                    // 示例:匹配关键词分支处理
                    String lowerMsg = message.toLowerCase();
                    if (((HashSet)map.get("KEY_LOGIN")).contains(lowerMsg)) {
                        // 执行登录成功逻辑,比如跳转主页、更新用户状态
                        Toast.makeText(mContext, "操作成功!", Toast.LENGTH_SHORT).show();
                    } else if (((HashSet)map.get("KEY_ERROR")).contains(lowerMsg)) {
                        // 执行错误处理逻辑,比如提示用户重试、显示错误信息
                        Toast.makeText(mContext, "操作失败,请重试", Toast.LENGTH_SHORT).show();
                    }
                }

                @Override
                public void over(String message) {
                    // USSD会话结束时的回调,可在此做资源清理或用户提示
                    Toast.makeText(mContext, "USSD会话已结束", Toast.LENGTH_SHORT).show();
                }
            });
        }
    }
});

3. 补充权限授权后的处理逻辑

如果用户是第一次授权CALL_PHONE权限,你需要在权限回调中重新触发USSD调用,避免用户授权后无响应:

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    if (requestCode == REQUEST) {
        if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
            // 权限授权成功,重新执行USSD调用
            String suffix = Uri.encode("#");
            String ussd = "*" + "804" + suffix;
            ussdApi.callUSSDInvoke(ussd, map, new USSDController.CallbackInvoke() {
                @Override
                public void responseInvoke(String message) {
                    Toast.makeText(mContext, "USSD返回: " + message, Toast.LENGTH_SHORT).show();
                }

                @Override
                public void over(String message) {
                    Toast.makeText(mContext, "USSD会话已结束", Toast.LENGTH_SHORT).show();
                }
            });
        } else {
            Toast.makeText(mContext, "需要CALL_PHONE权限才能执行此操作", Toast.LENGTH_SHORT).show();
        }
    }
}

关键注意事项

  • 务必移除系统拨号Intent的代码:之前的startActivity(intent)会导致系统直接拨号,与API的调用逻辑冲突,且无法捕获USSD返回结果。
  • 关键词匹配要统一大小写:将返回消息转成小写后再与集合中的关键词对比,避免因大小写不一致导致匹配失败。

内容的提问来源于stack exchange,提问作者eshetu eliyas

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 10:17:54