2016-11-10 16 views
1

私はUSSDの応答を読んで、Sim balanceの金額などを取得しようとしていますが、問題がある、私はStackoverflowでそれに関する多くの質問を読んでいます。これを除いて閉じる:Prevent USSD dialog and read USSD response?。 by @ HenBoy331アンドロイドがUSSDの応答を読みました

しかし、私はまだそれに問題があります。私の放送受信機も呼び出されません。私は4.4.2を使用しています

しかし、それは何も表示されません。私はメッセージを解析してバランスを取っているように見えません。

私は電話をかけるためにMainActivity、放送受信機を実装するためにReceiverActivity、USSD応答を得るためにUSSDServiceクラスを持っています。

MainActivity.java

​​

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を見つけることができません "と言うエラーを持っています。私はステップを踏んだので –

+0

@AhmadAghazadehお願いします、あなたは最近その答えを実行しようとしましたか?それは私にとってはうまくいかないからです。 –

答えて

0

。それをオン。 (これは、アプリケーションフローの一部として行われなければなりません。手動ではありません)

関連する問題