我使用的基本意图是在Android中获取联系人。一旦一个联系人被选中,我想提取地址(家庭),电话和名称。我目前只能知道姓名/地址或姓名/电话。我无法得到所有的三个,因为我相信的意图类型。
问题从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。它们都有不同的意图类型。
发布于 2015-05-06 08:18:21
正如@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;
}发布于 2015-05-06 06:01:20
为了获得联系名称,id,照片,电话,你可以参考这个要旨。它给了你一个清晰的解释。为了获得联系人的地址,您必须修改要旨中的代码并添加一个新函数,如下所示。
// 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. 这对我有用。你可以试试,如果你有什么麻烦,请告诉我。
https://stackoverflow.com/questions/30068553
复制相似问题