2012-01-26 2 views
0

다음 코드를 열심히했습니다.하지만 불행히도 항목이 잘못된 연락처에 할당되었습니다. 나는 이유를 모른다. 시간 일을 테스트했지만 실수를 찾을 수 없습니다. 너 나 좀 도와 줄 수있어? 연락처 정보를 Android 연락처 테이블에 추가하십시오.

연락처 선택기를 사용하여 연락처를 선택하고이 사람의 일정 항목 (생년월일)을 연락처 테이블에 추가하려면이 코드를 사용하고 싶습니다.

1 단계 :

이미 매니페스트 파일에 권한을 설정 한 :

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

2 단계 :

연락처 선택기의 ID가 정의 :

private static final int CONTACT_PICKER_ID = 123; 
, 단계 3 : 접촉 선택기라고

:

Intent contactPickerIntent = new Intent(Intent.ACTION_PICK, ContactsContract.Contacts.CONTENT_URI); 
startActivityForResult(contactPickerIntent, CONTACT_PICKER_ID); 

단계 4 : 또 다른 방법은 접촉 선택기의 결과를 수신하고 시도

선택된 사용자에 대한 이벤트를 추가 할 :

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    super.onActivityResult(requestCode, resultCode, data); 
    if (resultCode == RESULT_OK) { 
     switch (requestCode) { 
      case CONTACT_PICKER_ID: 
       Uri selectedPerson = data.getData(); 
       String contactId = selectedPerson.getLastPathSegment(); 
       // ADD A NEW EVENT FOR THE SELECTED CONTACT --- BEGIN 
       ContentValues values = new ContentValues(); 
       values.put(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Event.CONTENT_ITEM_TYPE); 
       values.put(ContactsContract.Data.RAW_CONTACT_ID, contactId); 
       values.put(ContactsContract.CommonDataKinds.Event.TYPE, ContactsContract.CommonDataKinds.Event.TYPE_BIRTHDAY); 
       values.put(ContactsContract.CommonDataKinds.Event.RAW_CONTACT_ID, contactId); 
       values.put(ContactsContract.CommonDataKinds.Event.LABEL, ""); 
       values.put(ContactsContract.CommonDataKinds.Event.START_DATE, "2010-01-28"); // hard-coded date of birth 
       Uri created = null; 
       try { 
        created = getContentResolver().insert(ContactsContract.Data.CONTENT_URI, values); 
       } 
       catch (Exception e) { 
       } 
       if (created == null) { 
        Toast.makeText(this.getApplicationContext(), "Failed inserting the event!", Toast.LENGTH_SHORT).show(); 
       } 
       else { 
        Toast.makeText(this.getApplicationContext(), "Successfully inserted the event!", Toast.LENGTH_SHORT).show(); 
       } 
       // ADD A NEW EVENT FOR THE SELECTED CONTACT --- END 
      break; 
     } 
    } 
} 

이벤트가 성공적으로 삽입되었습니다. 데이터베이스와 Google 연락처에도 표시됩니다.하지만 불행히도 잘못된 연락처에 할당되어 있습니다. 이게 왜 그렇게? 내 contactId입니다. 연락처 선택 도구에서 잘못 되었나요?

+0

나는 어떤 방법 으로든 안드로이드 전문가가 아니지만 연락처를 읽고 쓰기 권한을 선택해야합니까? – Jared

+0

http://developer.android.com/reference/android/Manifest.permission.html WRITE_CONTACTS에는 읽을 수 없습니다. 다시 나는 이것이 내게 떨어져있는 대답 일 뿐이라는 것을 모른다. – Jared

+0

죄송합니다. READ_CONTACTS 권한도 설정되어 있습니다. 그러나 독서 과정은 문제가 아닙니다. 그것은 작동하지 않는 글입니다. – caw

답변

2

연락처 선택 도구에서 얻은 활동 결과는 연락처의 전체 경로입니다. 뭔가 같이 :

content://com.android.contacts/contacts/lookup/0r7-2C46324E483C324A3A484634/7 

이것은 당신의 무엇이다 :

Uri selectedPerson = data.getData(); 

이것은 상대의 LOOKUP_KEY 및 연락처의 _ID 모두 포함되어 있습니다. 그러나 데이터 테이블에 삽입 할 때 RawContacts _ID를 사용해야합니다.하나의 연락처에 여러 RawContacts가있을 수 있음을 주목해야한다, 그러나

values.put(ContactsContract.Data.RAW_CONTACT_ID, rawContactId); 

다음 rawContactId을 사용하여 다음

long rawContactId = -1; 
Cursor c = getContentResolver().query(RawContacts.CONTENT_URI, 
     new String[]{RawContacts._ID}, 
     RawContacts.CONTACT_ID + "=?", 
     new String[]{String.valueOf(contactId)}, null); 
try { 
    if (c.moveToFirst()) { 
     rawContactId = c.getLong(0); 
    } 
} finally { 
    c.close(); 
} 

을 그리고 : 당신이해야 할 것은 RawContact의 _ID를 잡아입니다. 각 RawContact에 대한 이벤트를 추가하도록 코드를 조정할 수 있습니다.

0

시도 전환 ...

Uri created = null; 
try { 
    created = getContentResolver().insert(ContactsContract.Data.CONTENT_URI, values); 
}catch (Exception e) { 
} 
      if (created == null) { 
       Toast.makeText(this.getApplicationContext(), "Failed inserting the event!", Toast.LENGTH_SHORT).show(); 
      } 
      else { 
       Toast.makeText(this.getApplicationContext(), "Successfully inserted the event!", Toast.LENGTH_SHORT).show(); 
      } 

에 ...

try{ 
    Uri created = getContentResolver().insert(ContactsContract.Data.CONTENT_URI, values); 
    if (created == null) { 
     Toast.makeText(this.getApplicationContext(), "Failed inserting the event!", Toast.LENGTH_SHORT).show(); 
    }else{ 
     Toast.makeText(this.getApplicationContext(), "Successfully inserted the event!", Toast.LENGTH_SHORT).show(); 
    } 
}catch (Exception e) {} 
+0

불행히도, 이것은 아무 것도 변경되지 않습니다. 왜 실제로, 그것을해야합니까? 예외는 getContentResolver(). insert() 줄에서 throw됩니다. 그것은 여전히 ​​나쁜 "catched"던져/나중에 몇 단계를 잡았습니다. 문제는 삽입()이 예외를 throw합니다. 어쩌면 삽입 된 콘텐츠가 잘못되었습니다 (틀린 URI, 잘못된 키 - 값 쌍). – caw

+0

@MarcoW 나는 그것을 보려고 노력했는데 어떤 이유에서 건 내가 뭔가를 변화시킬 수도 있다고 생각한 것을 보았다. 나는 내 인생이 그 것을 기억할 수 없다. 나는 그것을 논평에 넣었을 것이지만, SO는 그렇지 않다. 덧글에 해당 양의 코드를 잘 지원하지 않습니다. – Jared

+0

: D 괜찮습니다. 도움을 주셔서 다시 한 번 감사드립니다. – caw

1

한 항목은 콘텐츠 값 잘못된 것입니다. onActivityResult 데이터 변수에 포함 된 Uri는 raw_contact_id가 아니라 연락처 ID입니다. 둘 사이의 차이점은 한 연락처에 여러 원시 연락처가 포함될 수 있다는 것입니다. 원시 연락처는 Google 또는 Facebook과 같은 단일 계정과 연결됩니다. 그러나 연락처에는 여러 개의 raw_contacts가 포함될 수 있습니다.

  Uri selectedPerson = data.getData(); 
      String contactId = selectedPerson.getLastPathSegment(); 
      // ADD A NEW EVENT FOR THE SELECTED CONTACT --- BEGIN 
      ContentValues values = new ContentValues(); 
      values.put(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Event.CONTENT_ITEM_TYPE); 
      ***values.put(ContactsContract.Data.CONTACT_ID, contactId);*** 
      values.put(ContactsContract.CommonDataKinds.Event.TYPE, ContactsContract.CommonDataKinds.Event.TYPE_BIRTHDAY); 
      values.put(ContactsContract.CommonDataKinds.Event.RAW_CONTACT_ID, contactId); 
      values.put(ContactsContract.CommonDataKinds.Event.LABEL, ""); 
      values.put(ContactsContract.CommonDataKinds.Event.START_DATE, "2010-01-28"); // hard-coded date of birth 
+0

이 제안에 감사드립니다. 그러나 실제로 작동하지 않습니다. insert()는 "null"을 다시 반환합니다. 건배 "실패 ..."가 표시됩니다. 새로운 행 "values.put (ContactsContract.Data.CONTACT_ID, contactId)"을 주석 처리하면 insert()가 유효한 URI를 반환합니다. – caw