2017-06-16 12 views
0

私は電話の最近の連絡先を表示するアプリケーションを持っています。 私は最近の連絡先をフェッチするために以下のコードを使用しましたが、実行しようとすると次のエラーが表示されます。最近の連絡先をフェッチする最近の連絡先にエラーが発生しました

java.lang.IllegalStateException:行0、列-1を CursorWindowから読み取れませんでした。 からデータにアクセスする前に、カーソルが正しく初期化されていることを確認してください。ここで

コードをフェッチし、私の最近の連絡先である:

ContentResolver cr = getActivity().getContentResolver(); 

    String[] projection = new String[] {ContactsContract.Contacts._ID}; // you can add more fields you need here 
    int oneDay = (1000 *3600 * 24); 
    long last24h = (System.currentTimeMillis() - oneDay); 

    Cursor cur=cr.query(CallLog.Calls.CONTENT_URI,null,null,null,null); 
    String phone = null; 
    String emailContact = null; 
    String image_uri; 
    Bitmap bitmap; 


    if (cur.getCount() > 0) 
    { 
     while (cur.moveToNext()) 
     { 
      String id = cur.getString(cur 
        .getColumnIndex(ContactsContract.Contacts._ID)); 
      String name = cur 
        .getString(cur 
          .getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME)); 

      image_uri = cur 
        .getString(cur 
           .getColumnIndex(ContactsContract.CommonDataKinds.Phone.PHOTO_URI)); 
      if (Integer 
        .parseInt(cur.getString(cur 
          .getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER))) > 0) 
      { 

       Cursor pCur = cr.query(
         ContactsContract.CommonDataKinds.Phone.CONTENT_URI, 
         null, 
         ContactsContract.CommonDataKinds.Phone.CONTACT_ID 
           + " = ?", new String[]{id}, null); 
       while (pCur.moveToNext()) 
       { 
        phone = pCur 
          .getString(pCur 
            .getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)); 
        // contactid=pCur.getString(pCur.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME)); 

        /* phonenumber.add(pCur 
          .getString(pCur 
            .getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)));`*/ 

       } 
       pCur.close(); 


       Cursor emailCur = cr.query 
         (
           ContactsContract.CommonDataKinds.Email.CONTENT_URI, 
           null, 
           ContactsContract.CommonDataKinds.Email.CONTACT_ID 
             + " = ?", new String[]{id}, null); 

       while (emailCur.moveToNext()) 
       { 
        emailContact = emailCur 
          .getString(emailCur 
            .getColumnIndex(ContactsContract.CommonDataKinds.Email.DATA)); 

        if(TextUtils.isEmpty(emailContact)||emailContact.equalsIgnoreCase(null)||emailContact.equalsIgnoreCase("")) 
        { 
         emailContact=""; 

        } 

        else 
        { 

        } 
        /* emailType = emailCur 
          .getString(emailCur 
            .getColumnIndex(ContactsContract.CommonDataKinds.Email.TYPE));*/ 
       } 
       emailCur.close(); 
      } 

      if (image_uri != null) 
      { 
       System.out.println(Uri.parse(image_uri)); 
       try 
       { 
        bitmap = MediaStore.Images.Media 
          .getBitmap(getActivity().getContentResolver(), 
            Uri.parse(image_uri)); 
        System.out.println(bitmap); 

       } catch (FileNotFoundException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } catch (IOException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 
      } 

      recent_list.add(new Contacts(name, phone, image_uri,emailContact)); 
      emailContact=""; 
      phone=""; 
     } 
     cur.close(); 
    } 
    else 
    { 
     noContact.setVisibility(View.VISIBLE); 
     search_layout.setVisibility(View.GONE); 
    } 
} 
+0

あなたは必要な権限を与えましたか?どのラインで例外が発生していますか? –

+0

はい私はすべての必要な権限を与えました –

+0

電話で最近の通話履歴を表示したい –

答えて

0

あなたはそれが不可能だ、投影中に指定されていないカーソル内のフィールドにアクセスしようとしています。

プロジェクションには、必要なすべてのフィールドが含まれている必要があります。

ただし、コールログテーブルから連絡先フィールドにアクセスすることはできません。

私は最近ここにあなたの他の質問に回答したように:How to fetch recent and favourite contacts in android?

関連する問題