2

Androidの連絡先リストから連絡先の名前、電話番号、住所を取得しようとしています。名前と電話番号は非常にわかりやすいですが、1.6apiレベルではアドレスにアクセスできないようです。

誰かが連絡先のアドレスを取得する方法を理解しましたか?また、2.0には完全に新しいAPIがあります。これを利用して、1つのバイナリを使用して古いAPIにフォールバックするにはどうすればよいですか。それさえ可能なら。

4

4 に答える 4

7

Android 2.0より前では、Contacts.ContactMethods.CONTENT_URIにクエリを実行して、渡す必要のある住所を取得する必要があります。

Contacts.ContactMethods.PERSON_ID + "=? and " + Contacts.ContactMethods.KIND + "=?"

選択およびselectArgsパラメーターの場合:

new String[] { personId, Integer.toString(Contacts.KIND_POSTAL) }

2.0以降では、新しいContactsContractを使用します。これは、連絡先が複数のソースにわたる情報を集約できるようになったため、はるかに複雑です。新しいAPIに関するいくつかの優れたグループ投稿は、ここここにあります。

同じバイナリから複数のプラットフォームAPIをターゲットにするための推奨される方法は、リフレクションを使用することです(このブログ投稿を参照)。マニフェストでアプリを1.6以下にターゲットにしているが、ビルドパスを設定してAndroid 2.0 jarファイルを取得する場合、リフレクションを必要とせずに2.0apisを呼び出すことができます。2.0クラスに依存するクラスが1.6デバイスにロードされないように、またはクラスローダーがスローすることに非常に注意する必要があります。これを回避するには、ある種のファクトリを使用して依存関係(またはGuiceのようなDIフレームワーク)を解除する必要があります。詳細については、この投稿を参照してください。

于 2009-12-07T11:53:46.393 に答える
4

「連絡先の読み方」へのリンクを提供してくれたAnthonyForloney(下記)に感謝します。そのリンクの内容を「アドレス」の読み方のコードで拡張するには、これらの行が役立つはずです!ご覧のとおり、 StructuredPostal定数を使用してクエリを実行することにより、住所を取得する必要があります。

            Cursor postals = getContentResolver().query(
                ContactsContract.CommonDataKinds.StructuredPostal.CONTENT_URI,
                null,
                ContactsContract.CommonDataKinds.StructuredPostal.CONTACT_ID + " = "
                        + contactId, null, null);
        int postFormattedNdx = postals.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.FORMATTED_ADDRESS);
        int postTypeNdx = postals.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.TYPE);
        int postStreetNdx = postals.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.STREET);
        while (postals.moveToNext()) {
            String postalData = postals.getString(postFormattedNdx);
            postalCat = postalCat+ postalData+ ", [";
            postalData = String.valueOf(postals.getInt(postTypeNdx));
            postalCat = postalCat+ postalData+ "], ";
            postalData = postals.getString(postStreetNdx);
            postalCat = postalCat+ postalData+ " ";
        }
        postals.close();

そのリンクの残りの部分は、実際に名前と電話をフェッチします(ブール値の「電話番号があります」の間違いを修正すると、ブール値は正しく解析されません)

于 2010-10-22T19:48:49.693 に答える
1

私の電話のATMですが、ここにあなたと同じような質問のリンクがあります。

これがお役に立てば幸いです。

編集:

私が言ったように、少なくともあなたが探していたものに向けて私の元の答えを編集します、これはおそらく遅く邪悪であり、あなたはすでにあなたの答えを持っていますが、あなたがまだいくつかを探しているなら、あなたが探す必要があるものについてもっと情報がありますはContactsContract.CommonDataKinds.StructuredPostalであり、住所に関する特定の詳細を抽出できます。Android 2.0を使用した例として、ここでは連絡先から情報を抽出するいくつかの例を示します。つまり、まだ理解していない場合です。

幸運を。

于 2009-12-06T19:42:57.933 に答える
1

これは私がAndroid2.3.3でそれをした方法です:

            String where = ContactsContract.Data._ID + " = "
                                                     + uriData.getLastPathSegment()
                                                     + " AND ContactsContract.Data.MIMETYPE = '"
                                                     + ContactsContract.CommonDataKinds.StructuredPostal.CONTENT_ITEM_TYPE
                                                     + "'";

            String[] projection = new String[] { StructuredPostal.STREET,
                                                 StructuredPostal.CITY,
                                                 StructuredPostal.REGION,
                                                 StructuredPostal.POSTCODE,
                                                 StructuredPostal.COUNTRY};

            Cursor cursor = getContentResolver().query( ContactsContract.Data.CONTENT_URI,
                                                         projection,
                                                         where,
                                                         null,
                                                         null);
            String strOutput = "";
            if (cursor.moveToFirst())
            {
                strOutput += "\n" + cursor.getString(0);
                strOutput += "\n" + cursor.getString(1);
                strOutput += "\n" + cursor.getString(2);
                strOutput += "\n" + cursor.getString(3);
                strOutput += "\n" + cursor.getString(4);
            } 

            cursor.close();

注:アドレスを表示するuriDataインテントをキャプチャすることで取得されます。これはここで解決されます:連絡先/連絡先カードの「勤務先住所の表示」に関連付けられている意図は何ですか?

の代わりに_ID、お気軽にお試しくださいContactsContract.Data.CONTACT_ID

于 2011-07-25T05:55:10.553 に答える