如何在for循环中使用startActivityForResult运行USSD代码
解决循环执行USSD代码时的"Connection problem or invalid MMI code"错误
你遇到的问题核心在于循环内连续调用startActivityForResult发起USSD请求——系统没办法在极短时间内处理多个连续的CALL/USSD会话,前一个请求还没完成,下一个就被触发,导致系统判定为无效请求或者出现连接冲突。而单次执行时系统有足够时间处理流程,所以能成功。
下面给你两种可行的解决方案:
方案1:用Handler设置延迟逐个发起请求
给每个USSD请求之间预留足够的处理时间,让系统能完成上一个会话再执行下一个:
final String encodedHash = Uri.encode("#"); // 先把要执行的USSD请求整理成列表 List<String> ussdRequests = Arrays.asList( "*804" + encodedHash, "*804" + encodedHash, "*804" + encodedHash, "*804" + encodedHash, "*804" + encodedHash ); Handler handler = new Handler(Looper.getMainLooper()); int delayMillis = 5000; // 5秒延迟,可根据设备实际情况调整 for (int i = 0; i < ussdRequests.size(); i++) { final int index = i; handler.postDelayed(() -> { startActivityForResult( new Intent("android.intent.action.CALL", Uri.parse("tel:" + ussdRequests.get(index))), 1 ); }, delayMillis * i); }
方案2:在onActivityResult中链式触发下一个请求
这种方式更可靠,能确保上一个USSD会话完全结束后,再发起下一个请求:
private int currentRequestCount = 1; private final int TOTAL_REQUESTS = 5; // 对应你原代码中j从1到9步长2,共5次请求 final String encodedHash = Uri.encode("#"); // 先发起第一个请求 startActivityForResult( new Intent("android.intent.action.CALL", Uri.parse("tel:" + "*804" + encodedHash)), 1 ); // 重写onActivityResult处理回调 @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == 1) { currentRequestCount++; if (currentRequestCount <= TOTAL_REQUESTS) { // 触发下一个USSD请求 startActivityForResult( new Intent("android.intent.action.CALL", Uri.parse("tel:" + "*804" + encodedHash)), 1 ); } } }
额外注意事项
- 如果你的应用目标API是30及以上,
startActivityForResult已被弃用,建议改用Activity Result API实现,核心逻辑类似,只是回调方式不同。 - 延迟时间需要根据测试调整,不同设备处理USSD的速度有差异,5秒是一个相对安全的初始值。
- 务必确保你的应用已经获取了
CALL_PHONE权限,否则会触发权限异常。
内容的提问来源于stack exchange,提问作者SYK'O
相关产品推荐
相关产品推荐

