在后台调用(并获得)USSD代码的响应?

时间:2010-11-16 10:50:05

标签: android

我想写一个小部件显示用户的预付余额,剩余数据等。

我正在考虑自动调用USSD代码,该代码会每隔一段时间(不经常为了节省电池)返回此数据(必须为每个网络设置一个正则表达式)。这必须在后台完成。我现在有一个应用程序运行ussd代码并返回结果,所以我认为这应该是可能的 - 但我不确定它将如何在后台完成。

我已经看到了调用一个数字的意图,但我不确定如何得到结果,而且我还认为这个意图会导致调用屏幕进入前台?

另一种选择是通过屏幕抓取来自运营商网站/ wap网站的结果来获取数据,但这会导致用户收取数据费用,因此我更倾向于使用USSD代码的解决方案。

提前感谢您的任何帮助 - 今天才开始了解Android,因此需要学习很多东西:)

8 个答案:

答案 0 :(得分:14)

Android尚不支持USSD。有一项功能请求:http://code.google.com/p/android/issues/detail?id=1285

答案 1 :(得分:6)

您可以使用以下代码在Android手机上调用ussd代码来检查余额等......

   String s=calledittext.getText.toString();//calledittext is editText on the 
  //screen   from  which  can get the number
          if((s.startsWith("*"))&&(s.endsWith("#"))){
            //if true then it is a USSD call----
            callstring=s.substring(0, s.length()-1);
            callstring=callstring+Uri.encode("#");

    Log.d("CALL TYPE---------->", "USSD CALL"); 
        }else{
            callstring=s;   
    Log.d("CALL TYPE---------->", "Not a USSD CALL");   
    //Intent i=new Intent(android.content.Intent.ACTION_CALL,Uri.parse("tel:"+output.getText().toString()));
    //startActivity(i);
        }
    Intent i=new Intent(android.content.Intent.ACTION_CALL,Uri.parse("tel:"+callstring));
    startActivity(i);

答案 2 :(得分:5)

我不完全确定,但我认为Android上尚不支持USSD,但是您可以尝试这种解决方法:

startActivity(new Intent("android.intent.action.CALL",Uri.parse("tel:*123" + Uri.encode("#")));

答案 3 :(得分:5)

您可以通过以下代码发送USSD代码,还需要添加权限(这应该是Marshmallow更新后的运行时权限)

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

    String code = "*" + Uri.encode("#") + 456 + Uri.encode("#");
    startActivity(new Intent("android.intent.action.CALL", Uri.parse("tel:" + code)));

您可以按AccessibilityService

阅读USSD代码

以下是示例:

服务:

public class USSDService extends AccessibilityService {
    private static final String TAG = "USSDService";

    @Override
    public void onAccessibilityEvent(AccessibilityEvent event) {
        Log.d(TAG, "onAccessibilityEvent");
        String text = event.getText().toString();
        Log.d(TAG, text);
        }
    }

    @Override
    public void onInterrupt() {

    }

    @Override
    protected void onServiceConnected() {
        super.onServiceConnected();
        Log.d(TAG, "onServiceConnected");
        AccessibilityServiceInfo info = new AccessibilityServiceInfo();
        info.flags = AccessibilityServiceInfo.DEFAULT;
        info.packageNames = new String[]{"com.android.phone"};
        info.eventTypes = AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED;
        info.feedbackType = AccessibilityServiceInfo.FEEDBACK_GENERIC;
        setServiceInfo(info);
    }
}

AndroidManifest.xml:

<service android:name=".services.USSDService"
                android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE">
    <intent-filter>
        <action android:name="android.accessibilityservice.AccessibilityService" />
    </intent-filter>
    <meta-data android:name="android.accessibilityservice"
                    android:resource="@xml/config_service" /> // created below
</service>

res / xml / config_service.xml:

<?xml version="1.0" encoding="utf-8"?>
<accessibility-service xmlns:android="http://schemas.android.com/apk/res/android"
    android:accessibilityEventTypes="typeAllMask"
    android:accessibilityFeedbackType="feedbackSpoken"
    android:accessibilityFlags="flagDefault"
    android:canRetrieveWindowContent="true"
    android:description="@string/accessibility_description"
    android:notificationTimeout="100"
    android:packageNames="com.cootf.sims"
    android:settingsActivity="com.example.android.accessibility.ServiceSettingsActivity" />

运行代码 - &gt;通过设置启用辅助功能 - &gt;辅助功能 - &gt; [您的应用名称] - &gt;启用。工作完成!

答案 4 :(得分:1)

USSD呼叫中断是  尚未支持n Android

答案 5 :(得分:0)

Android O(API级别26)向sendUssdRequest添加了TelephonyManager方法,该方法还包括用于获取请求结果的回调。

docs

答案 6 :(得分:0)

Android 8 (Oreo) 及更高版本现在支持此功能。 这是代码。 TelephonyManager 类用于实现此目的。

 public void dialUssdToGetPhoneNumber(String ussdCode, int sim) {

    if (ussdCode.equalsIgnoreCase("")) return;



    if (ActivityCompat.checkSelfPermission(getActivity(), Manifest.permission.CALL_PHONE) != PackageManager.PERMISSION_GRANTED) {
        requestPermissions(new String[]{Manifest.permission.CALL_PHONE}, 234);
        return;
    }
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {


        TelephonyManager manager = (TelephonyManager) getActivity().getSystemService(TELEPHONY_SERVICE);
        TelephonyManager manager2 = manager.createForSubscriptionId(2);

        TelephonyManager managerMain = (sim == 0) ? manager : manager2;

        managerMain.sendUssdRequest(ussdCode, new TelephonyManager.UssdResponseCallback() {
            @Override
            public void onReceiveUssdResponse(TelephonyManager telephonyManager, String request, CharSequence response) {
                super.onReceiveUssdResponse(telephonyManager, request, response);

                Log.e("TAG", "onReceiveUssdResponse:  Ussd Response = " + response.toString().trim() );
        
               

            }

            @Override
            public void onReceiveUssdResponseFailed(TelephonyManager telephonyManager, String request, int failureCode) {
                super.onReceiveUssdResponseFailed(telephonyManager, request, failureCode);

                Log.e("TAG", "onReceiveUssdResponseFailed: " + "" + failureCode + request);
            }
        }, new Handler());
    }

}

答案 7 :(得分:0)

对于仍在寻找解决方案的任何人,有一个名为 AutoUssd (https://autoussd.com) 的平台,它可以让您完全做到这一点。它还支持多步 USSD 会话...