2014-01-12 31 views
2

我做了什麼直到現在是:如何讓用戶從聯繫人中選擇一個電話號碼,然後得到的電話號碼,給定的名字和姓氏

點擊一些按鈕時:

Intent intent = new Intent(Intent.ACTION_PICK); 
intent.setType(ContactsContract.CommonDataKinds.Phone.CONTENT_TYPE); 
startActivityForResult(intent, CONTACT_PICKER_RESULT); 

則:

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    if (resultCode == RESULT_OK) { 
     switch (requestCode) { 
     case CONTACT_PICKER_RESULT: 
      if (data != null) { 
       Uri uri = data.getData(); 
       if (uri != null) { 
        Cursor cursor = null; 
        Cursor cursorStructuredName = null; 
        try{  
         cursor = getContentResolver().query(uri, null, null, null, null);  
         boolean hasNext = cursor.moveToNext(); 
         String contactId = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts._ID)); 
         String hasPhoneNumber = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER)); 
         String phoneNumber = null;  

         Cursor phones = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null,ContactsContract.CommonDataKinds.Phone.CONTACT_ID +" = "+ contactId,null, null); 

         if (phones.moveToFirst()) {//does not get inside the if 
          phoneNumber = phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)); 
         } 
         phones.close(); 


         // projection 
         String[] projection = new String[] {ContactsContract.CommonDataKinds.StructuredName.DISPLAY_NAME, 
           ContactsContract.CommonDataKinds.StructuredName.GIVEN_NAME, 
           ContactsContract.CommonDataKinds.StructuredName.MIDDLE_NAME, 
           ContactsContract.CommonDataKinds.StructuredName.FAMILY_NAME, 
           ContactsContract.CommonDataKinds.StructuredName.PREFIX, 
           ContactsContract.CommonDataKinds.StructuredName.SUFFIX}; 


         String where = ContactsContract.Data.RAW_CONTACT_ID + " =?"; 
         String[] whereParameters = new String[]{contactId}; 

         //Request 
         cursorStructuredName = getContentResolver().query(ContactsContract.Data.CONTENT_URI, projection, where, whereParameters, null); 

         String displayName = null; 
         String givenName = null; 
         String middleName = null;       
         String familyName = null; 
         String prefix = null; 
         String suffix = null; 
         hasNext = cursorStructuredName.moveToFirst(); 
         if (cursorStructuredName != null && hasNext) {//does not get here because hasNext equals false 
          displayName = cursorStructuredName.getString(cursorStructuredName.getColumnIndex(ContactsContract.CommonDataKinds.StructuredName.DISPLAY_NAME)); 
          givenName = cursorStructuredName.getString(cursorStructuredName.getColumnIndex(ContactsContract.CommonDataKinds.StructuredName.GIVEN_NAME)); 
          middleName = cursorStructuredName.getString(cursorStructuredName.getColumnIndex(ContactsContract.CommonDataKinds.StructuredName.MIDDLE_NAME)); 
          familyName = cursorStructuredName.getString(cursorStructuredName.getColumnIndex(ContactsContract.CommonDataKinds.StructuredName.FAMILY_NAME)); 
          prefix = cursorStructuredName.getString(cursorStructuredName.getColumnIndex(ContactsContract.CommonDataKinds.StructuredName.PREFIX)); 
          suffix = cursorStructuredName.getString(cursorStructuredName.getColumnIndex(ContactsContract.CommonDataKinds.StructuredName.SUFFIX)); 
         } 

        } finally { 
         if (cursor != null) { 
          cursor.close(); 
         } 
         if (cursorStructuredName != null) { 
          cursorStructuredName.close(); 
         } 
        } 
       } 
      } 
      break; 
     } 
    } 
} 

我不能得到的姓,給定的名稱等 我無法選擇的電話號碼。

正如我在標題中所說的,我想要的是,當用戶點擊某個按鈕時,聯繫人列表將被打開,當他選擇特定的聯繫人時,會出現此聯繫人電話號碼列表,然後當他選擇一個數字的方法onActivityResult將被調用,並有 我將「解析」電話號碼,姓氏,名稱等。

+0

我建議你用較小的方法分割你的代碼。做一切的一個大方法是不好的做法。 –

+0

你會得到一個例外嗎?發佈logcat。需要更多的信息 –

+0

有沒有例外,問題是,我正在做一些worng(也許我沒有正確地查詢...)。 phones.moveToFirst()返回false,cursorStructuredName.moveToFirst()返回false。 –

回答

1

那麼,經過更多的研究,我已經解決了我的問題。

下一個代碼讓用戶按下一個按鈕,然後打開聯繫人應用程序讓用戶選擇一個聯繫人(只顯示至少有一個電話號碼的聯繫人)。 選擇聯繫人後,所有號碼列表都是打開的,讓用戶選擇一個號碼(並非所有設備都有此選項,例如,在某些設備中,同一聯繫人出現的次數多於一次,每個電話號碼一次號)。 之後,該方法onActivityResult()被調用,然後(如果一切正常)本人extractig所選擇的電話號碼,給定的名字和姓氏(選中的聯繫人的):

@Override 
public void onClick(View v) { 
    Intent intent = new Intent(Intent.ACTION_PICK); 
    intent.setType(ContactsContract.CommonDataKinds.Phone.CONTENT_TYPE); 
    startActivityForResult(intent, CONTACT_PICKER_RESULT); 
} 

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    if (resultCode == RESULT_OK) { 
     switch (requestCode) { 
     case CONTACT_PICKER_RESULT: 
      handleContactSelection(data); 
      break; 
     } 
    } 
} 

private void handleContactSelection(Intent data) { 
    if (data != null) { 
     Uri uri = data.getData(); 
     if (uri != null) { 
      Cursor cursor = null; 
      Cursor nameCursor = null; 
      try { 
       cursor = getContentResolver().query(uri, new String[]{ 
         ContactsContract.CommonDataKinds.Phone.NUMBER, 
         CommonDataKinds.Phone.CONTACT_ID} ,         
         null, null, null); 

       String phoneNumber = null;     
       String contactId = null; 
       if (cursor != null && cursor.moveToFirst()) { 
        contactId = cursor.getString(cursor.getColumnIndex(CommonDataKinds.Phone.CONTACT_ID)); 
        phoneNumber = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));        
       } 

       String givenName = null;///first name. 
       String familyName = null;//last name. 

       String projection[] = new String[]{ContactsContract.CommonDataKinds.StructuredName.GIVEN_NAME, 
         ContactsContract.CommonDataKinds.StructuredName.FAMILY_NAME}; 
       String whereName = ContactsContract.Data.MIMETYPE + " = ? AND " + 
         ContactsContract.CommonDataKinds.StructuredName.CONTACT_ID + " = ?"; 
       String[] whereNameParams = new String[] { ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE, contactId}; 

       nameCursor = getContentResolver().query(ContactsContract.Data.CONTENT_URI, 
         projection, whereName, whereNameParams, ContactsContract.CommonDataKinds.StructuredName.GIVEN_NAME); 

       if(nameCursor != null && nameCursor.moveToNext()) { 
        givenName = nameCursor.getString(nameCursor.getColumnIndex(ContactsContract.CommonDataKinds.StructuredName.GIVEN_NAME)); 
        familyName = nameCursor.getString(nameCursor.getColumnIndex(ContactsContract.CommonDataKinds.StructuredName.FAMILY_NAME)); 
       } 

       doSomething(phoneNumber,givenName,familyName); 

      } finally { 
       if (cursor != null) { 
        cursor.close(); 
       } 

       if(nameCursor != null){ 
        nameCursor.close(); 
       } 
      } 
     } 
    } 
} 
0

我相信這一個將解決您的一些問題 。這基本上需要一個phoneno和查詢其聯繫號。我使用它來將數據上傳到服務器。至於電話號碼,我從收到的呼叫收聽者處獲得。

 

String[] projection = new String[]{ 
           ContactsContract.PhoneLookup.DISPLAY_NAME}; 
         Uri contacturi= Uri.withAppendedPath(ContactsContract.PhoneLookup.CONTENT_FILTER_URI, Uri.encode(phoneno)); 
        ContentResolver cr = getContentResolver();  
Cursor crc= cr.query(contacturi, projection, null, null, null); 
        if(crc.moveToNext()){ 
          name=crc.getString(crc.getColumnIndex(ContactsContract.PhoneLookup.DISPLAY_NAME)); 

         } 
         else{ 
          name ="Unknown"; 
         } 


您需要在crc光標上添加所有必填字段。即家庭,電子郵件,家庭。 希望這給你一些見解: -/

+1

這不好,這將返回顯示名稱,例如,「Dr. Mike Junior Laufer Suffix ...」,我只請求了名字,姓氏和電話號碼。謝謝,但無論如何,我已經找到了解決方案,甚至在我回答我自己的問題時發佈。 –

+0

好吧,我只是把這當作一個見解.....你要量身定製它,你需要:-)。是的,你回答了你自己的問題哈哈 –

相關問題