2011-10-30 19 views
1

:それはうまく動作しますが、それはしてインポートした連絡先を返すdosn't読むすべての連絡先

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"; 

http://developer.android.com/resources/samples/ContactManager/index.html 私はすべての連絡先を取得するための簡単な関数を書きましたFacebookアプリケーション(ただし、連絡先アプリケーションに表示されます)。連絡先アプリケーションのようにすべての連絡先を読む方法に関するアイデア?私はあなたがその情報を見つけるためにRawContactsを見てする必要があると思う

おかげ

答えて

2

ここアンドロイドContactsドキュメントの言うことだ:

RawContactsテーブルの行は、人物を記述するデータのセットと他の 情報を表し、単一接点 ソースに関連付けられました。たとえば、ある行は、 人のGoogleまたはExchangeアカウントまたはFacebookの友人に関連付けられたデータを定義します。 の詳細については、ContactsContract.RawContactsを参照してください。

RawContactsドキュメントは言う:

それに 関連するすべてのデータと一緒に生の接触を読み込むための最良の方法は、ContactsContract.RawContacts.Entityディレクトリを使用することです。 生の連絡先にデータ行がある場合、エンティティカーソルには各データ行に対して行 が含まれます。未処理の連絡先にデータ行がない場合、カーソル に未処理の連絡先レベルの情報が含まれる行が1つ含まれます。

いくつかのサンプルコードがあるにもあります:

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

それはとても多くのスレッドのFacebookの連絡先に言及しているだけで、システムのアプリケーションやアクティビティが任意の上read.Soできるサードパーティ製のアプリケーションで読み取ることができませんアンドロイド携帯電話「DirectDial」と「DirectMessage」は、ホーム画面で長押しして作成できるもので、Facebookの連絡先を読むことができます。そこで私はAndroidのソースコードを掘り下げて、Facebookの連絡先を読むためにそこにあるものを見つけます。

私の知見。

'DirectDial'、 'DirectMessage'、およびContactShortcutのショートカットを作成するにはContactSelectionActivityが起動し、連絡先情報 'name' 'number'と 'icon'を持つ結果としてIntentを返します。ここで何をすべきか同じ

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' または 'DirectMessage'

を起動するためにContactSelectionActivityのエイリアスを作成したら

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の連絡先を読むことができるようになりました。

オープンソースのアプリケーションのリンクが完成したら、実際にこれを使用しています。

関連する問題