2011-05-17 7 views
10

añadí este es mi manifiesto de archivo -No es capaz de obtener el 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> 

Entonces mi clase de servicio es como esto -

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

}

y mi PhoneStateListener es -

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

}

Puedo ver el estado INACTIVO.

Pero cuando llamo no consigo el estado de llamada. ¿Por qué?

Respuesta

14

Creo que está mezclando dos enfoques para obtener el estado del teléfono. Si usa el filtro de intención y el receptor de difusión, entonces en el receptor no es necesario llamar a la escucha de TelephonyManager(). Sólo tienes que comprobar la intención recibido de esta manera:

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

Gracias ... tiene el zumbido :) Por cierto sabes cómo hacer que hacer una pausa en mi aplicación cuando suena el teléfono y luego volver a la aplicación cuando la llamada telefónica ¿se acabó? – nasaa

+1

AFAIK, si su aplicación ejecuta una actividad, se llamará a onPause y onStop para que la actividad del teléfono se muestre por adelantado. Si está ejecutando un servicio, no veo una razón por la cual quiera pausar el trabajo que está haciendo. Aún así, si desea utilizar el método anterior para saber cuándo suena el teléfono y luego, según la lógica de su aplicación, deje de hacer el trabajo y reanude más tarde, pero no veo por qué lo haría desde un servicio. – advantej

+0

Bueno, el problema es que tengo una canción en reproducción, pero no se detiene cuando suena el teléfono, así que pregunté. – nasaa

Cuestiones relacionadas