2016-11-10 5 views
1

Я пытаюсь прочитать ответ USSD, чтобы получить сумму баланса Sim и т. Д., И у меня возникли проблемы. Я читал много вопросов, связанных с этим в Stackoverflow, до сих пор ничего не работало. Кроме того, что приблизилось: Prevent USSD dialog and read USSD response?. by @ HenBoy331android read USSD response

Но у меня все еще есть проблемы с ним. Мой широковещательный приемник тоже не называется. Я использую 4.4.2

Но это ничего не показывает. Я не могу разобрать сообщение и получить баланс.

У меня есть MainActivity, чтобы позвонить по телефону, ReceiverActivity, чтобы реализовать широковещательный приемник, USSDService класс, чтобы получить ответ USSD.

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<CharSequence> 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<CharSequence> 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

<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.dialussd"> 

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


    <application 
     android:allowBackup="true" 
     android:icon="@mipmap/ic_launcher" 
     android:label="@string/app_name" 
     android:supportsRtl="true" 
     android:theme="@style/AppTheme"> 
     <activity android:name=".MainActivity"> 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 

       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
     </activity> 


     <service 
      android:name=".services.USSDService" 
      android:enabled="true" 
      android:exported="true" 
      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" /> 
     </service> 

     <receiver android:name=".RecieverActivity$Receiver" > 
      <intent-filter> 
       <action android:name="android.intent.action.BOOT_COMPLETED" /> 
      </intent-filter> 
     </receiver> 



    </application> 

</manifest> 

Пожалуйста, есть ли способ, которым я реализую это неправильно, или, возможно, есть новый способ получить ответы USSD, которые работают?

+0

Привет, читайте это сообщение http://stackoverflow.com/a/37339004/1770868 –

+0

@AhmadAghazadeh, спасибо, но когда я попытался реализовать это ранее , Я получил сообщение об ошибке «не могу найти IExtendedNetworkService.Stub», указывая на «Stub» по причинам, которые я не уверен. потому что я выполнил шаги –

+0

@AhmadAghazadeh. Пожалуйста, вы пробовали запустить этот ответ в последнее время? , потому что это не работает для меня. –

ответ

0

После запуска, измените настройки вручную

Setting-> Доступность Настройки -> Вы можете увидеть опцию 'вашего имени приложения. Включите его. (Это должно быть сделано из части потока приложений (не вручную))

Смежные вопросы