I'm trying to get a contact from my contact list in my application:
public void selecionar_contato(View view) {
Intent intent = new Intent(Intent.ACTION_PICK, Contacts.CONTENT_URI);
startActivityForResult(intent, CONTACT_PICKER_RESULT);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (resultCode == RESULT_OK) {
switch (requestCode) {
case CONTACT_PICKER_RESULT:
Uri dados = data.getData();
Cursor c = getContentResolver().query(dados, new String[]{
ContactsContract.CommonDataKinds.Phone.NUMBER,
ContactsContract.CommonDataKinds.Phone.TYPE }, null, null, null);
if(c.moveToFirst()){
String num = c.getString(0);
int type = c.getInt(1);
mostarToast(type,num);
}
break;
}
} else {
// gracefully handle failure
Log.w("Erro", "Warning: ac");
}
}
private void mostarToast(int type, String num) {
Toast.makeText(this, type + ": " + num, Toast.LENGTH_LONG).show();
}
But when i select the contact, my app crashes:
09-21 17:44:40.897: E/AndroidRuntime(17432): FATAL EXCEPTION: main
09-21 17:44:40.897: E/AndroidRuntime(17432): Process: com.example.pacixmobile, PID: 17432
09-21 17:44:40.897: E/AndroidRuntime(17432): java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=1001, result=-1, data=Intent { dat=content://com.android.contacts/contacts/lookup/298i107/602 flg=0x1 }} to activity {com.example.pacixmobile/com.example.pacixmobile.CadastroActivity}: java.lang.IllegalArgumentException: Invalid column data1
09-21 17:44:40.897: E/AndroidRuntime(17432): at android.app.ActivityThread.deliverResults(ActivityThread.java:3551)
I have to overwrite the onActivityResult method right? What am i missing?
The columns that you request are not directly available for the Uri
you are using. You have picked a contact. You have not picked a phone number. A contact may have zero, one, or many phone numbers.
Given a Uri
picked from ContactsContract.Contacts
, you can retrieve columns available on ContactsContract.Contacts
.
I have this in one activity and it's working fine, tested in phones and tablets. I first get the selected contatct then her/his phone number. I need a mobile number if it's exists, also it's 9 digits (spanish number) removing the +34 or whatever country code it has.
@Override
public void onActivityResult(int requestCode, int resultCode, Intent intent)
{
// super.onActivityResult(requestCode, resultCode, intent);
if (requestCode != 0x10 || resultCode != RESULT_OK)
{
super.onActivityResult(requestCode, resultCode, intent);
return;
}
Cursor cursor = null;
Uri contactUri = intent.getData();
long contactId = -1;
// get display name from the contact
try
{
cursor = getContentResolver().query(contactUri,
new String[] { ContactsContract.Contacts._ID, ContactsContract.Contacts.DISPLAY_NAME }, null, null,
null);
if (cursor.moveToFirst())
{
String name = cursor.getString(1);
contactId = cursor.getLong(0);
etNombre.setText(name);
}
}
catch (Exception e)
{
e.printStackTrace();
}
finally
{
if (cursor != null)
{
cursor.close();
cursor = null;
}
}
// do we have a valid contact ID?
if (contactId == -1) return;
// get all phone numbers with type from the contact
try
{
String tmpPhone = "";
boolean itsDone = false, gotPhone = false;
cursor = getContentResolver().query(Phone.CONTENT_URI, new String[] { Phone.TYPE, Phone.NUMBER },
Phone.CONTACT_ID + "=" + contactId, null, null);
// Pick up the first phone number
if (cursor.moveToFirst())
{
tmpPhone = cursor.getString(1);
itsDone = cursor.getInt(0) == Phone.TYPE_MOBILE;
gotPhone = true;
// if Not a mobile, search others numbers
if (!itsDone)
{
while (cursor.moveToNext())
{
if (cursor.getInt(0) == Phone.TYPE_MOBILE)
{
itsDone = true;
tmpPhone = cursor.getString(1);
break;
}
}
}
}
if (gotPhone)
{
int len = tmpPhone.length();
if (len > 9)
{
tmpPhone = parsePhone(tmpPhone);
len = tmpPhone.length();
if (len > 9)
tmpPhone = tmpPhone.substring(len - 9, len);
}
etTelefono.setText(tmpPhone);
etJornada.requestFocus();
}
else etTelefono.requestFocus();
}
catch (Exception e)
{
e.printStackTrace();
}
finally
{
if (cursor != null)
{
cursor.close();
}
}
}
void cogerContactos()
{
Intent intent = new Intent(Intent.ACTION_PICK, ContactsContract.Contacts.CONTENT_URI);
startActivityForResult(intent, 0x10);
}
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.