2013-05-07 10 views
18

私は、Androidデバイスから連絡先を削除して別のデータベースに保存できるようにするアプリを作成しています。また、連絡先を電話に戻す必要がありますが、この部分に問題があります。データベースから連絡先情報を取得し、連絡先ID、検索キー、構造化された名前、組織、電話オブジェクトの配列リスト(電話番号と種類を含む)などを含む連絡先オブジェクトを作成します。どこのアプリがクラッシュするだけでなく、それはだ、プログラムで新しいAndroidの連絡先を電話に挿入する

public void addContact(Contact contact) 
{ 
    ContentValues values = new ContentValues(); 
    values.put("contact_id", contact.getContactId()); 
    values.put("lookup", contact.getLookupKey()); 
    values.put("mimetype", StructuredName.CONTENT_ITEM_TYPE); 
    values.put("data1", contact.getStructuredName().getDisplayName()); 
    values.put("data2", contact.getStructuredName().getGivenName()); 
    values.put("data3", contact.getStructuredName().getFamilyName()); 
    values.put("data4", contact.getStructuredName().getPrefix()); 
    values.put("data5", contact.getStructuredName().getMiddleName()); 
    values.put("data6", contact.getStructuredName().getSuffix()); 
    context.getContentResolver().insert(Data.CONTENT_URI, values); 
} 

そして:電話にその情報を復元するMy機能は、このようになります。このメソッドを使用して問題なくデータベースにデータを挿入し、正しく格納されていることを確認できます。だから私の推測は、デバイスに連絡先を挿入するよりも良い方法があるということですが、私はそれがどんなものか分かりません。誰かがプログラムで連絡先を作成してユーザーの端末に挿入する例を教えてもらえますか?表示名が作成された連絡先が表示されても満足しています。

それが重要場合、私はまた、構造化された名前の挿入上記と同じですが、無駄にこのコードを入れてみました:

values.put("_id", contact.getContactId()); 
values.put("lookup", contact.getLookupKey()); 
values.put("display_name", contact.getStructuredName().getDisplayName()); 
context.getContentResolver().insert(Contacts.CONTENT_URI, values); 
values.clear(); 

編集:ここでは時にアプリがクラッシュのための私のlogcatエラーログです:

05-07 20:31:53.941: E/Trace(819): error opening trace file: No such file or directory (2) 
05-07 20:34:39.035: D/AndroidRuntime(853): Shutting down VM 
05-07 20:34:39.048: W/dalvikvm(853): threadid=1: thread exiting with uncaught exception (group=0x40a71930) 
05-07 20:34:39.197: E/AndroidRuntime(853): FATAL EXCEPTION: main 
05-07 20:34:39.197: E/AndroidRuntime(853): java.lang.NullPointerException 
05-07 20:34:39.197: E/AndroidRuntime(853): at android.os.Parcel.readException(Parcel.java:1431) 
05-07 20:34:39.197: E/AndroidRuntime(853): at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:185) 
05-07 20:34:39.197: E/AndroidRuntime(853): at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:137) 
05-07 20:34:39.197: E/AndroidRuntime(853): at android.content.ContentProviderProxy.insert(ContentProviderNative.java:420) 
05-07 20:34:39.197: E/AndroidRuntime(853): at android.content.ContentResolver.insert(ContentResolver.java:866) 
05-07 20:34:39.197: E/AndroidRuntime(853): at com.protextyou.contacts.ContactHandler.addContact(ContactHandler.java:58) 
05-07 20:34:39.197: E/AndroidRuntime(853): at com.protextyou.StartPage$12.onClick(StartPage.java:542) 
05-07 20:34:39.197: E/AndroidRuntime(853): at com.android.internal.app.AlertController$ButtonHandler.handleMessage(AlertController.java:166) 
05-07 20:34:39.197: E/AndroidRuntime(853): at android.os.Handler.dispatchMessage(Handler.java:99) 
05-07 20:34:39.197: E/AndroidRuntime(853): at android.os.Looper.loop(Looper.java:137) 
05-07 20:34:39.197: E/AndroidRuntime(853): at android.app.ActivityThread.main(ActivityThread.java:5041) 
05-07 20:34:39.197: E/AndroidRuntime(853): at java.lang.reflect.Method.invokeNative(Native Method) 
05-07 20:34:39.197: E/AndroidRuntime(853): at java.lang.reflect.Method.invoke(Method.java:511) 
05-07 20:34:39.197: E/AndroidRuntime(853): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793) 
05-07 20:34:39.197: E/AndroidRuntime(853): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560) 
05-07 20:34:39.197: E/AndroidRuntime(853): at dalvik.system.NativeStart.main(Native Method) 
+0

クラッシュすると、ログにスタックトレースが存在するはずです。 logcatを投稿してください。 –

+0

ああ、私は正確に投稿する部分がわかりません。 '05-07 09:07:02.334:E/Trace(3052):トレースファイルを開くときにエラーが発生しました:そのようなファイルやディレクトリがありません。(2)' 'はログカットにポップアップ表示されます。 05-07 09:07:21.483:E/AndroidRuntime(3052):致命的除外:main' '05-07 09:07:21.483:E/AndroidRuntime(3052):java.lang.NullPointerException' '05-07 09:07:21.483:E/AndroidRuntime(3052):\t android.os.Parcel.readException(Parcel.java:1431) ' ' 05-07 09:07:21.483:E/AndroidRuntime(3052):\t at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:185) ' – Cheddar

+0

' NullPointerException'についての部分が投稿されます。質問を編集し、最初の2行だけでなく、_full_スタックトレースを追加します。 –

答えて

16

Reference

ContentValues values = new ContentValues(); 
      values.put(Data.RAW_CONTACT_ID, 001); 
      values.put(Data.MIMETYPE, Phone.CONTENT_ITEM_TYPE); 
      values.put(Phone.NUMBER, "1-800-GOOG-411"); 
      values.put(Phone.TYPE, Phone.TYPE_CUSTOM); 
      values.put(Phone.LABEL, "Nirav"); 
      Uri dataUri = getContentResolver().insert(android.provider.ContactsContract.Data.CONTENT_URI, values); 

上記のコードを使用します。 http://developer.android.com/reference/android/provider/ContactsContract.Data.html

+0

あなたのコードを試しましたが、アプリがまだクラッシュしました。私はあなたが投稿した最初のリンクでトップの回答のコードを試してみました。トーストは「例外:ヌル」を捕まえました。しかし、私はそれをどうしたらいいのか分からない。 – Cheddar

+1

書き込みの連絡先を許可しましたか? –

+0

はい、私は読み取りと書き込みのアクセス許可があります。 ''、 ' '、私は既に連絡先を削除することができます(私は' RawContacts.CONTENT_URI'から削除することでこれを行います)、私はアクセス許可が私の問題ではないと思います。 @NiravRanpara – Cheddar

1
ArrayList<ContentProviderOperation> ops = 
     new ArrayList<ContentProviderOperation>(); 
ops.add(ContentProviderOperation.newInsert(Data.CONTENT_URI) 
     .withValue(Data.RAW_CONTACT_ID, rawContactId) 
     .withValue(Data.MIMETYPE, Phone.CONTENT_ITEM_TYPE) 
     .withValue(Phone.NUMBER, "1-800-GOOG-411") 
     .withValue(Phone.TYPE, Phone.TYPE_CUSTOM) 
     .withValue(Phone.LABEL, "free directory assistance") 
     .build()); 
getContentResolver().applyBatch(ContactsContract.AUTHORITY, ops); 
関連する問題