如何获取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
相关产品推荐
相关产品推荐

