2011-02-01 14 views
12

Me gustaría leer los contactos de la API de ContactsContract que pertenece solo al teléfono/SIM y me gustaría evitar los contactos sincronizados de otras aplicaciones como Facebook y Gmail. Probé mi código en el simulador y funciona bien, pero en dispositivos reales no devuelve ningún resultado.¿Cuál es el tipo/nombre de cuenta predeterminado para los contactos en la aplicación de contacto de Android?

ContentResolver cr = AndroidContext.getContext() 
        .getContentResolver(); 
Cursor nativeContacts = cr.query(RawContacts.CONTENT_URI, 
        new String[] { RawContacts._ID, RawContacts.VERSION, RawContacts.CONTACT_ID }, 
        RawContacts.DELETED + "<> 1 AND " + RawContacts.CONTACT_ID 
          + " IS NOT NULL AND " + RawContacts.ACCOUNT_NAME + " IS NULL AND " 
          + RawContacts.ACCOUNT_TYPE + " IS NULL", null, null); 

Supongo que en dispositivos el tipo de cuenta y el nombre de la cuenta predeterminada no son nulos, ¿cuál es la solución?

+0

Así que probé una pequeña aplicación de muestra para buscar el tipo de cuenta y el nombre utilizados en diferentes dispositivos. En ** HTC **, el tipo de cuenta y el nombre fueron com.htc.android.pcsc y ​​com.android.sim mientras que en Sony Xperia fueron com.sonyerricson.contacts. Entonces parece que todos los dispositivos usan diferentes tipos y nombres, ahora la pregunta es ¿cómo obtengo la cuenta predeterminada? ¿Puedo hacer algo como esto AccountManager.getAccounts() [0] y confiar en que esta será la cuenta predeterminada en el dispositivo. –

+0

Hola, Rahul, a todos. Me gustaría saber la respuesta a esta pregunta también. Deseo extraer información de contacto solo desde el teléfono/sim. – Creniale

+0

'¿Puedo hacer algo como esto AccountManager.getAccounts() [0] y confiar en que esta será la cuenta predeterminada en el dispositivo' No, no puede. Si el nombre de la cuenta está vacío, no puede obtenerlo desde 'AccountManager.getAccounts()' – Autobots

Respuesta

2

hice las mismas experiencias como lo hizo y sólo puede sugerir dos soluciones:

  1. que el usuario pueda tomar la decisión. Por ejemplo, muéstrele una lista de todos los contactos brutos y luego déjelo elegir cuál es un contacto de la guía telefónica frente a un contacto sim.

  2. Mi experiencia con tres dispositivos diferentes es que AccountManager no tiene conocimiento de la cuenta utilizada para almacenar esos contactos telefónicos. Por ejemplo, cuando recupera una matriz de cuentas del AccountManager como lo hizo (AccountManager.getAccounts()), "com.htc.android.pcsc" es no en la lista. Pero puede usar exactamente ese hecho para su ventaja: Excluya todos los tipos/nombres de cuenta conocidos y la lista que obtenga debe ser la lista de todos los contactos de la libreta de teléfonos/simcontactos.

Esperamos que esas ideas que ayudaron :) Me gustaría leer sus pensamientos acerca de esas soluciones, con el tiempo me he perdido algo o si hay una mejor solución.

+0

, el punto número 2 de su solución suena bien. Pero tenga en cuenta que algunos contactos que se crean en el teléfono pueden estar bajo la cuenta de Google. Esos contactos no se sincronizarán con gmail/facebook, pero aparecerán en la agenda telefónica. Esos contactos están en "com.google" que se encuentra debajo de la lista en AccountManager. – Creniale

1

He resuelto este problema.

Account[] accountList = AccountManager.get(this).getAccounts(); 

String accountSelection = ""; 
for(int i = 0 ; i < accountList.length ; i++) { 
    if(accountSelection.length() != 0) 
    accountSelection = accountSelection + " AND "; 
    accountSelection = accountSelection + ContactsContract.Groups.ACCOUNT_TYPE + " != '" + accountList[i].type + "'"; 
} 
+0

necesita el permiso "android.permission.GET_ACCOUNTS" –

+0

¿Esto significa que el tipo de cuenta SIM y TELÉFONO no están en la lista (getAccounts())? Voy a verificar y verificar esto, gracias por compartir. –

+0

Este código solo muestra contactos que no están en ninguna cuenta. Los contactos que está creando el usuario como cuenta de Google no se mostrarán también. Tenga en cuenta que una cuenta de Google no es lo mismo que los contactos de Gmail. – Creniale

10

No he podido encontrar la manera de obtener la cuenta SIM todavía. Pero estoy usando el siguiente código para obtener el nombre y tipo de cuenta predeterminados.

public void getDefaultAccountNameAndType() { 
    String accountType = ""; 
    String accountName = ""; 

    long rawContactId = 0; 
    Uri rawContactUri = null; 
    ContentProviderResult[] results = null; 

    ArrayList<ContentProviderOperation> ops = new ArrayList<ContentProviderOperation>(); 

    ops.add(ContentProviderOperation.newInsert(RawContacts.CONTENT_URI).withValue(RawContacts.ACCOUNT_NAME, null).withValue(RawContacts.ACCOUNT_TYPE, null).build()); 

    try { 
     results = getContentResolver().applyBatch(ContactsContract.AUTHORITY, ops); 
    } catch(Exception e) { 
     e.printStackTrace(); 
    } finally { 
     ops.clear(); 
    } 

    for (ContentProviderResult result : results) { 
     rawContactUri = result.uri; 
     rawContactId = ContentUris.parseId(rawContactUri); 
    } 

    Cursor c = getContentResolver().query(
      RawContacts.CONTENT_URI 
      , new String[] {RawContacts.ACCOUNT_TYPE, RawContacts.ACCOUNT_NAME} 
      , RawContacts._ID+"=?" 
      , new String[] {String.valueOf(rawContactId)} 
      , null); 

    if(c.moveToFirst()) { 
     if(!c.isAfterLast()) { 
      accountType = c.getString(c.getColumnIndex(RawContacts.ACCOUNT_TYPE)); 
      accountName = c.getString(c.getColumnIndex(RawContacts.ACCOUNT_NAME)); 
     } 
    } 

    getContentResolver().delete(rawContactUri, null, null); 

    c.close(); 
    c = null; 

    preference.setString("contactAccountType", accountType); 
    preference.setString("contactAccountName", accountName); 
} 
+2

ahh ya veo. Agregar un contacto ficticio como predeterminado y obtener el tipo y el nombre. Gracias. Eso funcionará muy bien. Un buen trabajo alrededor. =) – Creniale

+2

hmm parece que esto no funciona para Nexus S. Funciona para HTC Hero que está en 2.1. En Nexus S, obtuve un valor nulo cuando intenté obtener el nombre/tipo de cuenta del cursor. – Creniale

Cuestiones relacionadas