android ussd,java - android read USSD response - Stack Overflow

I'm trying to read USSD response to get Sim balance amount etc, and I'm having issues, I have been reading many questions related to that on Stackoverflow, nothing has worked so far. Except for this that came close: Prevent USSD dialog and read USSD response?. by @HenBoy331

But i'm still having issues with it. My broadcast receiver doesn't get called too. I'm using 4.4.2

But it shows nothing. I can't seem to parse the message and get the balance.

I have a MainActivity to make the phone call, ReceiverActivity to implement broadcast receiver, USSDService class to get the USSD response.

MainActivity.java

public class MainActivity extends AppCompatActivity {

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

startService(new Intent(this, USSDService.class));

dailNumber("100");

}

private void dailNumber(String code) {

String ussdCode = "*" + code + Uri.encode("#");

startActivity(new Intent("android.intent.action.CALL", Uri.parse("tel:" + ussdCode)));

}

}

RecieverActivity.java

public class RecieverActivity extends AppCompatActivity {

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

IntentFilter filter = new IntentFilter("com.times.ussd.action.REFRESH");

this.registerReceiver(new Receiver(), filter);

}

public class Receiver extends BroadcastReceiver {

private String TAG = "XXXX";

@Override

public void onReceive(Context context, Intent intent) {

String message = intent.getStringExtra("message");

Log.i(TAG, "Got message: " + message);

}

}

}

USSDService.java

public class USSDService extends AccessibilityService {

public String TAG = "XXXX";

@Override

public void onAccessibilityEvent(AccessibilityEvent event) {

Log.d(TAG, "onAccessibilityEvent");

AccessibilityNodeInfo source = event.getSource();

/* if (event.getEventType() == AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED && !event.getClassName().equals("android.app.AlertDialog")) { // android.app.AlertDialog is the standard but not for all phones */

if (event.getEventType() == AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED && !String.valueOf(event.getClassName()).contains("AlertDialog")) {

return;

}

if(event.getEventType() == AccessibilityEvent.TYPE_WINDOW_CONTENT_CHANGED && (source == null || !source.getClassName().equals("android.widget.TextView"))) {

return;

}

if(event.getEventType() == AccessibilityEvent.TYPE_WINDOW_CONTENT_CHANGED && TextUtils.isEmpty(source.getText())) {

return;

}

List eventText;

if(event.getEventType() == AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED) {

eventText = event.getText();

} else {

eventText = Collections.singletonList(source.getText());

}

String text = processUSSDText(eventText);

if( TextUtils.isEmpty(text) ) return;

// Close dialog

performGlobalAction(GLOBAL_ACTION_BACK); // This works on 4.1+ only

Log.d(TAG, text);

// Handle USSD response here

Intent intent = new Intent("com.times.ussd.action.REFRESH");

intent.putExtra("message", text);

sendBroadcast(intent);

}

private String processUSSDText(List eventText) {

for (CharSequence s : eventText) {

String text = String.valueOf(s);

// Return text if text is the expected ussd response

if( true ) {

return text;

}

}

return null;

}

@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 | AccessibilityEvent.TYPE_WINDOW_CONTENT_CHANGED;

info.feedbackType = AccessibilityServiceInfo.FEEDBACK_GENERIC;

setServiceInfo(info);

}

}

AndroidManifest

package="com.dialussd">

android:allowBackup="true"

android:icon="@mipmap/ic_launcher"

android:label="@string/app_name"

android:supportsRtl="true"

android:theme="@style/AppTheme">

android:name=".services.USSDService"

android:enabled="true"

android:exported="true"

android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE">

android:resource="@xml/config_service" />

Please, is there any way i'm implementing this wrongly, Or perhaps there is a new way to get USSD responses which works?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值