1

クラスを作成しようとしています。そのフィールドは連絡先情報 (名前、住所など) です。

  public class ContactObject {

private Activity actividad;
private Uri contactUri;`enter code here`
// variable para asegurarse que la consulta de contacto se realizó correctamente
private boolean isOK = true;

private String displayName;
private String givenName;
private String familyName;
private String region;
private String postcode;
private String city;
private String street;


public ContactObject(Activity actividad, Uri contactUri) {
    super();
    this.actividad = actividad;
    this.contactUri = contactUri;

    Cursor c = null;
    try{
        String[] selection = new String[]{
                ContactsContract.CommonDataKinds.StructuredPostal.STREET,
            ContactsContract.CommonDataKinds.StructuredPostal.CITY,
                ContactsContract.CommonDataKinds.StructuredPostal.POSTCODE,
            ContactsContract.CommonDataKinds.StructuredPostal.REGION,
            ContactsContract.CommonDataKinds.StructuredName.GIVEN_NAME,
            ContactsContract.CommonDataKinds.StructuredName.FAMILY_NAME,
            ContactsContract.Contacts.DISPLAY_NAME                      
        };

        c = actividad.getContentResolver().query(contactUri, selection,null, null, null);
        if (c != null && c.moveToFirst()) {
            this.street = c.getString(0);
            this.city = c.getString(1);
            this.postcode = c.getString(2);
            this.region = c.getString(3);
            this.givenName = c.getString(4);
            this.familyName = c.getString(5);
            this.displayName = c.getString(6);
        }
    }catch(Exception e){
        CLog.e("peta constructor ContactObject: " + e.getMessage());
        isOK = false;
    }
}
// getters and setters
}



// code to launch contact picker
Intent contactPickerIntent = new Intent(Intent.ACTION_PICK,
                Contacts.CONTENT_URI);
startActivityForResult(contactPickerIntent, CONTACT_PICKER_RESULT);


// code to create the ContactObject
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (resultCode == Activity.RESULT_OK) {
        switch (requestCode) {
        case CONTACT_PICKER_RESULT:
            Uri uri = data.getData();

            if (uri != null) {
                ContactObject co = new ContactObject(actividad, uri);
                String mensaje;
                if (co.isOK()){
                    mensaje = "Contacto encontrado: " + co.getDisplayName();
                }else{
                    mensaje = "error recuperando datos del contacto " + uri.toString();
                }
                CToast.mensajeLargo(mensaje, actividad.getApplicationContext());
            }
        }
    }
}

エミュレーターで、いくつかの連絡先を作成しました (名前と電話のみ)。テスト アプリでは、contactPicker onResult を呼び出し、連絡先 URI を使用して ContactObject を作成します。実行すると、例外がスローされ、「列 data4 が無効です」というメッセージが表示されます。

私が収集したように、「data4」は定数 ContactsContract.CommonDataKinds.StructuredPostal.STREET の値です。ただし、DISPLAY_NAME のみをクエリすると、問題なく取得できます。

これらの連絡先にはアドレスがないことはわかっていますが、(実際の) 電話の連絡先の多くにはアドレスがなく、それが原因でアプリがクラッシュすることはありません。

私は何を間違っていますか?

4

2 に答える 2

1

使用しているコンテンツ URI は何ですか?

プロジェクションには、3 つの異なる場所からの列名が含まれています: StructuredPostal StructuredName Contacts

あなたのエラーは、その列名を持たないテーブルで列名を取得しようとしていることを示しています。

特に、ContactsContract.CommonDataKinds.StructuredPostal.STREET = "data4" であることがわかります。クエリが ContactsContract.DATA テーブルに対して行われていない場合は、エラーが発生します。

Contacts Provider のドキュメントを参照してください。

于 2012-11-06T19:44:33.317 に答える
0

連絡先ピッカーを起動する意図を変更することで、それを機能させることができました。

Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
        intent.setType(ContactsContract.CommonDataKinds.StructuredPostal.CONTENT_ITEM_TYPE);
        startActivityForResult(intent, CONTACT_PICKER_RESULT); 

これを使用して(実際の)電話でテストするには、使用するアクション(ファイルマネージャー、連絡先、または(インストールされているため)ドロップボックス)を選択する必要があります。連絡先を選択すると正常に機能します。選択した連絡先からすべての情報を取得します。しかし、具体的に連絡先ピッカーを呼び出して、ユーザーの選択に任せない方法がないのではないかと思います。

于 2012-11-07T08:57:18.993 に答える