データベースに保存されている Android の連絡先をユーザーの連絡先リストに追加する関数を作成しています。昨日、同様の質問をしました。Programmatically Inserting New Android Contacts into Phoneで、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);
values.clear();
}
AndroidManifest.xml ファイルで連絡先を読み書きする権限を持っているため、うまくいかない理由はありません。
<uses-permission android:name="android.permission.READ_CONTACTS" />
<uses-permission android:name="android.permission.WRITE_CONTACTS" />
とにかく、私の最後の質問に答えてくれた人がコードを提供してくれました。
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);
それを実行しても、まだクラッシュします。アプリで [連絡先の復元] ボタンをクリックした 2 番目のコードの logcat は次のとおりです。
05-08 05:57:40.905: D/AndroidRuntime(2917): Shutting down VM
05-08 05:57:40.905: W/dalvikvm(2917): threadid=1: thread exiting with uncaught exception (group=0x40a71930)
05-08 05:57:40.945: E/AndroidRuntime(2917): FATAL EXCEPTION: main
05-08 05:57:40.945: E/AndroidRuntime(2917): java.lang.NullPointerException
05-08 05:57:40.945: E/AndroidRuntime(2917): at android.content.ContextWrapper.getContentResolver(ContextWrapper.java:99)
05-08 05:57:40.945: E/AndroidRuntime(2917): at com.protextyou.contacts.ContactHandler.addContact(ContactHandler.java:46)
05-08 05:57:40.945: E/AndroidRuntime(2917): at com.protextyou.StartPage$12.onClick(StartPage.java:542)
05-08 05:57:40.945: E/AndroidRuntime(2917): at com.android.internal.app.AlertController$ButtonHandler.handleMessage(AlertController.java:166)
05-08 05:57:40.945: E/AndroidRuntime(2917): at android.os.Handler.dispatchMessage(Handler.java:99)
05-08 05:57:40.945: E/AndroidRuntime(2917): at android.os.Looper.loop(Looper.java:137)
05-08 05:57:40.945: E/AndroidRuntime(2917): at android.app.ActivityThread.main(ActivityThread.java:5041)
05-08 05:57:40.945: E/AndroidRuntime(2917): at java.lang.reflect.Method.invokeNative(Native Method)
05-08 05:57:40.945: E/AndroidRuntime(2917): at java.lang.reflect.Method.invoke(Method.java:511)
05-08 05:57:40.945: E/AndroidRuntime(2917): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
05-08 05:57:40.945: E/AndroidRuntime(2917): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
05-08 05:57:40.945: E/AndroidRuntime(2917): at dalvik.system.NativeStart.main(Native Method)
もちろん、try/catch ステートメントをコードに追加すると、"Exception: Null" が表示されます。したがって、 NullPointerException が私の問題であると推測していますが、何が原因であるかはわかりません。アプリがクラッシュしないようにするために何を修正する必要があるかを誰か説明してもらえますか?