2010-06-27 7 views
9

Estoy escribiendo una aplicación que escribe contactos en la tarjeta SIM de un teléfono Android. Estoy atascado en el punto donde se agrega el número de teléfono: se produce una excepción sin motivo aparente.Android: cómo agregar un contacto a la SIM usando el SDK?

Aquí hay un fragmento de código.

import android.app.Activity; 
import android.content.ContentResolver; 
import android.content.ContentUris; 
import android.content.ContentValues; 
import android.provider.ContactsContract.RawContacts; 
import android.provider.ContactsContract.Data; 
import android.provider.ContactsContract.RawContactsEntity; 
import android.provider.ContactsContract.CommonDataKinds.Phone; 
import android.provider.ContactsContract.CommonDataKinds.StructuredName; 
import android.provider.ContactsContract.RawContacts.Entity; 
import android.database.Cursor; 
import android.net.Uri; 
import android.os.Bundle; 
import android.widget.TextView; 
[...] 
try{ 
      // add a row to the RawContacts table 
    ContentValues values = new ContentValues(); 
    values.put(RawContacts.ACCOUNT_TYPE, "com.anddroid.contacts.sim"); 
    values.put(RawContacts.ACCOUNT_NAME, "SIM"); 
    Uri rawContactUri = getContentResolver().insert(RawContacts.CONTENT_URI, values); 

      // get the ID of the newly-added line 
    long rawContactId = ContentUris.parseId(rawContactUri); 

      // add a "name" line to the Data table, linking it to the new RawContact 
      // with the CONTACT_ID column 
    values.clear(); 
    values.put(Data.RAW_CONTACT_ID, rawContactId); 
    values.put(Data.MIMETYPE, StructuredName.CONTENT_ITEM_TYPE); 
    values.put(StructuredName.DISPLAY_NAME, "Name"); 
    cr.insert(Data.CONTENT_URI, values); 
      // this insert succeeds 

      // add a "phone" line to the Data table, linking it to the new RawContact 
      // with the CONTACT_ID column 
    values.clear(); 
    values.put(Data.CONTACT_ID, rawContactId); 
    values.put(Data.MIMETYPE, Phone.CONTENT_ITEM_TYPE); 
    values.put(Phone.NUMBER, "+12345678901"); 
    values.put(Phone.TYPE, Phone.TYPE_MOBILE); 
    cr.insert(Data.CONTENT_URI, values); 
      // this insert fails with a NullPointerException 
} 
catch(Exception e){ 
    String xx=e.toString(); 
    System.out.println(xx); 
} 

La aplicación tiene permisos android.permission.READ_CONTACTS y android.permission.WRITE_CONTACTS.

El teléfono muestra un contacto con el nombre pero no el teléfono (por cierto, agregando el teléfono a ese contacto utilizando la IU normal se agrega un nuevo contacto, con nombre y teléfono, y el contacto antiguo solo permanece) .

¿Alguna idea de por qué falla el tercer inserto (el segundo en la tabla de datos), mientras que los 2 anteriores (1 en RawContacts y 1 en Data) tienen éxito?

+0

Realmente será útil si publica la traza de la excepción también – ognian

+1

Quiere decir, poner un punto de interrupción en la declaración catch y pegar la pila rastrear cuando se alcanza el punto de ruptura (es decir, se ha capturado la excepción)? ¿Puedes ver qué función arrojó la excepción de eso? Sin embargo, la sustitución de Data.CONTACT_ID con Data.RAW_CONTACT_ID resuelto. – user377486

Respuesta

1

Data.CONTACT_ID tiene que ser sustituido por Data.RAW_CONTACT_ID

2

he replicado éste en mi sistema, pero el contacto se borran tan pronto como los restart.This móviles significa que los contactos están ahorrando en el SIM temporal de móvil. ¿Ocurre lo mismo de tu lado o me falta algo? Estoy usando 3G sim.

Saludos

+1

Hola Rohit. En realidad, lo mismo sucede aquí. Aparentemente, la tabla RawContacts se sincroniza con el directorio de la tarjeta SIM al inicio, pero acceder a ella no es lo mismo que acceder al directorio telefónico de SIM real. Me gustaría saber cómo hacerlo, o al menos cómo desencadenar una resincronización entre la agenda de la tarjeta SIM y RawContacts ... – user377486

+0

¿Encontró una solución para esto? – UnknownJoe

4
values.put(RawContacts.ACCOUNT_TYPE, "com.anddroid.contacts.sim"); 

anddroid? No miré el resto, pero podría valer la pena borrar una 'd'

Cuestiones relacionadas