0
  • 私は日本人なので、この質問には文法上の間違いがあるかもしれません。
    そして簡単な英語で答えを書いてください。ごめん。

Android用のメールソフトを開発しています。

メールアプリの宛先を「連絡先」を選択して取得したいので、以下のようなコードを書きました。

    button1.setOnClickListener(new View.OnClickListener() {     
        public void onClick(View v) {
            // TODO Method stubs that are automatically generated.
            Intent intent = new Intent(Intent.ACTION_PICK,ContactsContract.Contacts.CONTENT_URI);
            startActivityForResult(intent, PICK_CONTACT);
        }
    public void onActivityResult(int reqCode, int resultCode, Intent data){
    super.onActivityResult(reqCode, resultCode, data);
    switch(reqCode){
       case (PICK_CONTACT):
         if (resultCode == Activity.RESULT_OK){


         Cursor c = managedQuery(Uri.parse(data.getDataString()), null, null, null, null);
    if (c.moveToFirst()){

        edittext1.setText( c.getString(
        c.getColumnIndex(ContactsContract.CommonDataKinds.Email.DATA1)));

     }
 }
case .....
}
}

しかし、実行した結果、java.lang.IllegalStateException が発生しました。

01-06 19:28:19.364: E/AndroidRuntime(614): FATAL EXCEPTION: main
01-06 19:28:19.364: E/AndroidRuntime(614): java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=3, result=-1, data=Intent { dat=content://com.android.contacts/contacts/lookup/0r1-CF25D709DAA6CF49D22F/1 flg=0x1 (has extras) }} to activity {com.example.voicemailer/com.example.voicemailer.MainActivity}: java.lang.IllegalStateException: get field slot from row 0 col -1 failed
01-06 19:28:19.364: E/AndroidRuntime(614):  at android.app.ActivityThread.deliverResults(ActivityThread.java:2532)
01-06 19:28:19.364: E/AndroidRuntime(614):  at android.app.ActivityThread.handleSendResult(ActivityThread.java:2574)
01-06 19:28:19.364: E/AndroidRuntime(614):  at android.app.ActivityThread.access$2000(ActivityThread.java:117)
01-06 19:28:19.364: E/AndroidRuntime(614):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:961)
01-06 19:28:19.364: E/AndroidRuntime(614):  at android.os.Handler.dispatchMessage(Handler.java:99)
01-06 19:28:19.364: E/AndroidRuntime(614):  at android.os.Looper.loop(Looper.java:123)
01-06 19:28:19.364: E/AndroidRuntime(614):  at android.app.ActivityThread.main(ActivityThread.java:3683)
01-06 19:28:19.364: E/AndroidRuntime(614):  at java.lang.reflect.Method.invokeNative(Native Method)
01-06 19:28:19.364: E/AndroidRuntime(614):  at java.lang.reflect.Method.invoke(Method.java:507)
01-06 19:28:19.364: E/AndroidRuntime(614):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
01-06 19:28:19.364: E/AndroidRuntime(614):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
01-06 19:28:19.364: E/AndroidRuntime(614):  at dalvik.system.NativeStart.main(Native Method)
01-06 19:28:19.364: E/AndroidRuntime(614): Caused by: java.lang.IllegalStateException: get field slot from row 0 col -1 failed
01-06 19:28:19.364: E/AndroidRuntime(614):  at android.database.CursorWindow.getString_native(Native Method)
01-06 19:28:19.364: E/AndroidRuntime(614):  at android.database.CursorWindow.getString(CursorWindow.java:329)
01-06 19:28:19.364: E/AndroidRuntime(614):  at android.database.AbstractWindowedCursor.getString(AbstractWindowedCursor.java:49)
01-06 19:28:19.364: E/AndroidRuntime(614):  at android.database.CursorWrapper.getString(CursorWrapper.java:135)
01-06 19:28:19.364: E/AndroidRuntime(614):  at com.example.voicemailer.MainActivity.onActivityResult(MainActivity.java:116)
01-06 19:28:19.364: E/AndroidRuntime(614):  at android.app.Activity.dispatchActivityResult(Activity.java:3908)
01-06 19:28:19.364: E/AndroidRuntime(614):  at android.app.ActivityThread.deliverResults(ActivityThread.java:2528)
01-06 19:28:19.364: E/AndroidRuntime(614):  ... 11 more

デバッグの結果、「Cursor c = managedQuery (null, null, null, null)), Uri.parse (data.getDataString ();」が原因だと思います。

しかし、私はそれを修正できませんでした。managedQuery() が推奨されないことは知っていますが、他の方法はわかりません。直し方を教えてください。...

PS確かにこのページを見ました: Cursor cursor = managedQuery(intent.getData().... nullpointerexception しかし、私は理解できませんでした. そのページに対する私の質問は、「getContactinfo() はどこにありますか? 使用方法は?」.

4

1 に答える 1

0

ContentResolverを使用してみてください

private static final String[] PROJECTION = new String[] {
ContactsContract.CommonDataKinds.Email.CONTACT_ID,
ContactsContract.Contacts.DISPLAY_NAME,
ContactsContract.CommonDataKinds.Email.DATA
};

...

ContentResolver cr = getContentResolver();
Cursor cursor = cr.query(ContactsContract.CommonDataKinds.Email.CONTENT_URI, PROJECTION, null, null, null);
if (cursor != null) {
try {
    final int emailIndex = cursor.getColumnIndex(ContactsContract.CommonDataKinds.Email.DATA);
    if (cursor.moveToFirst())
     {
    edittext1.setText(cursor.getString(emailIndex));
     }
    } 
finally
  {
    cursor.close();
  }
于 2013-01-06T12:28:58.157 に答える