9

組み込みアクティビティから ID 番号を取得した後、連絡先の電話番号を取得しようとしています。ただし、以下のコードでカーソルを使用してデータベースにクエリを実行すると、選択した連絡先の携帯電話番号があるにもかかわらず、0 行が返されます。

誰かが私をより良い方向に向けたり、ユーザーIDを取得した後に連絡先の電話番号を取得する方法の例を示したりできますか?

私のコード:

    private Runnable getSMSRunnable() {
    return new Runnable() {
    public void run() {
    Intent i = new Intent(Intent.ACTION_PICK,
      ContactsContract.CommonDataKinds.Phone.CONTENT_URI);
    startActivityForResult(i, CONTACTS_REQUEST_CODE);
   }
  };
 }

ログ出力を返します

content://com.android.contacts/data/6802

そこから、ID (6802) を、指定されたタイプ (この場合は ContactsContract.CommonDataKinds.Phone.TYPE_MOBILE) の ID から電話番号を返すように設計されたメソッドに渡します。

public static String getContactPhoneNumberByPhoneType(Context context, long contactId, int type) {
    String phoneNumber = null;

    String[] whereArgs = new String[] { String.valueOf(contactId), String.valueOf(type) };

    Log.d(TAG, String.valueOf(contactId));

    Cursor cursor = context.getContentResolver().query(
            ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
            null,
            ContactsContract.CommonDataKinds.Phone.CONTACT_ID + " = ? and "
                    + ContactsContract.CommonDataKinds.Phone.TYPE + " = ?", whereArgs, null);

    int phoneNumberIndex = cursor
            .getColumnIndexOrThrow(ContactsContract.CommonDataKinds.Phone.NUMBER);

    Log.d(TAG, String.valueOf(cursor.getCount()));

    if (cursor != null) {
        Log.v(TAG, "Cursor Not null");
        try {
            if (cursor.moveToNext()) {
                Log.v(TAG, "Moved to first");
                Log.v(TAG, "Cursor Moved to first and checking");
                phoneNumber = cursor.getString(phoneNumberIndex);
            }
        } finally {
            Log.v(TAG, "In finally");
            cursor.close();
        }
    }

    Log.v(TAG, "Returning phone number");
    return phoneNumber;
}

これは、電話番号に対して null を返します。これは、アクセスしようとしている行が見つからないことを意味します。これは、クエリに問題があることを意味します。ただし、携帯電話番号を持つ連絡先を確認すると、どのように0 行のクエリを取得できますか?

どんな助けでも大歓迎です。どうもありがとう!

4

2 に答える 2

12

私は答えを見つけました。

カーソルから行を取得できなかった理由は、行を使用していたためです

ContactsContract.CommonDataKinds.Phone.CONTACT_ID

「このデータが属する Contacts テーブルの行の ID。」

とにかく連絡先テーブルから URI を取得していたので、これは不要であり、次のように置き換えられる必要がありました。ID は、生の連絡先ではなく、電話テーブルの連絡先に対応するものでした。

ContactsContract.CommonDataKinds.Phone._ID

行を交換すると、クエリで正しい結果が返されました。現時点では、すべてがうまく機能しているようです。

于 2010-07-30T20:50:22.470 に答える
2

これはうまくいくはずです(おそらくタイプを失ってみてください)

電話番号は独自のテーブルに格納されるため、個別にクエリを実行する必要があります。電話番号テーブルを照会するには、SDK 変数 ContactsContract.CommonDataKinds.Phone.CONTENT_URI に格納されている URI を使用します。指定した連絡先の電話番号を取得するには、WHERE 条件を使用します。

        if (Integer.parseInt(cur.getString(
               cur.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER))) > 0) {
            Cursor pCur = cr.query(
        ContactsContract.CommonDataKinds.Phone.CONTENT_URI, 
        null, 
        ContactsContract.CommonDataKinds.Phone.CONTACT_ID +" = ?", 
        new String[]{id}, null);
        while (pCur.moveToNext()) {
        // Do something with phones
        } 
        pCur.close();
    }

Android 連絡先 SQLite データベースに対して 2 番目のクエリを実行します。電話番号は、ContactsContract.CommonDataKinds.Phone.CONTENT_URI に格納されている URI に対して照会されます。連絡先 ID は ContactsContract.CommonDataKinds.Phone.CONTACT_ID として phone テーブルに格納され、WHERE 句を使用して返されるデータを制限します。

于 2010-07-30T10:51:25.970 に答える