Bir Android cihazda gelen aramalar nasıl tespit edilir?


130

Telefona bir çağrı geldiğinde numarayı tespit etmek istiyorum gibi bir uygulama yapmaya çalışıyorum. Aşağıda denediğim şey var, ancak gelen aramaları algılamıyor.

MainActivityArka planda çalıştırmak istiyorum , bunu nasıl yapabilirim?

manifestDosyada izin vermiştim .

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

Bildiride sunmam gereken başka bir şey var mı?

public class MainActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.test_layout);
   }

   public class myPhoneStateChangeListener extends PhoneStateListener {
       @Override
       public void onCallStateChanged(int state, String incomingNumber) {
           super.onCallStateChanged(state, incomingNumber);
           if (state == TelephonyManager.CALL_STATE_RINGING) {
               String phoneNumber =   incomingNumber;
           }
       }
   }
}

android P için ne yapmalıyız
Ahmad Arslan

Yanıtlar:


336

Bunu yapmak için kullandığım şey şu:

Belirgin:

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

<!--This part is inside the application-->
    <receiver android:name=".CallReceiver" >
        <intent-filter>
            <action android:name="android.intent.action.PHONE_STATE" />
        </intent-filter>
        <intent-filter>
            <action android:name="android.intent.action.NEW_OUTGOING_CALL" />
        </intent-filter>
    </receiver>

Baz yeniden kullanılabilir çağrı dedektörüm

package com.gabesechan.android.reusable.receivers;

import java.util.Date;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.telephony.TelephonyManager;

public abstract class PhonecallReceiver extends BroadcastReceiver {

    //The receiver will be recreated whenever android feels like it.  We need a static variable to remember data between instantiations

    private static int lastState = TelephonyManager.CALL_STATE_IDLE;
    private static Date callStartTime;
    private static boolean isIncoming;
    private static String savedNumber;  //because the passed incoming is only valid in ringing


    @Override
    public void onReceive(Context context, Intent intent) {

        //We listen to two intents.  The new outgoing call only tells us of an outgoing call.  We use it to get the number.
        if (intent.getAction().equals("android.intent.action.NEW_OUTGOING_CALL")) {
            savedNumber = intent.getExtras().getString("android.intent.extra.PHONE_NUMBER");
        }
        else{
            String stateStr = intent.getExtras().getString(TelephonyManager.EXTRA_STATE);
            String number = intent.getExtras().getString(TelephonyManager.EXTRA_INCOMING_NUMBER);
            int state = 0;
            if(stateStr.equals(TelephonyManager.EXTRA_STATE_IDLE)){
                state = TelephonyManager.CALL_STATE_IDLE;
            }
            else if(stateStr.equals(TelephonyManager.EXTRA_STATE_OFFHOOK)){
                state = TelephonyManager.CALL_STATE_OFFHOOK;
            }
            else if(stateStr.equals(TelephonyManager.EXTRA_STATE_RINGING)){
                state = TelephonyManager.CALL_STATE_RINGING;
            }


            onCallStateChanged(context, state, number);
        }
    }

    //Derived classes should override these to respond to specific events of interest
    protected abstract void onIncomingCallReceived(Context ctx, String number, Date start);
    protected abstract void onIncomingCallAnswered(Context ctx, String number, Date start);
    protected abstract void onIncomingCallEnded(Context ctx, String number, Date start, Date end);

    protected abstract void onOutgoingCallStarted(Context ctx, String number, Date start);      
    protected abstract void onOutgoingCallEnded(Context ctx, String number, Date start, Date end);

    protected abstract void onMissedCall(Context ctx, String number, Date start);

    //Deals with actual events

    //Incoming call-  goes from IDLE to RINGING when it rings, to OFFHOOK when it's answered, to IDLE when its hung up
    //Outgoing call-  goes from IDLE to OFFHOOK when it dials out, to IDLE when hung up
    public void onCallStateChanged(Context context, int state, String number) {
        if(lastState == state){
            //No change, debounce extras
            return;
        }
        switch (state) {
            case TelephonyManager.CALL_STATE_RINGING:
                isIncoming = true;
                callStartTime = new Date();
                savedNumber = number;
                onIncomingCallReceived(context, number, callStartTime);
                break;
            case TelephonyManager.CALL_STATE_OFFHOOK:
                //Transition of ringing->offhook are pickups of incoming calls.  Nothing done on them
                if(lastState != TelephonyManager.CALL_STATE_RINGING){
                    isIncoming = false;
                    callStartTime = new Date();
                    onOutgoingCallStarted(context, savedNumber, callStartTime);                     
                }
                else
                {
                    isIncoming = true;
                    callStartTime = new Date();
                    onIncomingCallAnswered(context, savedNumber, callStartTime); 
                }

                break;
            case TelephonyManager.CALL_STATE_IDLE:
                //Went to idle-  this is the end of a call.  What type depends on previous state(s)
                if(lastState == TelephonyManager.CALL_STATE_RINGING){
                    //Ring but no pickup-  a miss
                    onMissedCall(context, savedNumber, callStartTime);
                }
                else if(isIncoming){
                    onIncomingCallEnded(context, savedNumber, callStartTime, new Date());                       
                }
                else{
                    onOutgoingCallEnded(context, savedNumber, callStartTime, new Date());                                               
                }
                break;
        }
        lastState = state;
    }
}

Daha sonra onu kullanmak için, ondan bir sınıf türetmeniz ve ilgilendiğiniz çağrı türlerine bakılmaksızın birkaç kolay işlevi uygulamanız yeterlidir:

public class CallReceiver extends PhonecallReceiver {

    @Override
    protected void onIncomingCallReceived(Context ctx, String number, Date start)
    {
        //
    }

    @Override
    protected void onIncomingCallAnswered(Context ctx, String number, Date start)
    {
        //
    }

    @Override
    protected void onIncomingCallEnded(Context ctx, String number, Date start, Date end)
    {
        //
    }

    @Override
    protected void onOutgoingCallStarted(Context ctx, String number, Date start)
    {
        //
    } 

    @Override 
    protected void onOutgoingCallEnded(Context ctx, String number, Date start, Date end)
    {
        //
    }

    @Override
    protected void onMissedCall(Context ctx, String number, Date start)
    {
        //
    }

}

Ek olarak bu benim üzerinde böyle kod neden yaptım bir writeup görebilirsiniz blogda . Ana bağlantı: https://gist.github.com/ftvs/e61ccb039f511eb288ee

DÜZENLEME: Sınıfı kendi kullanımım için yeniden çalıştığım için daha basit bir kodla güncellendi


2
Bu kod hiçbir şey göstermiyor. Yaptığı şey, giden bir çağrı başladığında / bittiğinde sizi aramak ve size numarayı, başladığınız zamanı ve bittiği zamanı iletmektir. Aslında bunu sergilemek senin işin, çünkü bunun nasıl yapılmasını istediğini bilmeme imkan yok.
Gabe Sechan

3
@GabeSechan: Harika! lütfen beni bekletme durumuyla başa çıkmam için yönlendirir misin
Mehul Joisar

6
Buna ek olarak, alıcıya şunu ekleyene kadar uygulama ön planda veya arka planda değilken çalışmadı: "android: enabled =" true "
Rajat Sharma

1
Statik değişkenler, uygulama hafızadan çıkarılıncaya kadar (servislerin çalışıp çalışmadığına ve genel telefon hafıza koşullarına bağlı olarak oldukça uzun bir süre olabilir) ortada kalacaktır. Ama evet, kaybolabilirler. Diske, örneğin paylaşılan tercih yoluyla yazabilirsiniz, ancak bu da yanlış sonuçlara sahip olmanıza neden olabilir - bu, telefonun yeniden başlatılması gibi bazı durumlarda verilerinizin düzgün şekilde temizlenmesini engelleyecektir. Benim kullanım durumum için, nadir bulunan boş ve kayıp veriler, yanlış verilerden daha iyiydi. Bunu ihtiyaçlarınıza göre çevirmekten çekinmeyin.
Gabe Sechan

1
@GabeSechan: İçinde bir hata var gibi görünüyor. lastState olarak başlatılmamalıdır CALL_STATE_IDLE. Mevcut durumdayken uygulamam öldürüldüğünde birkaç aramayı kaçırıyorum RINGING. Çünkü IDLEçağrı sona erdiğinde tekrar geldiğinde , statik değişken olarak yeniden başlatılır CALL_STATE_IDLEve hiçbir şey yapmadan hata verir. Yani referansını kaybediyoruz lastState.
Heisenberg

23
private MyPhoneStateListener phoneStateListener = new MyPhoneStateListener();

Kayıt olmak

TelephonyManager telephonyManager = (TelephonyManager) getSystemService(TELEPHONY_SERVICE);
telephonyManager.listen(phoneStateListener, PhoneStateListener.LISTEN_CALL_STATE);

ve kaydı iptal etmek

TelephonyManager telephonyManager = (TelephonyManager) getSystemService(TELEPHONY_SERVICE);
telephonyManager.listen(phoneStateListener, PhoneStateListener.LISTEN_NONE);

Bunu ana faaliyette nerede kullanmalıyım?
Jesbin MJ

bunu değişikliği dinlediğiniz sınıfa yerleştirin .. normalde kayıtlar oncreate'de yapılır ve ondestroy'da kaydı silin .. nesneyi sınıfta global olarak ilan edin
stinepike

Bu seçenek izin gerektirmez.
Mike

Gabe'nin çözümü daha müdahaleci özellikler, yani Viber türü uygulamalar için daha uygun olsa da, bu, kullanıcının bir telefon görüşmesine girme eylemlerine tepki vermesi gerekenler için en iyi çözümdür. Bu gibi durumlarda çalışma zamanı izni istemek büyük olasılıkla aşırı bir durumdur ve kullanıcı tarafından iyi karşılanmayabilir.
bosphere

1
Bir şey yapmak istiyorum, çağrı geldiğinde, bu kodla nasıl yapmalı?
Noor Hossain

14

Android P - Api Seviye 28 ile: READ_CALL_LOG izni almanız gerekir

Çağrı günlüklerine sınırlı erişim

Android P hamle CALL_LOG, READ_CALL_LOG, WRITE_CALL_LOGve PROCESS_OUTGOING_CALLSizinleri PHONEyeniye izin grubunun CALL_LOGizin grubunun. Bu grup, kullanıcılara, telefon görüşmesi kayıtlarını okuma ve telefon numaralarını tanımlama gibi hassas bilgilere erişmesi gereken uygulamalar için daha iyi denetim ve görünürlük sağlar.

PHONE_STATE niyet eylem numaraları okumak için, hem ihtiyaç READ_CALL_LOGiznine ve READ_PHONE_STATEizni . Numaraları okumak için onCallStateChanged()artık READ_CALL_LOGyalnızca izne ihtiyacınız var . Artık READ_PHONE_STATEizne ihtiyacınız yok .


Sadece ekleyerek olanlar için READ_CALL_LOGde AndroidManifest.xmlbir izin isteği ekleyerek odaklanmak MainActivity.
Piyush

13

GÜNCELLEME: Gabe Sechan tarafından yayınlanan gerçekten harika kod , sizden açıkça gerekli izinleri vermesini istemediğiniz sürece çalışmaz. İşte bu izinleri istemek için ana etkinliğinize yerleştirebileceğiniz bazı kodlar:

    if (getApplicationContext().checkSelfPermission(Manifest.permission.READ_PHONE_STATE)
            != PackageManager.PERMISSION_GRANTED) {
        // Permission has not been granted, therefore prompt the user to grant permission
        ActivityCompat.requestPermissions(this,
                new String[]{Manifest.permission.READ_PHONE_STATE},
                MY_PERMISSIONS_REQUEST_READ_PHONE_STATE);
    }

    if (getApplicationContext().checkSelfPermission(Manifest.permission.PROCESS_OUTGOING_CALLS)
            != PackageManager.PERMISSION_GRANTED) {
        // Permission has not been granted, therefore prompt the user to grant permission
        ActivityCompat.requestPermissions(this,
                new String[]{Manifest.permission.PROCESS_OUTGOING_CALLS},
                MY_PERMISSIONS_REQUEST_PROCESS_OUTGOING_CALLS);
    }

AYRICA: Gabe'nin gönderisinin altındaki bir yorumda belirtildiği gibi android:enabled="true, uygulama şu anda ön planda çalışmıyorken gelen aramaları algılamak için alıcıya küçük bir kod parçası eklemeniz gerekir :

    <!--This part is inside the application-->
    <receiver android:name=".CallReceiver" android:enabled="true">
        <intent-filter>
            <action android:name="android.intent.action.PHONE_STATE" />
        </intent-filter>
        <intent-filter>
            <action android:name="android.intent.action.NEW_OUTGOING_CALL" />
        </intent-filter>
    </receiver>

Ya uygulamanın herhangi bir Etkinliği yoksa ve yalnızca yayın alıcısı ve bir hizmet varsa. O halde yayın alıcısı bu izin verilene kadar aranmayacağından, kullanıcıdan izin almak için bu kodu nereye yazacağız.
user2779311

2
Yalnızca bir kez açılmış olsa bile en azından bir MainActivity'ye ihtiyacınız var. Örneğin, arama engelleme uygulamamı RoboStop alın: Kullanıcı uygulamayı ilk kez indirdiğinde ve ardından uygulamayı başlatmak için uygulama simgesini tıkladığında, uygulamama gerekli izinleri vermesi istenir. Uygulama aynı zamanda arama engellemeyi etkinleştirmek / devre dışı bırakmak için bir düğme içerir, ancak kullanıcının uygulamayı / etkinliği yeniden başlatması gerekmez, arama engelleme, kullanıcının uygulamayı / etkinliği yeniden başlatmasına gerek kalmadan arka planda gerçekleşir.
topherPedersen

Bunu uygulamakta güçlük çekenler
Prasath

5

bu size yardımcı olabilir ve ayrıca izin gerektirebilir

public class PhoneListener extends PhoneStateListener
{
    private Context context;
    public static String getincomno;

    public PhoneListener(Context c) {
        Log.i("CallRecorder", "PhoneListener constructor");
        context = c;
    }

    public void onCallStateChanged (int state, String incomingNumber)
    {

        if(!TextUtils.isEmpty(incomingNumber)){
        // here for Outgoing number make null to get incoming number
        CallBroadcastReceiver.numberToCall = null;
        getincomno = incomingNumber;
        }

        switch (state) {
        case TelephonyManager.CALL_STATE_IDLE:

            break;
        case TelephonyManager.CALL_STATE_RINGING:
            Log.d("CallRecorder", "CALL_STATE_RINGING");
            break;
        case TelephonyManager.CALL_STATE_OFFHOOK:

            break;
        }
    }
}

2
bu iyi görünüyor. Ama bunu aktiviteden nasıl kullanabilirim? lütfen bana ayrıntıları söyle
Amir


2

İşte kullanımdan PhonestateListenerve diğer komplikasyonlardan kaçınabilecek basit bir yöntem .
Yani burada android'den RINGING, OFFHOOKve gibi 3 olayı alıyoruz IDLE. Ve çağrının tüm olası durumunu elde etmek için, kendi devletleri gibi tanımlamanız gerekir RINGING, OFFHOOK, IDLE, FIRST_CALL_RINGING, SECOND_CALL_RINGING. Bir telefon görüşmesinde her durumu idare edebilir.
Lütfen android'den olay aldığımızı ve çağrı halimizi tanımlayacağımızı bir şekilde düşünün. Kodu görün.

public class CallListening  extends BroadcastReceiver {
    private static final String TAG ="broadcast_intent";
    public static String incoming_number;
    private String current_state,previus_state,event;
    public static Boolean dialog= false;
    private Context context;
    private SharedPreferences sp,sp1;
    private SharedPreferences.Editor spEditor,spEditor1;
    public void onReceive(Context context, Intent intent) {
        //Log.d("intent_log", "Intent" + intent);
        dialog=true;
        this.context = context;
        event = intent.getStringExtra(TelephonyManager.EXTRA_STATE);
        incoming_number = intent.getStringExtra(TelephonyManager.EXTRA_INCOMING_NUMBER);
        Log.d(TAG, "The received event : "+event+", incoming_number : " + incoming_number);
        previus_state = getCallState(context);
        current_state = "IDLE";
        if(incoming_number!=null){
            updateIncomingNumber(incoming_number,context);
        }else {
            incoming_number=getIncomingNumber(context);
        }
        switch (event) {
            case "RINGING":
                Log.d(TAG, "State : Ringing, incoming_number : " + incoming_number);
            if((previus_state.equals("IDLE")) || (previus_state.equals("FIRST_CALL_RINGING"))){
                    current_state ="FIRST_CALL_RINGING";
                }
                if((previus_state.equals("OFFHOOK"))||(previus_state.equals("SECOND_CALL_RINGING"))){
                    current_state = "SECOND_CALL_RINGING";
                }

                break;
            case "OFFHOOK":
                Log.d(TAG, "State : offhook, incoming_number : " + incoming_number);
                if((previus_state.equals("IDLE")) ||(previus_state.equals("FIRST_CALL_RINGING")) || previus_state.equals("OFFHOOK")){
                    current_state = "OFFHOOK";
                }
                if(previus_state.equals("SECOND_CALL_RINGING")){
                    current_state ="OFFHOOK";
                    startDialog(context);
                }
                break;
            case "IDLE":
                Log.d(TAG, "State : idle and  incoming_number : " + incoming_number);
                if((previus_state.equals("OFFHOOK")) || (previus_state.equals("SECOND_CALL_RINGING")) || (previus_state.equals("IDLE"))){
                    current_state="IDLE";
                }
                if(previus_state.equals("FIRST_CALL_RINGING")){
                    current_state = "IDLE";
                    startDialog(context);
                }
                updateIncomingNumber("no_number",context);
                Log.d(TAG,"stored incoming number flushed");
                break;
        }
        if(!current_state.equals(previus_state)){
            Log.d(TAG, "Updating  state from "+previus_state +" to "+current_state);
            updateCallState(current_state,context);

        }
    }
    public void startDialog(Context context) {
        Log.d(TAG,"Starting Dialog box");
        Intent intent1 = new Intent(context, NotifyHangup.class);
        intent1.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        context.startActivity(intent1);

    }
    public void updateCallState(String state,Context context){
        sp = PreferenceManager.getDefaultSharedPreferences(context);
        spEditor = sp.edit();
        spEditor.putString("call_state", state);
        spEditor.commit();
        Log.d(TAG, "state updated");

    }
    public void updateIncomingNumber(String inc_num,Context context){
        sp = PreferenceManager.getDefaultSharedPreferences(context);
        spEditor = sp.edit();
        spEditor.putString("inc_num", inc_num);
        spEditor.commit();
        Log.d(TAG, "incoming number updated");
    }
    public String getCallState(Context context){
        sp1 = PreferenceManager.getDefaultSharedPreferences(context);
        String st =sp1.getString("call_state", "IDLE");
        Log.d(TAG,"get previous state as :"+st);
        return st;
    }
    public String getIncomingNumber(Context context){
        sp1 = PreferenceManager.getDefaultSharedPreferences(context);
        String st =sp1.getString("inc_num", "no_num");
        Log.d(TAG,"get incoming number as :"+st);
        return st;
    }
}

0

@Gabe Sechan, kodunuz için teşekkürler. Hariç iyi çalışıyoronOutgoingCallEnded() . Asla idam edilmez. Test telefonları Samsung S5 ve Trendy'dir. Sanırım 2 böcek var.

1: bir çift parantez eksik.

case TelephonyManager.CALL_STATE_IDLE: 
    // Went to idle-  this is the end of a call.  What type depends on previous state(s)
    if (lastState == TelephonyManager.CALL_STATE_RINGING) {
        // Ring but no pickup-  a miss
        onMissedCall(context, savedNumber, callStartTime);
    } else {
        // this one is missing
        if(isIncoming){
            onIncomingCallEnded(context, savedNumber, callStartTime, new Date());                       
        } else {
            onOutgoingCallEnded(context, savedNumber, callStartTime, new Date());                                               
        }
    }
    // this one is missing
    break;

2: işlevin sonundaysa lastStatetarafından güncellenmez state. Bu işlevin ilk satırına şu şekilde değiştirilmelidir:

public void onCallStateChanged(Context context, int state, String number) {
    int lastStateTemp = lastState;
    lastState = state;
    // todo replace all the "lastState" by lastStateTemp from here.
    if (lastStateTemp  == state) {
        //No change, debounce extras
        return;
    }
    //....
}

Ek koydum lastStatevesavedNumber sen önerildiği gibi paylaşılan tercihi haline.

Sadece yukarıdaki değişikliklerle test ettim. Hata en azından telefonlarımda düzeltildi.


0

Lütfen aşağıdaki kodu kullanın. Gelen numarayı diğer çağrı ayrıntılarıyla birlikte almanıza yardımcı olacaktır.

activity_main.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity" >

<TextView
    android:id="@+id/call"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_centerHorizontal="true"
    android:layout_centerVertical="true"
    android:text="@string/hello_world" />

</RelativeLayout>

MainActivity.java

public class MainActivity extends Activity {

private static final int MISSED_CALL_TYPE = 0;
private TextView txtcall;

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

    txtcall = (TextView) findViewById(R.id.call);

    StringBuffer sb = new StringBuffer();
    Cursor managedCursor = managedQuery(CallLog.Calls.CONTENT_URI, null,
            null, null, null);
    int number = managedCursor.getColumnIndex(CallLog.Calls.NUMBER);
    int type = managedCursor.getColumnIndex(CallLog.Calls.TYPE);
    int date = managedCursor.getColumnIndex(CallLog.Calls.DATE);
    int duration = managedCursor.getColumnIndex(CallLog.Calls.DURATION);
    sb.append("Call Details :");
    while (managedCursor.moveToNext()) {
        String phNumber = managedCursor.getString(number);
        String callType = managedCursor.getString(type);
        String callDate = managedCursor.getString(date);
        Date callDayTime = new Date(Long.valueOf(callDate));
        String callDuration = managedCursor.getString(duration);
        String dir = null;
        int dircode = Integer.parseInt(callType);
        switch (dircode) {

        case CallLog.Calls.OUTGOING_TYPE:
            dir = "OUTGOING";
            break;

        case CallLog.Calls.INCOMING_TYPE:
            dir = "INCOMING";
            break;

        case CallLog.Calls.MISSED_TYPE:
            dir = "MISSED";
            break;
        }
        sb.append("\nPhone Number:--- " + phNumber + " \nCall Type:--- "
                + dir + " \nCall Date:--- " + callDayTime
                + " \nCall duration in sec :--- " + callDuration);
        sb.append("\n----------------------------------");
    }
    managedCursor.close();
    txtcall.setText(sb);
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.activity_main, menu);
    return true;
}

} 

ve aşağıdaki izinler için bildirim isteğinizde:

<uses-permission android:name="android.permission.READ_CONTACTS"/>
<uses-permission android:name="android.permission.READ_LOGS"/>

READ_LOGS, uygulamanızın Play Store'da yasaklanmasını sağlıyor
Duna

0

Bunun için bir BroadcastReceiver'a ihtiyacınız var ACTION_PHONE_STATE_CHANGEDBu, telefon durumu boşta kalma, zil sesi, askıdan çıkarma, yani önceki değerden değiştiğinde ve bunun gelen / giden bir çağrı olup olmadığını algılayabileceğiniz yeni değer olduğunda aldığınız aramayı arayacaktır.

Gerekli izin şu şekilde olacaktır:

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

Ancak o yayında EXTRA_INCOMING_NUMBER'i ​​de almak istiyorsanız, başka bir izne ihtiyacınız olacak: "android.permission.READ_CALL_LOG"

Ve kod şuna benzer:

val receiver: BroadcastReceiver = object : BroadcastReceiver() {
    override fun onReceive(context: Context, intent: Intent) {
        Log.d(TAG, "onReceive")
    }
}

override fun onResume() {
    val filter = IntentFilter()
    filter.addAction("android.intent.action.PHONE_STATE")
    registerReceiver(receiver, filter)
    super.onResume()
}

override fun onPause() {
    unregisterReceiver(receiver)
    super.onPause()
}

ve alıcı sınıfında, şu şekilde niyet okuyarak mevcut durumu elde edebiliriz:

intent.extras["state"]

ekstraların sonucu şunlar olabilir:

ZİL -> Telefonunuz çalıyorsa

OFFHOOK -> Biriyle konuşuyorsanız (Gelen veya Gelen çağrı)

IDLE -> çağrı sonlandırılırsa (Gelen veya Gelen çağrı)

PHONE_STATE yayını ile PROCESS_OUTGOING_CALLS iznini veya kullanımdan kaldırılmış NEW_OUTGOING_CALL işlemini kullanmamız gerekmez.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.