2016-06-20 1 views
1

je l'manifest.xml suivante:Inscrivez-BroadcastReceiver dans le manifeste

<application 
    android:allowBackup="true" 
    android:icon="@mipmap/ic_launcher" 
    android:label="@string/app_name" 
    android:supportsRtl="true" 
    android:theme="@style/AppTheme"> 

    <receiver android:name=".PhoneStateBroadcastReceiver" 
     android:permission="android.permission.READ_PHONE_STATE"> 
     <intent-filter> 
      <action android:name="android.intent.action.PHONE_STATE" /> 
     </intent-filter> 
    </receiver> 

    <activity android:name=".MainActivity"> 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 

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

</application> 

L'auditeur reçoit des données alors que l'activité principale est en cours d'exécution. Cependant, lorsque l'activité principale est détruite, le récepteur s'arrête pour sortir des informations.

Le récepteur est un exemple de classe:

public class PhoneStateBroadcastReceiver extends BroadcastReceiver { 

    private static final String TAG = "PhoneReceiver"; 
    Context mContext; 
    String incoming_number; 
    private int prev_state; 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     TelephonyManager telephony = (TelephonyManager)context.getSystemService(Context.TELEPHONY_SERVICE); //TelephonyManager object 
     CustomPhoneStateListener customPhoneListener = new CustomPhoneStateListener(); 
     telephony.listen(customPhoneListener, PhoneStateListener.LISTEN_CALL_STATE); //Register our listener with TelephonyManager 

     Bundle bundle = intent.getExtras(); 
     String phoneNr = bundle.getString("incoming_number"); 
     Log.v(TAG, phoneNr); 
     Log.d(TAG, "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"); 
     mContext = context; 
    } 

    /* Custom PhoneStateListener */ 
    public class CustomPhoneStateListener extends PhoneStateListener { 

     private static final String TAG = "CustomStateListener"; 

     @Override 
     public void onCallStateChanged(int state, String incomingNumber){ 

      if(incomingNumber != null && incomingNumber.length() > 0) 
       incoming_number = incomingNumber; 

      switch(state){ 
       case TelephonyManager.CALL_STATE_RINGING: 
        Log.d(TAG, "CALL_STATE_RINGING"); 
        prev_state=state; 
        break; 

       case TelephonyManager.CALL_STATE_OFFHOOK: 
        Log.d(TAG, "CALL_STATE_OFFHOOK"); 
        prev_state=state; 
        break; 

       case TelephonyManager.CALL_STATE_IDLE: 

        Log.d(TAG, "CALL_STATE_IDLE==>"+incoming_number); 

        if((prev_state == TelephonyManager.CALL_STATE_OFFHOOK)){ 
         prev_state=state; 
         //Answered Call which is ended 
        } 
        if((prev_state == TelephonyManager.CALL_STATE_RINGING)){ 
         prev_state=state; 
         //Rejected or Missed call 
        } 
        break; 
      } 
     } 
    } 
} 

Pour autant que je compris les principes android, lorsqu'un récepteur est enregistré dans le manifeste alors il devrait recevoir des données, même si son application est tué, si oui, quel est-ce que je fais mal?

Répondre

0

OK. Après avoir cogné ma tête contre le mur pendant plus d'une semaine, j'ai décidé de créer un nouveau projet avec la fonctionnalité minimum et cela a fonctionné dès le premier essai. Je ne sais pas si cela a été causé par quelque chose dans mon ancien code, ce dont je doute, puisque je l'ai copié méthode par méthode sur le nouveau projet et qu'il fonctionne encore, ou les nouvelles versions d'Android Studio et leurs outils de construction.

Un grand merci à REG1 pour avoir la patience et le désir de donner des idées.

Cordialement

1

Ajouter ce qui suit à votre <receiver> dans le manifeste:

android:enabled="true" 
android:exported="true"> 

De plus according to this thread, il semble que vous devez démarrer manuellement une de vos activités avant le récepteur de radiodiffusion va commencer à travailler, à savoir l'application doit avoir été lancé au moins une fois avant que tout récepteur de radiodiffusion fonctionnera.

De plus, déclarez l'autorisation en dehors de la balise <application>. Donc, vous devriez avoir quelque chose comme ceci:

<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.android.app.myapp" > 
    <uses-permission android:name="android.permission.READ_PHONE_STATE"/> 
    <application ... 
... 
</manifest> 

Bien sûr, ce implique que vous devez supprimer le paramètre d'autorisation dans votre receiver.

+0

addint activé et cela n'a pas aidé exporté. Puis-je demander comment suis-je censé lancer manuellement une activité avant d'enregistrer l'auditeur, puisqu'il est enregistré dans le manifeste, et fonctionne également pendant que l'application n'est pas tuée? merci d'avance –

+0

Eh bien, je ne veux pas dire que vous devez lancer l'application avant de vous inscrire. Ce que j'ai compris du lien dans ma réponse, c'est que vous devez avoir lancé votre application au moins une fois avant que le récepteur de diffusion ne fonctionne. Donc, après le lancement, puis la fermeture de l'application une fois, le récepteur devrait fonctionner. Regardez le lien que j'ai fourni dans ma réponse car votre problème semble assez similaire. Je ne vois aucun problème avec votre code. – REG1

+0

J'ai compris la même chose au début mais ça ne marche pas comme ça. Peu importe combien de fois je le lance, il ne fonctionne que pendant que l'application fonctionne. –

0

Ajouter ces lignes au studio Android fichier manifest ... Vous tout simplement pas enregistrer la classe de diffusion

<receiver android:name=".PhoneStateBroadcastReceiver" 
     android:exported="true" 
     android:enabled="true"> 
    <intent-filter> 
     <action android:name="android.intent.action.PHONE_STATE"/> 
    </intent-filter> 
</receiver>