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

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

我正在考虑自动调用返回这个数据的USSD代码(每个networking都必须有一个正则expression式),每隔一段时间(通常不要节省电池)。 这将不得不在后台完成。 我现在有一个应用程序运行ussd代码并返回结果,所以我认为这应该是可能的 – 但我不知道如何在后台完成。

我已经看到了拨打号码的意图,但是我不知道如何得到结果,我还在想这个意图会使呼叫屏幕出现在前台?

另一个select是通过从运营商的网站/ wap站点抓取结果来获取数据,但这会导致用户收取数据费用,所以我宁愿使用USSD代码的解决scheme。

提前感谢任何帮助 – 今天才开始了解Android的工作,所以有相当多的学习:)

Solutions Collecting From Web of "在后台调用USSD代码(并获得响应)?"

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

你可以使用下面的代码调用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); 

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

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

您可以通过下面的代码发送一个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" /> 

运行代码 – >通过设置 – >辅助function – > [您的应用程序名称] – >启用可访问性。 任务完成!

USSD呼叫interuptn尚未支持Android