2011-10-30 4 views
1

(등, 페이스 북에서 수입 포함) 모든 연락처를 읽고 잘이 샘플에 따르면

Uri uri = ContactsContract.Contacts.CONTENT_URI; 
    String[] projection = new String[] { 
      ContactsContract.Contacts._ID, 
      ContactsContract.Contacts.DISPLAY_NAME 
    }; 
    String selection = ContactsContract.Contacts.IN_VISIBLE_GROUP + " = '" + 
      (mShowInvisible ? "0" : "1") + "'"; 
    String[] selectionArgs = null; 
    String sortOrder = ContactsContract.Contacts.DISPLAY_NAME + " COLLATE LOCALIZED ASC"; 

그것은 작동을하지만 함께 수입 반환 연락처를 dosn't Facebook 응용 프로그램 (연락처 응용 프로그램에서는 볼 수 있음). 연락처 응용 프로그램에서와 같이 모든 연락처를 읽는 방법에 대한 아이디어가 있습니까?

감사

답변

2

나는 당신이 그 정보를 찾기 위해 RawContacts 볼 필요가 있다고 생각.

다음은 안드로이드 Contacts 문서가 무슨 말 :

RawContacts 테이블에 행이 사람을 설명하는 데이터 세트 및 기타 정보를 나타내는 단일 접점 소스와 관련. 예를 들어, 행은 사람의 Google 또는 Exchange 계정 또는 Facebook 친구 과 연결된 데이터를 정의 할 수 있습니다. 에 대한 자세한 내용은 ContactsContract.RawContacts를 참조하십시오.

RawContacts 문서 말 :

가장 좋은 방법은 그것이 ContactsContract.RawContacts.Entity 디렉토리를 사용하는 것입니다 모든 데이터가 연관와 함께 원시 접촉을 읽을 수 있습니다. 원시 연락처에 데이터 행이있는 경우 엔티티 커서에 각 데이터 행에 대해 행이 포함됩니다. 원시 연락처에 데이터 행이 없으면 커서 에 원시 연락처 수준 정보가있는 행이 하나씩 포함됩니다.

이 몇 가지 예제 코드도 있습니다 :

Uri rawContactUri = 
    ContentUris.withAppendedId(RawContacts.CONTENT_URI, rawContactId); 

Uri entityUri = 
    Uri.withAppendedPath(rawContactUri, Entity.CONTENT_DIRECTORY); 

Cursor c = 
    getContentResolver().query(entityUri, 
           new String[]{RawContacts.SOURCE_ID, 
              Entity.DATA_ID, 
              Entity.MIMETYPE, 
              Entity.DATA1}, 
           null, 
           null, 
           null); 
try 
{ 
    while (c.moveToNext()) 
    { 
     String sourceId = c.getString(0); 

     if (!c.isNull(1)) 
     { 
      String mimeType = c.getString(2); 
      String data = c.getString(3); 
      ... 
     } 
    } 
} 
finally 
{ 
    c.close(); 
} 
+1

rawContactId 란 무엇이며 어디에서 가져올 것인가 – zaiff

+0

처음에는 제공자의 연락처를 가져 오는 것이므로이 방법은 전혀 도움이되지 않습니다. 이 대답은 아무데도 데려다주지 않습니다 ... – takecare

1

그것은 너무 많은 스레드에 대한 언급은 페이스 북의 접촉은 어떤에 read.So 수있는 타사 응용 프로그램에만 시스템 응용 프로그램이나 활동에 의해 읽을 수없는이 안드로이드 전화 'DirectDial'과 'DirectMessage'는 홈 화면에서 길게 누르면 만들 수있는 페이스 북 연락처를 읽을 수 있습니다. 그래서 나는 안드로이드 소스 코드를 파고 들어 페이스 북 연락처를 읽을 수있는 곳을 찾는다.

내 결과.

'DirectDial', 'DirectMessage'및 ContactShortcut에 대한 바로 가기를 만들려면 연락처 정보 'name' 'number'및 'icon'이있는 결과로 인 텐트를 반환하는 ContactSelectionActivity가 시작됩니다. 여기에 무엇을 파헤 치는지 같은

https://github.com/android/platform_packages_apps_contacts/blob/master/src/com/android/contacts/activities/ContactSelectionActivity.java

에 대한 링크입니다 그래서 AndroidManifest를 보면 코드 내에서 'DirectDial'또는 'DirectMessage'를 실행하는 방법에 대해 설명합니다.XML

여기 https://github.com/android/platform_packages_apps_contacts/blob/master/AndroidManifest.xml

 <activity-alias android:name="alias.DialShortcut" 
     android:targetActivity=".activities.ContactSelectionActivity" 
     android:label="@string/shortcutDialContact" 
     android:icon="@mipmap/ic_launcher_shortcut_directdial" 
     android:enabled="@*android:bool/config_voice_capable"> 

     <intent-filter> 
      <action android:name="android.intent.action.CREATE_SHORTCUT" /> 
      <category android:name="android.intent.category.DEFAULT" /> 
      <category android:name="android.intent.category.CAR_MODE" /> 
     </intent-filter> 

    </activity-alias> 

    <activity-alias android:name="alias.MessageShortcut" 
     android:targetActivity=".activities.ContactSelectionActivity" 
     android:label="@string/shortcutMessageContact" 
     android:icon="@mipmap/ic_launcher_shortcut_directmessage" 
     android:enabled="@*android:bool/config_voice_capable"> 

     <intent-filter> 
      <action android:name="android.intent.action.CREATE_SHORTCUT" /> 
      <category android:name="android.intent.category.DEFAULT" /> 
     </intent-filter> 

    </activity-alias> 

들이 'DirectDial'또는를 시작 ContactSelectionActivity의 별칭을 만들 'DirectMessage'

그래서 여기

private boolean launchContactSelector() { 
    ComponentName distantActivity; 
    if (Constants.PHONE_CALL) //check what you want to call 
     distantActivity = new ComponentName("com.android.contacts", "alias.DialShortcut"); 
    else { 
     distantActivity = new ComponentName("com.android.contacts", "alias.MessageShortcut"); 
    } 
    Intent intent = new Intent(); 
    intent.setComponent(distantActivity); 
    intent.setAction(Intent.ACTION_PICK); 
    intent.setAction(Intent.ACTION_CREATE_SHORTCUT); 
    startActivityForResult(intent, selector); 
    return true; 

} 

일단 directdial 미사일하는 코드 또는 메시지가 연락처가 선택되었습니다.

protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    super.onActivityResult(requestCode, resultCode, data); 
    if (resultCode != Activity.RESULT_OK) return; 
    Intent intent = new Intent(); 
    intent = ((Intent) data.getParcelableExtra(Intent.EXTRA_SHORTCUT_INTENT)); 
    switch (requestCode) { 
    case Constants.PHONE_CALL: { 
     intent.setAction(Intent.ACTION_CALL); 
     break; 
    } 
    case Constants.MESSAGE: { 
     intent.setAction(Intent.ACTION_SENDTO); 
     break; 
    } 
    } 
    String number = intent.getData().toString(); //It will have the phone number 

    String name = data.getStringExtra(Intent.EXTRA_SHORTCUT_NAME); //Contact name 
    ImageView image = new ImageView() //Contact image 
    image.setImageBitmap((Bitmap) data.getParcelableExtra(Intent.EXTRA_SHORTCUT_ICON)); 

    // Must need to set the Intent.ACTION_SENDTO or Intent.ACTION_CALL because default   permission sent is CALL_PRIVILEGED which is for system Activty you .  

    startActivity(data); 

    } 

앱 내에서 Facebook 연락처를 읽을 수 있습니다. 향후 사용할 수 있도록 일부 정보를 저장하십시오.

오픈 소스 응용 프로그램의 링크를 게시하고 나면 실제로 이것을 사용하고 있습니다.

관련 문제