2011-05-17 19 views
10

ho aggiunto questo è il mio manifest -Non in grado di ottenere il TelephonyManager.CALL_STATE_RINGING

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

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

Poi la mia classe di servizio è come questo -

public class ServiceReceiver extends BroadcastReceiver { 

@Override 
public void onReceive(Context context, Intent intent) { 
    MyPhoneStateListener phoneListener = new MyPhoneStateListener(); 
    TelephonyManager telephony = (TelephonyManager) context 
      .getSystemService(Context.TELEPHONY_SERVICE); 
    telephony.listen(phoneListener, PhoneStateListener.LISTEN_CALL_STATE); 
} 

}

e il mio PhoneStateListener è -

public class MyPhoneStateListener extends PhoneStateListener { 

public void onCallStateChanged(int state, String incomingNumber) { 
    Log.i("telephony-example", "State changed: " + stateName(state)); 
} 

String stateName(int state) { 
    switch (state) { 
    case TelephonyManager.CALL_STATE_IDLE: 
     Log.d("DEBUG", "***********IDLE********"); 
     return "Idle"; 
    case TelephonyManager.CALL_STATE_OFFHOOK: 
     Log.d("DEBUG", "***********OFFHOOK********"); 
     return "Off hook"; 
    case TelephonyManager.CALL_STATE_RINGING: 
     Log.d("DEBUG", "***********RINGING********"); 
     return "Ringing"; 
    } 
    return Integer.toString(state); 
} 

}

Sono in grado di vedere lo stato IDLE.

Ma quando chiamo non ottengo lo stato di chiamata. Perché?

risposta

14

Penso che stai mescolando due approcci per ottenere lo stato del telefono. Se si utilizza il filtro intent e il destinatario broadcast, nel ricevitore non è necessario chiamare listen() di TelephonyManager. Basta controllare l'intento ricevute in questo modo:

public void onReceive(Context context, Intent intent) { 
    String state = intent.getStringExtra(TelephonyManager.EXTRA_STATE); 
    String number = intent.getStringExtra(TelephonyManager.EXTRA_INCOMING_NUMBER); 
    if (TelephonyManager.EXTRA_STATE_RINGING.equals(state)) 
    { 
     Log.d("MPR", "Its Ringing [" + number + "]"); 
    } 
    if (TelephonyManager.EXTRA_STATE_IDLE.equals(state)) 
    { 
     Log.d("MPR", "Its Idle"); 
    } 
    if (TelephonyManager.EXTRA_STATE_OFFHOOK.equals(state)) 
    { 
     Log.d("MPR", "Its OffHook"); 
    } 
} 
+0

Grazie ... ha ottenuto il ronzio :) BTW fai a sapere come farlo mettere in pausa la mia app quando il telefono squilla e poi tornare al app quando la telefonata è finita? – nasaa

+1

AFAIK, se la tua app sta eseguendo un'attività, verranno richiamati onPause e onStop per ottenere l'attività del telefono in primo piano. Se stai eseguendo un servizio non vedo un motivo per cui vuoi mettere in pausa il lavoro che stai facendo. Tuttavia, se si desidera utilizzare il metodo sopra riportato per sapere quando il telefono squilla e quindi, a seconda della logica dell'app, interrompere il lavoro e riprendere dopo, ma non vedo perché lo farebbe da un servizio! – advantej

+0

beh, il problema è che ho una canzone che suona ma non si ferma quando il telefono squilla così ho chiesto. – nasaa

Problemi correlati