2012-02-21 13 views
5

Me gustaría crear una aplicación de Android que pueda contactar a la persona que llama actual a través de un mensaje de texto predeterminado. Enviar un mensaje de texto es bastante simple, pero determinar el número de teléfono de la persona que llama actual en una aplicación independiente es el desafío. ¿Existe una forma fácil de adivinar el número de teléfono para que pueda enviarle un mensaje mientras está en la llamada?Cómo determinar el número de teléfono de una persona que llama actualmente en una aplicación independiente

Por supuesto, hay formas manuales para hacer esto: escriba el número, clave en un nuevo mensaje de texto, ingrese el mensaje. Pero quiero definir el mensaje por adelantado y ser capaz de "enviarlo a la persona que llama".

+0

Por favor, deje un código sobre lo que ha intentado hasta ahora. ¿Qué no funciona? Mis ejemplos parecen hacer el truco. – EGHDK

Respuesta

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

    TelephonyManager telephony = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE); 
    PhoneCallStateListener customPhoneListener = new PhoneCallStateListener(context); 
    telephony.listen(customPhoneListener, PhoneStateListener.LISTEN_CALL_STATE); 
    helper = new ContactDatabaseHelper(context); 
    list = helper.getAllContacts(); 

    try{ 
     incomingNumber = intent.getStringExtra(TelephonyManager.EXTRA_INCOMING_NUMBER); 

     if (list.size() != 0){ 
      for (int i = 0, size = list.size(); i < size; i++){ 
       if (PhoneNumberUtils.compare(incomingNumber, list.get(i).getContactNumber())){     
        ToastMsg.showToast(context,list.get(i).getContactName()+" Calling"); 
       } 
      } 
     } 


    }catch (Exception e) { 
     // TODO: handle exception 
    } 

} 


public class PhoneCallStateListener extends PhoneStateListener{ 
private Context context; 

public PhoneCallStateListener(Context context){ 
    this.context = context; 
} 

@Override 
public void onCallStateChanged(int state, String incomingNumber) { 

    switch (state) { 

     case TelephonyManager.CALL_STATE_RINGING:  


      break; 
     case PhoneStateListener.LISTEN_CALL_STATE: 

    } 
    super.onCallStateChanged(state, incomingNumber); 
} 
} 
+0

¿No significa que la aplicación deberá cargarse todo el tiempo para interceptar estos estados de llamada? –

+2

@ enforcer-99 No creo que entiendas el concepto de BroadcastReciever. Aquí está la descripción de StackOverflow: "BroadcastReceiver es un componente de Android que responde a los anuncios de difusión en todo el sistema". y aquí está el enlace de Google que debes * leer realmente *. Por lo tanto ... está respondiendo a una transmisión de todo el sistema, y ​​su aplicación no está "cargada todo el tiempo". – EGHDK

3

Para su sistuation lo mejor que puedo pensar es usar PhoneStateListener. Contiene el controlador onCallStateChanged. Uno de los argumentos es una Cadena que contiene el número de teléfono entrante.

Fuente: http://developer.android.com/reference/android/telephony/PhoneStateListener.html

Ctrl + F y el tipo de "entrante" y encontrará todo lo que necesita saber.

EDITAR: Para asegurarse de que su aplicación se inicie con el inicio de su teléfono, solo agregue un BroadcastRecerver. How to start an Application on startup?

+0

Pero, ¿qué pasa con el caso en que el usuario no invoca la aplicación hasta que la llamada telefónica ya está en curso? Como no habrá un evento de cambio de estado, ¿no podría obtener el número correcto? –

+0

Parece que necesitarías que tu aplicación comience al inicio. Esto es similar a lo que hacen las aplicaciones como "Google Wallet". Cuando voy a una tienda y toco mi teléfono para pagar, nunca tuve que abrir la billetera de Google para que funcione. Pero, cuando enciendo el teléfono y miro mis notificaciones, veo que "Inicializar Google Wallet" es muy rápido y luego desaparece. No tengo mucho tiempo en este momento, pero tal vez esto ayude: http://stackoverflow.com/questions/5290141/android-broadcastreceiver-on-startup – EGHDK

+0

¿Qué sucede si acabo de consultar el registro de llamadas de Android? Si clasifico la lista por fecha DESC, ¿mostraría la llamada actual en la que estoy o la llamada actual se enviará al registro de llamadas DESPUÉS de que se complete la llamada? –

1

Registre un BroadcastReceiver en su manifiesto que escuche ACTION_PHONE_STATE_CHANGED.

Acción de intento de transmisión que indica que el estado de la llamada (celular) en el dispositivo ha cambiado.

El EXTRA_STATE adicional indica el estado de la nueva llamada. Si el nuevo estado es RINGING, un segundo EXTRA_INCOMING_NUMBER adicional proporciona el número de teléfono entrante como una cadena.

Requiere el permiso READ_PHONE_STATE.

Esta fue una emisión fija en la versión 1.0, pero ya no es pegajosa. En su lugar, use getCallState() para consultar de forma síncrona el estado actual de la llamada .

De esta manera no es necesario que el usuario inicie su aplicación antes de recibir una llamada.

+0

¿Qué tal esto? : "A partir de Android 3.1, el sistema Android excluirá por omisión que BroadcastReceiver reciba Intents si la aplicación correspondiente nunca ha sido iniciada por el usuario o si el usuario detuvo la aplicación explícitamente a través del menú de Android (en Administrar aplicación). This es una característica de seguridad adicional, ya que el usuario puede estar seguro de que solo las aplicaciones que inició recibirán Intentos de transmisión ". –

Cuestiones relacionadas