Écoutez les appels entrants via Broadcasteceiver, sans PhonestateIntentreceiver ou PhoneStatelistener

StackOverflow https://stackoverflow.com/questions/5486793

  •  14-11-2019
  •  | 
  •  

Question

Y a-t-il un moyen d'écouter les appels entrants en extensant BroadCastraCeiver pour écouter la diffusion d'OS, sans utiliser de PhonestateIntentreceiver ou de phonestatelistener. S'il vous plaît dites-moi quelle sera l'action et les autorisations dans Manifest.

J'ai essayé avec comme suit mais cela ne fonctionne pas pour les appels entrants, mais travaillant pour sortant

Le seul fichier d'application .java est le suivant (l'application qu'un seul fichier .java et un fichier manifeste)

package com.crsardar.media.audio;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.util.Log;

public class IncommingCallReceiverCRS extends BroadcastReceiver{

    @Override
    public void onReceive(Context context, Intent intent) {
        Log.e("Chitta : ", "Its working");          
    }
}

manifeste

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="com.crsardar.media.audio"
      android:versionCode="1"
      android:versionName="1.0">
  <application android:icon="@drawable/icon" android:label="@string/app_name">

    <receiver android:name="IncommingCallReceiverCRS" android:enabled="true"> 
        <intent-filter>
            <!--action android:name="android.intent.action.NEW_OUTGOING_CALL"/-->
            <action  android:name="android.intent.action.ANSWER" >
            <category  android:name="android.intent.category.DEFAULT" /> 
        </intent-filter>
    </receiver>

  </application>

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

Était-ce utile?

La solution

L'action que vous avez définie dans votre manifeste est incorrecte.Il s'agit d'une intention d'action qui peut être utilisée pour répondre à un appel et ne pas surveiller les appels entrants.

Vous pouvez utiliser deux récepteurs de diffusion qui écoutent action_phone_state_changed et new_outeux_call intentions de diffusion.

L'action_phone_state_changed sera reçue lorsqu'il y a un nouvel appel entrant, appelle de réponse ou un raccrobage (voir la documentation des extras reçus avec cette intention).

Le nouveau_outeux_call sera reçu lorsqu'un nouvel appel sortant est placé sur votre appareil.

Quant aux autorisations, je pense que vous avez eu raison dans votre manifeste (je suppose que l'autorisation Record_audio est utilisée pour autre chose dans votre application)

Autres conseils

Voici ma démo pour le test de l'unité Android.Vous pouvez y référer.

public interface ICallVerify {
    void onOutgoing(Context context, Intent intent);
    void onCallStateChange(Context context, Intent intent);
}

protected void setUpCallVerify(final ICallVerify callVerify) {  //listen ingoing and outgoing
    final CountDownLatch latch = new CountDownLatch(1);
    BroadcastReceiver receiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            if (intent.getAction().equals(Intent.ACTION_NEW_OUTGOING_CALL)) { //state change
                Log.i(TAG, "outgoing call...");
                callVerify.onOutgoing(context, intent);
            } else if (intent.getAction().equals(TelephonyManager.ACTION_PHONE_STATE_CHANGED)){ // state changed
                String state = intent.getStringExtra(TelephonyManager.EXTRA_STATE);
                if (state.equals("RINGING")) {
                    state += " number:" + intent.getStringExtra(TelephonyManager.EXTRA_INCOMING_NUMBER);
                }
                Log.i(TAG, "call state changed.... " + state);
                callVerify.onCallStateChange(context, intent);
            }
        }
    };

    IntentFilter filter = new IntentFilter(TelephonyManager.ACTION_PHONE_STATE_CHANGED);
    filter.addAction(Intent.ACTION_NEW_OUTGOING_CALL);
    ContextUtils.getTargetContext().registerReceiver(receiver, filter);

    try {
        latch.await(5, TimeUnit.MINUTES);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
}

N'oubliez pas d'ajouter des autorisations

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top