Ascolta le chiamate in arrivo attraverso BroadcaStreceiver, senza PhonestateTentrEceiver o Phonestatelistener

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

  •  14-11-2019
  •  | 
  •  

Domanda

C'è un modo per ascoltare le chiamate in arrivo estendendo BroadcaStreceiver per ascoltare la trasmissione del sistema operativo, senza utilizzare PhonestateinTreceiver o Phonestatelistener. Inoltre, per favore dimmi quali saranno azioni e permessi in manifesto.

Ho provato come segue ma non funziona per le chiamate in arrivo, ma funzionante per uscita in uscita

L'unico file .java di app di app è il seguente (l'app solo un file .java e un file manifest)

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");          
    }
}
.

Manifest

<?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>
.

È stato utile?

Soluzione

L'azione che hai definito nel tuo manifest non è corretto.Questo è un intento d'azione che può essere utilizzato per rispondere a una chiamata e non monitorare le chiamate in arrivo.

È possibile utilizzare due ricevitori di trasmissione che ascoltano azione_phone_state_changed e w_outgoing_call Indici di trasmissione.

Action_phone_State_Changed verrà ricevuto quando c'è una nuova chiamata in arrivo, chiamata risposta o handup (vedere la documentazione per gli extra ricevuti con questo intento).

La nuova_outing_call verrà ricevuta quando c'è una nuova chiamata in uscita posta sul dispositivo.

Per quanto riguarda le autorizzazioni, penso che tu lo abbiatetto proprio nel tuo manifest (presumo che il permesso di record_audio sia utilizzato per qualcos'altro nella tua applicazione)

Altri suggerimenti

Ecco la mia demo per il test dell'unità Android.Puoi fare riferimento ad esso.

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();
    }
}
.

Non dimenticare di aggiungere le autorizzazioni

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top