2016-09-26 1 views
0

Je souhaite implémenter l'obtention d'événements d'appels entrants en arrière-plan et en avant-plan. J'ai donc créé BroadcastReceiver à cet effet, mais la méthode onReceive() ne se déclenche pas après avoir reçu/terminé/terminé un appel entrant. J'ai tryed tonnes de tutoriel, mais rien ne m'a aidé :(Impossible d'obtenir l'événement d'appel entrant

S'il vous plaît aider.

MANIFESTE

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
package="yakiv.bondar.dev.incomeoutcomecalltest"> 

<uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS" /> 
<uses-permission android:name="android.permission.READ_PHONE_STATE" /> 

<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> 
    <receiver 
     android:name=".IncomingCall" 
     android:enabled="true"> 
     <intent-filter> 
      <action android:name="android.intent.action.PHONE_STATE" /> 
     </intent-filter> 
    </receiver> 
</application> 

Diffusion récepteur

public class IncomingCall extends BroadcastReceiver { 
@Override 
public void onReceive(Context context, Intent intent) { 
    Log.d("tag", "AAAAAAAAAAAAAAAAAAAAAA"); 
    MyPhoneStateListener phoneListener=new MyPhoneStateListener(); 
    TelephonyManager telephony = (TelephonyManager) 
      context.getSystemService(Context.TELEPHONY_SERVICE); 
    telephony.listen(phoneListener, PhoneStateListener.LISTEN_CALL_STATE); 
} 

public class MyPhoneStateListener extends PhoneStateListener { 
    public void onCallStateChanged(int state,String incomingNumber){ 
     switch(state){ 
      case TelephonyManager.CALL_STATE_IDLE: 
       Log.d("tag", "IDLE"); 
       break; 
      case TelephonyManager.CALL_STATE_OFFHOOK: 
       Log.d("tag", "OFFHOOK"); 
       break; 
      case TelephonyManager.CALL_STATE_RINGING: 
       Log.d("tag", "RINGING"); 
       break; 
     } 
    } 
} 
} 

Activité principale

public class MainActivity extends AppCompatActivity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
    } 
} 
+0

Vous devez enregistrer votre récepteur dans votre activité – SripadRaj

+0

sripad a raison, vous devez enregistrer le récepteur –

+0

@SripadRaj je l'ai enregistré dans Manifest.xml? Est-ce que ce n'est pas suffisant? –

Répondre

1

Vous avez manqué l'appel registerReciever(intent,intentFilter) dans votre activité. Enregistrez votre activité au onResume() et appelez le unregisterReciever(intent) dans votre méthode onPause().

REMARQUE:

Vérifiez également si vous avez donné des autorisations appropriées dans votre manifeste et notez aussi que même si vous avez déclaré vos autorisations requises vous devez gérer certaines autorisations dans l'exécution dans Android 6.0 et au-dessus . Vérifiez here pour gérer les autorisations à l'exécution pour Marshmallow et au-dessus.

0

En MainActivity:

IncomingCall mBroadcastReceiver = new IncomingCall(); 

En onResume:

IntentFilter filter = new IntentFilter(); 
    this.registerReceiver(mBroadcastReceiver , filter); 

En OnPause:

this.unregisterReceiver(mBroadcastReceiver); 
+0

J'ai ajouté: Chaîne BROADCAST = "android.intent.action.PHONE_STATE"; IntentFilter intentFilter = nouveau IntentFilter (BROADCAST); IncomingCall destinataire = new IncomingCall(); registerReceiver (récepteur, intentionFilter) mais onReceive() toujours pas renvoyé –

+0

Pas de h elp :( –

0

1) Assurez-vous que votre application dispose des autorisations pour READ_PHONE_STATE

2) vous ne avez pas besoin de registerReceiver (BroadcastReceiver, IntentFilter) depuis que vous avez dans votre Manifest

3) Assurez-vous que la notification sont activée pour votre application (Vérif.Régl -> Gestionnaire d'applications -> votre application -> Notifications)

4) Je voudrais essayer le test sans "casser" dans les états de commutation

5) essayer avec Toast au lieu de L og. Toast.makeText (Context, String, Toast.LENGTH_SHORT) .show();