在安卓手机上进行USSD呼叫

18

为了首先检查余额,我需要打电话*xxx#,然后我会收到一个带有多个选项供选择的响应,之后输入特定号码就能查询余额。

我在我的Android应用程序中可以使用什么代码来实现相同的功能?

拨打*xxx*x#出错了。

下面是我的代码,对于*xxx#的呼叫可以正常工作:

String encodedHash = Uri.encode("#");
String ussd = "*" + encodedHash + lCallNum + encodedHash;
startActivity(new Intent(Intent.ACTION_CALL, Uri.parse("tel:" + ussd)));

可能是https://dev59.com/yWXWa4cB1Zd3GeqPLUrF?rq=1的重复,请查看这个Stack Overflow问题。 - user1725145
这不是上述问题的可能重复。我想知道在拨打*XXX#时,上述场景的USSD代码格式将是什么,其中会给我提供选项列表,例如1.预付费2.互联网等等...并且在输入1后,我会得到另一组可供选择的选项,例如输入1以获取余额,输入2以获取其他内容等等... - AndroGeek
发送USSD代码并不等同于拨打电话号码。您是否有用于USSD的Android接口?在回答这个问题时,很明显截至2012年11月,还没有足够的USSD接口。现在情况是否已经改变了呢? - user1725145
似乎USSD问题仍未解决。 - user1725145
1
USSD消息并不是标准化的,因此消息本身的格式取决于运营商或USSD用户定义的内容。 - user1725145
6个回答

27

这对我有效:

private Uri ussdToCallableUri(String ussd) {

    String uriString = "";

    if(!ussd.startsWith("tel:"))
        uriString += "tel:";

    for(char c : ussd.toCharArray()) {

        if(c == '#')
            uriString += Uri.encode("#");
        else
            uriString += c;
    }

    return Uri.parse(uriString);
}

然后在工作代码中:

Intent callIntent = new Intent(Intent.ACTION_CALL, ussdToCallableUri(yourUSSDCodeHere));
startActivity(callIntent);

10

不要忘记添加权限,这将解决Skype的问题 :P

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

6
String ussd = "*XXX*X" + Uri.encode("#");
startActivity(new Intent(Intent.ACTION_CALL, Uri.parse("tel:" + ussd)));

这对我非常有效。只需将第一串内容保持不变,然后对#进行编码,使它成为一个完整的*XXX*X#。这将绝对有所帮助。

你能获取手机的余额吗?能帮我提供一些链接和代码片段吗?@AndroGeek - Srishti Roy

6

需要记住的重要事项:

如果您的目标是 Android Marshmallow (6.0) 或更高版本,则需要在运行时请求 Manifest.permission.CALL_PHONE 权限。


2
你可以使用这段代码。它对我有效:

你可以使用这段代码。它对我有效:

Intent intent = new Intent(Intent.ACTION_CALL);
intent.setData(Uri.parse(Uri.parse("tel:" + "*947") + Uri.encode("#")));
startActivity(intent);

2
使用这段代码,它有效。
Intent callIntent = new Intent(Intent.ACTION_CALL);
String ussdCode = "*" + 2 + Uri.encode("#");
callIntent.setData(Uri.parse("tel:" +ussdCode));

if (ActivityCompat.checkSelfPermission(MainActivity.this,
                    Manifest.permission.CALL_PHONE) != PackageManager.PERMISSION_GRANTED) {
                return;
            }
startActivity(callIntent);

请在清单文件中添加此行。
<uses-permission android:name="android.permission.CALL_PHONE" />

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接