2010-08-17 20 views
15

mía es BroadcastReceiver para recibir el número de teléfono de la persona que me llamaAndroid: ¿Comprobar el número de teléfono presente en la lista de contactos? (Número de teléfono recuperar de llamada telefónica)

<intent-filter> 
<action 
    android:name="android.intent.action.PHONE_STATE" /> 
</intent-filter> 
  1. ¿Cómo comprobar si el número de teléfono recibir está en mi lista de contactos?
    ¿Tiene un consejo para saber si este número de teléfono existe en la lista de contactos sin cargar la lista de contactos?
    No quiero más información, solo si este número de teléfono existe.

  2. Si no es posible, y debo cargar la lista de contactos, ¿cómo hacerlo en BroadcastReceiver?
    Cuando intento hacer getContentResolver, que no está funcionando porque estoy en BroadcastReceiver y no dentro Activity ...

Gracias por su ayuda

Respuesta

31
public boolean contactExists(Context context, String number) { 
/// number is the phone number 
Uri lookupUri = Uri.withAppendedPath(
PhoneLookup.CONTENT_FILTER_URI, 
Uri.encode(number)); 
String[] mPhoneNumberProjection = { PhoneLookup._ID, PhoneLookup.NUMBER, PhoneLookup.DISPLAY_NAME }; 
Cursor cur = context.getContentResolver().query(lookupUri,mPhoneNumberProjection, null, null, null); 
try { 
    if (cur.moveToFirst()) { 
     return true; 
} 
} finally { 
if (cur != null) 
    cur.close(); 
} 
return false; 
} 
+0

Gracias por la muestra de código :) está funcionando – NicoMinsk

+0

Probé este código, y funciona cuando tengo el número "exacto", pero dependiendo del código de país, otros prefijos no siempre encuentra el número, incluso cuando un número existe, y llamando a este número llamará a la misma persona (número en los contactos: 5556, número recibido: 15555215556) – Gavriel

3

durante 1 usted debe echar un vistazo a la recomendada ContactsContract.PhoneLookup proveedor

Una tabla que representa el resultado de buscar un número de teléfono, por ejemplo, para el identificador de llamadas. Para realizar una búsqueda, debe agregar el número que desea encontrar a CONTENT_FILTER_URI. Esta consulta está altamente optimizada.

Uri uri = Uri.withAppendedPath(PhoneLookup.CONTENT_FILTER_URI, Uri.encode(phoneNumber)); 
Cursor mycursor=resolver.query(uri, new String[]{PhoneLookup.DISPLAY_NAME,... 
if (mycursor!=null && mycursor.moveToFirst()) { 
// record exists 
} 

de 2 se puede utilizar el context del método OnReceive para llamar a métodos que pertenecen al contexto

ContentResolver cr=context.getContentResolver(); 
7

Creo que es importante decir que es necesario agregar lo siguiente en su archivo de manifiesto

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

que sugerimos utilizar Phone.CONTENT_FILTER_URI en lugar de PhoneLookup.CONTENT_FILTER_URI porque PhoneLookup puede estar vacío y obtendrá ningún resultado de vez en cuando (probado en LG-P500, Froyo)

El problema en mi dispositivo sucede por ejemplo cuando:

  1. cambia al modo avión
  2. utilizar la aplicación de mensaje predeterminado para enviar un SMS (se pondrá en cola).
  3. uso PhoneLookup.CONTENT_FILTER_URI consulte para un contacto

No todos los dispositivos parece ser afectada

Usando PhoneLookup.CONTENT_FILTER_URI el cursor devuelto es siempre vacío. Usando Phone.CONTENT_FILTER_URI todo está bien (si lo encuentra, puede encontrar el contacto).

Por lo tanto, le sugiero que siempre use Phone.* Uris, excepto cuando realmente necesite usar PhoneLookup.* ... que generalmente es solo cosas relacionadas con la sincronización de la libreta de direcciones (y la mayoría de las veces no es lo que le interesa).

Cuestiones relacionadas