2014-11-24 15 views
8

Mi piacerebbe sapere:Come fa un Android "OS" rilevare una chiamata in arrivo

  1. come il sistema operativo Android di rilevare una chiamata in arrivo (numero) e visualizza il nome del contatto e ci dà una possibilità di partecipare la chiamata.
  2. Cosa succede all'interno del sistema operativo quando viene toccato "END CALL BUTTON".

Quando ho cercato riguardo a questo sto ricevendo solo le classi e i metodi per creare la mia app. Richiesta per la spiegazione.

risposta

16

In Android è possibile rilevare gli eventi di chiamata utilizzando l'API integrata TelephonyManager. La classe TelephonyManager fornisce l'accesso alle informazioni sui servizi di telefonia sul dispositivo.

Esempio:

Creare una nuova classe denominata MyCallReceiver

package com.example; 

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

public class MyCallReceiver extends BroadcastReceiver { 

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

     if (intent.getStringExtra(TelephonyManager.EXTRA_STATE).equals(TelephonyManager.EXTRA_STATE_RINGING)) { 
      // This code will execute when the phone has an incoming call 

      // get the phone number 
      String incomingNumber = intent.getStringExtra(TelephonyManager.EXTRA_INCOMING_NUMBER); 
      Toast.makeText(context, "Call from:" +incomingNumber, Toast.LENGTH_LONG).show(); 

     } else if (intent.getStringExtra(TelephonyManager.EXTRA_STATE).equals(
       TelephonyManager.EXTRA_STATE_IDLE) 
       || intent.getStringExtra(TelephonyManager.EXTRA_STATE).equals(
         TelephonyManager.EXTRA_STATE_OFFHOOK)) { 
      // This code will execute when the call is disconnected 
      Toast.makeText(context, "Detected call hangup event", Toast.LENGTH_LONG).show(); 

     } 
    } 
} 
classe

BroadcastReceiver che controllerà lo stato del telefono e ogni volta che c'è un cambiamento di stato del telefono, l'OnReceive() il metodo della BroadcastReceiver sarà chiamato.

aggiungere l'autorizzazione READ_PHONE_STATE nel vostro AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.example" 
    android:versionCode="1" 
    android:versionName="1.0" > 

    <uses-sdk 
     android:minSdkVersion="8" 
     android:targetSdkVersion="18" /> 

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

    <application 
     android:allowBackup="true" 
     android:icon="@drawable/ic_launcher" 
     android:label="@string/app_name" 
     android:theme="@style/AppTheme" > 
     <activity 
      android:name="com.example.MainActivity" 
      android:label="@string/app_name" > 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 
       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
     </activity> 

     <receiver android:name="com.example.MyCallReceiver" > 
      <intent-filter> 
       <action android:name="android.intent.action.PHONE_STATE" /> 
      </intent-filter> 
     </receiver> 
    </application> 

</manifest> 

Controllare questo per i riferimenti: BroadcastReceiver

+0

Grazie per questo codice. Qual è la differenza tra l'utilizzo di BroadCast e PhoneStateListener [onCallStateChanged()]. Aspettando il tuo tono di prova – Pravin

+0

Semplicemente possiamo dire che Broadcast funzionerà con tutte le condizioni well.phonestate funzionerà solo con le chiamate telefoniche relative alle cose. ;-) –

+0

Sarà chiamato onPause? –

Problemi correlati