0

プロジェクトの電話タイプとメールタイプに問題があります.2.1プラットフォームを使用していますが、電話タイプとメールタイプを追加する前はプロジェクトに問題はありませんでしたが、これらの電話タイプとメールタイプを使用して実行しようとすると、メッセージボックスを開き、アプリケーションが停止して強制終了したことを示します。私のxmlファイルにはButtonとListViewがあります。私はこのコードを使用しています。

コード

 public class GetAllDatas extends Activity {

ListView lvItem;
private Button btnAdd;
String Ptype, Etype;
int contactPhoneType;

String displayName="", emailAddress="", phoneNumber="";
ArrayList<String> contactlist=new ArrayList<String>(); 
ArrayAdapter<String> itemAdapter;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    lvItem = (ListView)this.findViewById(R.id.lvitems); 
    btnAdd = (Button)this.findViewById(R.id.btnAddItem);

    itemAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1,contactlist);
    lvItem.setAdapter(itemAdapter);

    btnAdd.setOnClickListener(new View.OnClickListener() { 
        public void onClick(View v) {
            readContacts();
        }
    });

} 

private void readContacts()
{
    ContentResolver cr =getContentResolver();
    Cursor cursor = cr.query(ContactsContract.Contacts.CONTENT_URI, null, null, null, null);


    while (cursor.moveToNext()) 
    {
        displayName  = "" ;
        ArrayList<String> phoneNumber  = new ArrayList<String>();
        ArrayList<String> emailAddress  = new ArrayList<String>();

        displayName = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));       
        String id = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts._ID));

        /*                   Email                   */ 

        Cursor emails = cr.query(Email.CONTENT_URI,null,Email.CONTACT_ID + " = " + id, null, null);
        while (emails.moveToNext()) 
        { 
            emailAddress.add(emails.getString(emails.getColumnIndex(Email.DATA)));

        } 

         contactPhoneType = emails.getInt(emails.getColumnIndex(ContactsContract.CommonDataKinds.Phone.TYPE));

        switch(contactPhoneType){
        case ContactsContract.CommonDataKinds.Phone.TYPE_HOME: 
        Etype = "Home";
        break;

        }


        emails.close(); 


      /*            Phone Number and Type   */ 

        if(Integer.parseInt(cursor.getString(cursor.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()) 
            {
                 phoneNumber.add(pCur.getString(pCur.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)));                               
           }

            contactPhoneType = pCur.getInt(pCur.getColumnIndex(ContactsContract.CommonDataKinds.Phone.TYPE));


           switch(contactPhoneType){
           case ContactsContract.CommonDataKinds.Phone.TYPE_HOME: 
           Ptype = "Home";
           break;

           }


            pCur.close();  
        }   

int phoneNumberCount = phoneNumber.size();
int emailCount = emailAddress.size();

// Add arraylist data to contactlist..

if(phoneNumberCount > emailCount) {

    for (int i=0; i<phoneNumberCount; i++)
      {
        if(emailCount>i)
          {
           contactlist.add(displayName +  " , " +  Ptype + " , " + phoneNumber.get(i) + " , " + Etype + " , " + emailAddress.get(i) + "\n");    
           }
        else
        {
          contactlist.add(displayName + " , " +  Ptype + " , " + phoneNumber.get(i) + " , " + " , " + "\n");
        } 
       }
    }
    else  
       {
        for (int i=0; i<emailCount; i++) 
         {
        if(phoneNumberCount>i)
          {
            contactlist.add(displayName + " , " + Ptype + " , " + phoneNumber.get(i) + " , " +  Etype + " , " + emailAddress.get(i) + "\n"); 
          }
        else
        { 
          contactlist.add(displayName + " , " + " , " + " , " + Etype + " , " + emailAddress.get(i) +  "\n");
        }
      }
    }      
    }
    Collections.sort(contactlist);
    itemAdapter.notifyDataSetChanged();
    cursor.close(); 
} 

}

Logcat

06-26 13:31:16.213: E/AndroidRuntime(449): Uncaught handler: thread main exiting due to   uncaught exception
06-26 13:31:16.224: E/AndroidRuntime(449): android.database.CursorIndexOutOfBoundsException: Index 1 requested, with a size of 1
06-26 13:31:16.224: E/AndroidRuntime(449):  at android.database.AbstractCursor.checkPosition(AbstractCursor.java:580)
06-26 13:31:16.224: E/AndroidRuntime(449):  at android.database.AbstractWindowedCursor.checkPosition(AbstractWindowedCursor.java:214)
06-26 13:31:16.224: E/AndroidRuntime(449):  at android.database.AbstractWindowedCursor.getInt(AbstractWindowedCursor.java:84)
06-26 13:31:16.224: E/AndroidRuntime(449):  at android.database.CursorWrapper.getInt(CursorWrapper.java:123)
06-26 13:31:16.224: E/AndroidRuntime(449):  at com.abhi.GetAllDatas.readContacts(GetAllDatas.java:71)
06-26 13:31:16.224: E/AndroidRuntime(449):  at com.abhi.GetAllDatas.access$0(GetAllDatas.java:47)
06-26 13:31:16.224: E/AndroidRuntime(449):  at com.abhi.GetAllDatas$1.onClick(GetAllDatas.java:41)
4

4 に答える 4

0

見た目はインデックスに問題があるようです

android.database.CursorIndexOutOfBoundsException: Index 1 requested, with a size of 1

Phone.TYPEを取得すると、このhttp://www.vtgroup.com/#ContactsContractに従って以下のコードを試すことができます。

    //  Get all phone numbers.
    //
    Cursor phones = cr.query(Phone.CONTENT_URI, null,
        Phone.CONTACT_ID + " = " + contactId, null, null);
    while (phones.moveToNext()) {
        String number = phones.getString(phones.getColumnIndex(Phone.NUMBER));
        int type = phones.getInt(phones.getColumnIndex(Phone.TYPE));
        switch (type) {
            case Phone.TYPE_HOME:
                // do something with the Home number here...
                break;
            case Phone.TYPE_MOBILE:
                // do something with the Mobile number here...
                break;
            case Phone.TYPE_WORK:
                // do something with the Work number here...
                break;
            }
    }
    phones.close();
于 2012-06-26T08:24:43.060 に答える
0

この行かもしれません:

while (cursor.moveToNext()) 

私には、最初のカーソル位置を読み取る前にカーソルを移動しているように見え、CursorIndexOOBの例外が発生しています。

代わりにdo-whileループを試して、それが役立つかどうかを確認してください。

また、アプリケーションに連絡先データを読み取る権限があることを確認してください。

uses-permission android:name="android.permission.READ_CONTACTS"
于 2012-06-26T08:17:50.547 に答える
0

コードにエラーがあります。whileカーソルを最後のレコードを超えて移動した後、phoneTypeとemailtypeをチェックしています(ループが最後のレコードを超えた後のpCur.moveToNext() )。whileループ内でチェックする必要があります。以下を変更します。

while (pCur.moveToNext()) 
        {
             phoneNumber.add(pCur.getString(pCur.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER))); 

             int contactPhoneType = pCur.getInt(pCur.getColumnIndex(ContactsContract.CommonDataKinds.Phone.TYPE));

             switch(contactPhoneType){
                case ContactsContract.CommonDataKinds.Phone.TYPE_HOME: 
                     Ptype = "Home";
                     break;
           }                  
       }

emailTypeに対しても同じ修正を行います。

于 2012-06-26T08:17:58.077 に答える
0

Dheereshが言ったように、あなたはその状態を変えなければなりません

于 2012-06-27T06:14:21.790 に答える