2

Android 電話帳から連絡先をインポートしようとしています。アプリはすべての電話で正常に動作しますが、HTC 電話では失敗します。私のコードは以下です

 Intent pickContactIntent = new Intent(Intent.ACTION_PICK, Contacts.CONTENT_URI);
        pickContactIntent.setType(Phone.CONTENT_TYPE); // Show user only contacts w/ phone numbers
        startActivityForResult(pickContactIntent, PICK_CONTACT_REQUEST);


Uri contactUri = data.getData();
                String[] projection = {Phone.DISPLAY_NAME,Phone.NUMBER};

                Cursor cursor = getContentResolver()
                        .query(contactUri, projection, null, null, null);
                cursor.moveToFirst();

                // Retrieve the phone number from the NUMBER column
                int column = cursor.getColumnIndex(Phone.NUMBER);
                int nameColumn=cursor.getColumnIndex(Phone.DISPLAY_NAME);
                String number = cursor.getString(column);
                String fName=cursor.getString(nameColumn);
                contact = new HashMap<String, String>();
                contact.put(fName, number);
                eName.setText(fName);

クライアントの電話にあったため、ログを見ることができませんでした。

4

2 に答える 2

1

Android には、さまざまなプロバイダー (Google、FB など) を分離してそれらを集約できるように、連絡先 (Contact <- RawContact <- Data) のいくつかの抽象化があります。ドキュメントは、連絡先プロバイダーがどのように機能するかについての良い概要を提供します:

http://developer.android.com/guide/topics/providers/contacts-provider.html

あなたの問題は、連絡先テーブルのデータ フィールドにアクセスしようとしていることにあると思います。Intent.ACTION_PICK は、連絡先テーブルを指している連絡先 uri を返します。

必要なことは、連絡先テーブルから Contacts._ID を取得してから、ContactsContract.Data テーブルから Contacts._ID でフィルター処理されたデータを取得することです。サンプル クエリは次の場所にあります。

http://developer.android.com/reference/android/provider/ContactsContract.Data.html

于 2013-01-27T10:05:35.957 に答える
0

ユーザーが経験したのはクラッシュでしたか? 名前/番号がない場合、一部のデバイスが NUMBER の DISPLAY_NAME で null を返すことが原因である可能性があります (デバイスに Skype などのカスタム コンテンツ プロバイダーがある場合に発生する可能性があります)。一部のデバイスは、display_name で数値を返し、一部のデバイスは null を返します。

それとも、ユーザーが連絡先を表示できなかっただけですか? ユーザーが実際に持っているかどうか知っていますか? たとえば、連絡帳が空の場合、コードはどうなりますか。

于 2013-01-27T10:05:55.547 に答える