2010-06-27 29 views
9

Piszę aplikację, która zapisuje kontakty na karcie SIM telefonu z systemem Android. Utknąłem w punkcie, w którym dodano numer telefonu: wystąpił wyjątek bez wyraźnego powodu.Android: jak dodać kontakt do karty SIM za pomocą SDK?

Oto fragment kodu.

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

Aplikacja ma uprawnienia android.permission.READ_CONTACTS i android.permission.WRITE_CONTACTS.

Telefon wyświetla kontakt z nazwą, ale bez telefonu (przy okazji dodanie telefonu do tego kontaktu przy użyciu zwykłego interfejsu powoduje dodanie nowego kontaktu, nazwy i telefonu oraz starego kontaktu z nazwiskiem) .

Każdy pomysł, dlaczego trzecia wstawka (druga w tabeli danych) nie powiedzie się, podczas gdy 2 poprzednie (1 w RawContacts i 1 w danych) się powiodą?

+0

Naprawdę pomoże, jeśli prześlesz ślad stosu wyjątków. – ognian

+1

Masz na myśli umieszczenie punktu przerwania w wyciągu catch i wklejenie stosu śledzenia po trafieniu punktu przerwania (czyli przyłapaniu wyjątku)? Czy widzisz, która funkcja odstąpiła od tego wyjątku? jednak zastąpienie Data.CONTACT_ID z Data.RAW_CONTACT_ID rozwiązania. – user377486

Odpowiedz

1

Data.CONTACT_ID musi zostać zastąpiony przez Data.RAW_CONTACT_ID

2

Mam replikowane ten na moim komputerze, ale kontakt się usunięte tak szybko jak telefony restart.This oznacza styki są oszczędności w tymczasowym sim mobilny. Czy to samo dzieje się po twojej stronie lub coś mi brakuje. Używam 3G sim.

Pozdrowienia

+1

Witaj Rohit. Właściwie to samo dzieje się tutaj. Najwyraźniej tabela RawContacts jest zsynchronizowana z książką telefoniczną SIM podczas uruchamiania, ale dostęp do niej nie jest taki sam, jak dostęp do rzeczywistej książki telefonicznej karty SIM. Chciałbym wiedzieć, jak to zrobić, lub przynajmniej jak wywołać resynchronizację między książką telefoniczną SIM a RawContacts ... – user377486

+0

czy znalazłeś rozwiązanie tego? – UnknownJoe

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

anddroid? Nie patrzyłem na resztę, ale może warto wymazać "d"

Powiązane problemy