2017-11-28 22 views
1

AndroidのG 連絡先ディレクトリ(またはExchangeのグローバルアドレス一覧)からアドレスを読み込もうとしています。このディレクトリは完全なContactsContractを実装するのではなく、例えばCONTENT_FILTER_URIと他にもいくつかあります。連絡先の詳細、電話番号、電子メールアドレスを読み込むことができます。しかし、私は郵便番号を読み込むことができません。連絡先IDを取得するには、次のコードを使用します。連絡先ディレクトリからアドレスを読み込む方法は?

// The directory I use in this example has the number 3: 
String directoryId = "3";  

// A contact with the name "Test" is searched in directory "3": 
Uri uri = Uri.withAppendedPath(ContactsContract.Contacts.CONTENT_FILTER_URI, Uri.encode("Test")).buildUpon() 
      .appendQueryParameter(ContactsContract.DIRECTORY_PARAM_KEY, directoryId) 
      .build(); 

// The id of the first result is loaded: 
Cursor c = cr.query(uri, new String[]{ContactsContract.Contacts._ID}, null, null, null); 
c.moveToNext(); 
String id = c.getString(0); 

その後、私は "id"の最初の連絡先のIDを持っています。今、私はその連絡先のすべての郵便番号をロードしたいと思います。しかし、このコードでは、カーソルの代わりにnullを返しますが、私はのDirectoryID「3」を使用する場合のみ:

Uri uri = ContactsContract.CommonDataKinds.StructuredPostal.CONTENT_URI.buildUpon() 
      .appendQueryParameter(ContactsContract.DIRECTORY_PARAM_KEY, directoryId) 
      .build(); 
Cursor c = cr.query(uri, new String[]{ContactsContract.CommonDataKinds.StructuredPostal.FORMATTED_ADDRESS}, ContactsContract.CommonDataKinds.StructuredPostal.CONTACT_ID+"=?", new String[]{id}, null); 
c.moveToNext(); 
c.getString(0); 

をそれのDirectoryID「0」のために正常に動作します。だから、G Suiteの連絡先ディレクトリはContactsContract.CommonDataKinds.StructuredPostal.CONTENT_URIを実装していないようです。しかし、Androidの連絡先アプリはその連絡先のアドレスを読み込むことができます。

連絡先の「StructuredPostal」オブジェクトを取得する正しい方法は、連絡先ディレクトリからですか?

+0

それは標準のContactsContacts DBにありますか?すなわち、「Uri uri = StructuredPostal」である。CONTENT_URI; ' – marmor

+0

はい、私はそれを試みました。しかし、content-idはデフォルトのディレクトリには存在しません。 "DIRECTORY_PARAM_KEY"を省略してStructuredPostal.CONTENT_URIにアクセスするとカーソルが表示されますが、 "c.moveToNext()"はfalseを返します。つまり、content-idの行はありません。これはおそらく、 "DIRECTORY_PARAM_KEY"を省略すると、デフォルトディレクトリが照会され、そのディレクトリにその連絡先に関する情報が含まれていないためです。ディレクトリ "3"(G Suite)のみが連絡先を知っています。 – Dominique

答えて

0

NEW ANSWER:

が株式の連絡先アプリのコードを見てみると、彼らがContactsContract.Contacts.Entityテーブルを使用して連絡先を問い合わせるようです。 このテーブルには、それぞれ<contact-id, raw-contact-id, data-id>トリプレットの行がContactsContract.Dataにあり、すべてのデータが含まれています。

が自分source code方法loadContactEntityを参照してください、彼らはContactsRawContactsDataからすべての情報を保持している単一カーソルを持っている、と彼らはContactと呼ばれるカスタムオブジェクトにそれをすべて置きます。 メソッドloadDataValuesは、StructuredPostal行を含むすべての情報を集めますが、クエリを減らしてMIMETYPE = StructuredPostal.CONTENT_ITEM_TYPEのみを選択することで、必要な情報のみを取得することができます。

可能なコード(ストック・連絡先アプリのコード、テストされていないに基づく):

final Uri contactUri = ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId); 
Uri entityUri = Uri.withAppendedPath(contactUri, Contacts.Entity.CONTENT_DIRECTORY); 

// copy ContactQuery.COLUMNS from https://github.com/aosp-mirror/platform_packages_apps_contacts/blob/a33aca875ae2135e720385d07d637cf8819c7f8a/src/com/android/contacts/model/ContactLoader.java#L121 
Cursor cursor = resolver.query(entityUri, ContactQuery.COLUMNS, null, null, Contacts.Entity.RAW_CONTACT_ID); 
DatabaseUtils.dumpCursor(cursor); // this will (hopefully) print EVERYTHING about this contact 

前の回答:

すべての連絡先データ項目がCommonDataKinds.StructuredPostal、大きなContactsContract.Dataテーブルに格納されていますテーブルはその特定のMIMEタイプ(StructuredPostal.CONTENT_ITEM_TYPE)にアクセスする便利な方法です。

ディレクトリの実装に固有ですが、アクセスしようとしている特定のディレクトリがStructuredPostal uriアクセスを実装していないと思います。 しかし、あなたはまだこのような何か、直接Dataを照会することにより、データにアクセスすることができるはずです:あなたは連絡先IDを持ったら、あなたが照会しようとしている、

Uri uri = ContactsContract.Data.CONTENT_URI; 
uri = uri.buildUpon().appendQueryParameter(ContactsContract.DIRECTORY_PARAM_KEY, directoryId).build(); 
String[] projection = new String[]{StructuredPostal.FORMATTED_ADDRESS}; 
String selection = Data.MIMETYPE + "='" + StructuredPostal.CONTENT_ITEM_TYPE + "' AND " + Data.CONTACT_ID+"=" + id; 

Cursor c = cr.query(uri, projection, selection, null, null); 
while (c != null && c.moveToNext()) { 
    Log.d("Data", c.getString(0)); 
} 

(このコードをテストしていない)

+0

残念ながら、 "cr.query"はnullポインタを返します。これは、有効なSQLを取得するために "StructuredPostal.CONTENT_ITEM_TYPE"の周囲に引用符を追加すると、directoryId 0に対してうまく機能しますが、directoryId 3で使用するとnullポインタが返されます。したがって、G SuiteはContactsContract.Data.CONTENT_URIも実装していないようです。 https://developer.android.com/reference/android/provider/ContactsContract.Directory.htmlによれば、Contacts.CONTENT_FILTER_URIだけを実装する必要があります。しかし、私は連絡先アプリがどのようにG Suiteのディレクトリからアドレスを取得するか把握することはできません。 :-( – Dominique

+0

ContactContract.Contacts.Entityにはどのように問い合わせることができますか?それにはUriはありません。代わりにトリプレットがあると思われるRawContactsを意味しますか?いいえ私がdirectoryIdなしでRawContacts.CONTENT_URIにアクセスすると、contact-idが見つからないため空のカーソルが得られ、directoryIdを使用するとカーソルの代わりにnullポインタが返されます(もう一度、G Suite私はRawContactsにはGAL/GSuiteの連絡先ではなく、ローカルの連絡先のみが含まれていると思います。 – Dominique

+0

あなたが言いましたソースコードは別の場所からUriを取得していますので、QuickContactsActivity onActivityResult関数で "Contacts"アプリケーションをコンパイルして実行することができましたか?そのため、Uriが使用されているかどうか調べることができますか?RawContactsテーブルについては興味深いかもしれませんが、 :https://stackoverflow.c om/questions/8788053/modification-contact-information/8802659#8802659どこでもこの問題に関する文書がないように思われるのは残念です。 – Dominique

関連する問題