【问题标题】:Android Contact Phone, Address and Name IntentAndroid 联系电话、地址和姓名意图
【发布时间】:2015-05-06 05:50:10
【问题描述】:

我正在使用基本 Intent 在 Android Studio 中获取联系人。选择联系人后,我想提取地址(家庭)、电话和姓名。我目前只能获取姓名/地址或姓名/电话。由于我相信的意图类型,我无法获得全部 3 个。

问题始于 addDeliveryItem() 的意图。根据意图类型,我可以提取电话号码或地址。我两个都需要!!!

我注意到了一些奇怪的事情:我的 getContactIDFromURI() 根据意图类型返回不同的联系人 ID。

我对这篇文章做了很大的修改,希望能找到答案。我现在已经包含了整个 .java 文件,以防您发现任何问题。我快疯了,我会向任何能解决这个问题的人发送一些严肃的爱:(。

import android.app.Activity;
import android.app.ListActivity;
import android.content.Intent;
import android.database.Cursor;
import android.net.Uri;
import android.provider.ContactsContract;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.TextView;
import java.util.ArrayList;
import java.util.List;

public class MainActivity extends Activity {

    //our main super list of deliveries
    ArrayList<String> deliveryListItems = new ArrayList<String>();

    //string adaptor that will handle data of listview
    MyCustomAdapter adapter;

    //clickCount
    int clickCounter = 0;

    //this is required to pick a contact for some reason.
    private static int PICK_CONTACT = 1;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //initialize our custom adapter for custom list
        adapter = new MyCustomAdapter(deliveryListItems, this);

        ListView lView = (ListView)findViewById(android.R.id.list);
        lView.setAdapter(adapter);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) {
            return true;
        }

        return super.onOptionsItemSelected(item);
    }

    /* Begin custom Deliverance functions */
    public void addDeliveryItem(View v){
        //these 3-4 lines create an intent to pick contacts. INTENT TYPE IS DRIVING ME CRAZY
        Intent intent = new Intent(Intent.ACTION_PICK);
        intent.setType(ContactsContract.Contacts.CONTENT_TYPE);
        //intent.setType(ContactsContract.CommonDataKinds.StructuredPostal.CONTENT_TYPE);
        startActivityForResult(intent, PICK_CONTACT);
    }

    //this function handles receiving contact numbers after they have been picked with intent
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        //URI to store the contact URI - basically URL to contact
        Uri uriContact;
        String contactName = null;
        String contactPhone = null;
        String contactAddress = null;
        String contactID = null;

        //successful contact lookup like a boss
        if ((requestCode == PICK_CONTACT) && (resultCode == RESULT_OK)) {
            //store contact URI
            uriContact = data.getData();

            contactName = getContactNameFromURI(uriContact);
            contactPhone = getContactPhoneFromURI(uriContact);
            contactID = getContactIdFromURI(uriContact);
            contactAddress = getContactAddressFromURI(uriContact);

            //add result to list
            deliveryListItems.add(contactName);
            deliveryListItems.add(contactPhone);
            deliveryListItems.add(contactAddress);
            deliveryListItems.add(contactID);

            adapter.notifyDataSetChanged();
            clickCounter++;
        }
    }

    public String getContactIdFromURI(Uri uri){
        String contactID = null;

        // getting contacts "ID" that we need for stuff
        Cursor cursorID = getContentResolver().query(uri,
                new String[]{ContactsContract.Contacts._ID},
                null, null, null);

        if (cursorID.moveToFirst()) {
            contactID = cursorID.getString(cursorID.getColumnIndex(ContactsContract.Contacts._ID));
        }
        cursorID.close();

        return contactID;
    }

    public String getContactNameFromURI(Uri uri){
        String contactName = null;
        // querying contact data store
        Cursor cursor = getContentResolver().query(uri, null, null, null, null);
        if (cursor.moveToFirst()) {
            // DISPLAY_NAME = The display name for the contact.
            // HAS_PHONE_NUMBER =   An indicator of whether this contact has at least one phone number.
            contactName = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
        }

        cursor.close();
        return contactName;
    }

    public String getContactPhoneFromURI(Uri uri){
        String contactNumber = null;
        String contactID = getContactIdFromURI(uri);

        // Using the contact ID now we will get contact phone number
        Cursor cursor = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
                new String[]{ContactsContract.CommonDataKinds.Phone.NUMBER},

                ContactsContract.CommonDataKinds.Phone.CONTACT_ID + " = ? AND " +
                        ContactsContract.CommonDataKinds.Phone.TYPE + " = " +
                        ContactsContract.CommonDataKinds.Phone.TYPE_MOBILE,

                new String[]{contactID},
                null);

        if (cursor.moveToFirst()) {
            contactNumber = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
        }

        cursor.close();
        return contactNumber;
    }

    public String getContactAddressFromURI(Uri uri){
        String rAddress = null;
        Cursor cursor = getContentResolver().query(uri, null, null, null, null);
        if (cursor.moveToFirst()) {
            try {
                rAddress = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.FORMATTED_ADDRESS));
            }catch(Exception e){
                return "nope";
            }
        }

        cursor.close();
        return rAddress;
    }
}

我可以将意图类型设置为能够检索我需要的所有数据吗?我显然不想再次选择联系人。

如果这是一个简单的问题,我很抱歉。我还是 Android 开发新手 :)。

编辑:这是我的功能,用于检索给定 URI 的联系电话、姓名和地址。它们都适用于不同的意图类型。

【问题讨论】:

    标签: java android android-intent


    【解决方案1】:

    正如@Shaik 所提到的,您可以尝试这样做来获取联系人 ID

    public static int getContactIDFromNumber(String contactNumber,Context context)
    {
        contactNumber = Uri.encode(contactNumber);
        int phoneContactID = new Random().nextInt();
        Cursor contactLookupCursor = context.getContentResolver().query(Uri.withAppendedPath(PhoneLookup.CONTENT_FILTER_URI,Uri.contactNumber),new String[] {PhoneLookup.DISPLAY_NAME, PhoneLookup._ID}, null, null, null);
            while(contactLookupCursor.moveToNext()){
                phoneContactID = contactLookupCursor.getInt(contactLookupCursor.getColumnIndexOrThrow(PhoneLookup._ID));
                }
            contactLookupCursor.close();
    
        return phoneContactID;
    }
    

    【讨论】:

    • 非常感谢您的回复,但我仍然迷路了。选择具有不同意图类型的相同联系人时,我得到了不同的联系人 ID。这意味着我可以在使用 intent.setType(ContactsContract.Contacts.CONTENT_TYPE) 时很好地获取电话号码。使用 intent.setType(ContactsContract.CommonDataKinds.StructuredPostal.CONTENT_TYPE) 时,我可以很好地获取地址。即使我选择相同的联系人,在使用每种类型的意图时我都会得到不同的联系人 ID。我很混乱。为什么地址和电话号码的联系人 ID 会不同?请帮忙!
    • 你是在模拟器上运行的吗?我相信当您使用模拟器时,联系人 ID 会发生变化。
    【解决方案2】:

    要获取联系人姓名、身份证、照片、电话,您可以参考this Gist。它给你一个清晰的解释。要获取联系人的地址,您必须修改Gist 中的代码并添加一个新函数,如下所示。

    // get the contact ID
    
    Cursor cursor = getContentResolver().query(data.getData(), null, null, null, null);
    cursor.moveToFirst();
    long id = cursor.getLong(cursor.getColumnIndex(ContactsContract.Contacts._ID));
    cursor.close();
    
    // get the data package containg the postal information for the contact
    cursor = getContentResolver().query(ContactsContract.Data.CONTENT_URI, 
        new String[]{ StructuredPostal.STREET,
            StructuredPostal.CITY,
    // add more coluns from StructuredPostal if you need them
            StructuredPostal.POSTCODE},
            ContactsContract.Data.CONTACT_ID + "=? AND " +
                StructuredPostal.MIMETYPE + "=?",
            new String[]{String.valueOf(id), StructuredPostal.CONTENT_ITEM_TYPE},
            null);
    
    
    Street = cursor.getString(cursor.getColumnIndex(StructuredPostal.STREET));
    Postcode = cursor.getString(cursor.getColumnIndex(StructuredPostal.POSTCODE));
    City = cursor.getString(cursor.getColumnIndex(StructuredPostal.CITY)));
    // etc. 
    

    这对我有用。您可以尝试一下,如果您遇到问题,请告诉我。

    【讨论】:

    • 不幸的是,在清理上面的代码并使用要点中的意图后,这仍然给我一个错误。除非我将其用作意图类型,否则我无法访问该地址:ContactsContract.CommonDataKinds.StructuredPostal.CONTENT_TYPE
    • 我注意到我的联系人 ID 因我使用的意图类型而异。这肯定是个问题。到底是怎么回事?同一联系人的 ID 从 760 变为 6528 :(.
    • 创建一个联系人ID实例并保存...然后稍后使用它来查询您的其他要求...如果您继续排队,它可能会改变...虽然我不确定...
    猜你喜欢
    • 2020-04-26
    • 1970-01-01
    • 2014-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-17
    • 2011-03-05
    • 1970-01-01
    相关资源
    最近更新 更多