2013-11-21 3 views
0

나는 목록보기에서 연락처 이름과 번호를 볼 수있는 작은 프로그램을 만들었습니다.인텐 트와 연락처 세부 정보보기

public class showcontacts extends Activity 
{ 
    ListView lv; 
    Uri u; 
    @Override 
protected void onCreate(Bundle savedInstanceState) { 
    // TODO Auto-generated method stub 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.listcontacts); 
    lv=(ListView)findViewById(R.id.listView1); 
    lv.setOnItemClickListener(new mysellisten()); 
    u=Phone.CONTENT_URI; 


    shownames(); 
} 


public void shownames() 
{ 
    String[] p=new String[] { 
       Contacts._ID, 
      Contacts.DISPLAY_NAME, 
      Contacts.HAS_PHONE_NUMBER, 
      Phone.NUMBER 

      }; 
String selection = ContactsContract.Contacts.IN_VISIBLE_GROUP + " = '" 
+ ("1") + "' and "+ContactsContract.Contacts.HAS_PHONE_NUMBER+"='1'" ; 
String sortOrder = ContactsContract.Contacts.DISPLAY_NAME 
+ " COLLATE LOCALIZED ASC"; 
Cursor c=getContentResolver().query(u, p, selection,null, sortOrder); 
String from[]=new String[]{ContactsContract.Contacts.DISPLAY_NAME,ContactsContract.CommonDataKinds.Phone.NUMBER}; 
int id[]={R.id.name,R.id.phoneno}; 
SimpleCursorAdapter sc=new SimpleCursorAdapter(this,R.layout.phoneview, c, from, id); 

lv.setAdapter(sc); 

} 


class mysellisten implements OnItemClickListener 
{ 


    @Override 
    public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) { 
     // TODO Auto-generated method stub 
     Toast.makeText(getApplicationContext(), "called", Toast.LENGTH_SHORT).show(); 
     Uri nu=ContentUris.withAppendedId(ContactsContract.Contacts.CONTENT_URI, arg3); 
     Intent i=new Intent(Intent.ACTION_VIEW,nu); 
     startActivity(i); 

    } 

} 

phoneview는 Imageview와 2 개의 textviews가있는 간단한 xml입니다. 나는 이름과 phonenos를 얻을 수있다. 그러나 listview에서 항목을 클릭하면 표시되는 레코드가 적절하지 않다. 내가 클릭 한 레코드와 일치하지 않는다. 일부 레코드는 빈 화면을 표시 한 후 에뮬레이터를 열어도 목록보기로 돌아 가지 않습니다.

또한 Phone.CONTENT_URI를 사용할 때 연락처 테이블 열을 사용할 수 있지만 Contacts.CONTENT_URI를 사용하는 경우 Phone.NUMBER 필드를 사용할 수없는 이유는 무엇입니까? KINDLY UPDATE.

답변

0

permission을 AndroidManifest.xml에 추가 하시겠습니까?

<uses-permission android:name="android.permission.READ_CONTACTS" /> 
<uses-permission android:name="android.permission.WRITE_CONTACTS" /> 
+0

예 그렇지 않으면 연락처를 보여줄 이유를 수행하는 코드를 찾아주십시오 이용하여 전화 번호를 가져 오지 수 있습니다. – user2779311

0

당신은 확실히 연락처 이름과 Contacts.CONTENT_URI 그것이

try { 
     Cursor cursor = getContentResolver().query(
       ContactsContract.Contacts.CONTENT_URI, null, null, null, 
       Phone.DISPLAY_NAME + " ASC"); 
     while (cursor.moveToNext()) { 
      String contactId = cursor.getString(cursor 
        .getColumnIndex(ContactsContract.Contacts._ID)); 
      String hasPhone = cursor 
        .getString(cursor 
          .getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER)); 
      String name = cursor 
        .getString(cursor 
          .getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME)); 

      if ("1".equals(hasPhone) || Boolean.parseBoolean(hasPhone)) { 
       // You know it has a number so now query it like this 
       Cursor phones = getContentResolver().query(
         ContactsContract.CommonDataKinds.Phone.CONTENT_URI, 
         null, 
         ContactsContract.CommonDataKinds.Phone.CONTACT_ID 
           + " = " + contactId, null, null); 
       while (phones.moveToNext()) { 
        String dname = cursor 
          .getString(cursor 
            .getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME)); 
        System.out.println("Name is " + dname); 
        String phoneNumber = phones 
          .getString(phones 
            .getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)); 
        System.out.println("Phone Number is " + phoneNumber); 
        int itype = phones 
          .getInt(phones 
            .getColumnIndex(ContactsContract.CommonDataKinds.Phone.TYPE)); 

        final boolean isMobile = itype == ContactsContract.CommonDataKinds.Phone.TYPE_MOBILE 
          || itype == ContactsContract.CommonDataKinds.Phone.TYPE_WORK_MOBILE; 


       } 
       phones.close(); 
      } 
     } 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
+0

내 질문은이 데이터를 얻는 방법이 아니라 내 코드가 이렇게 작동하는 이유이며 가능한 경우 아래쪽 부분에 답하십시오. – user2779311

관련 문제