2014-10-05 3 views
0

Прямо сейчас, я пишу приложение, которое будет обращаться к контактной информации пользователя. Моя цель прямо сейчас - позволить пользователю выбрать кого-то из своего списка контактов, чтобы назначить их «Хранителем». Вот как я обращаюсь к контактам:Как получить контактный номер, когда имя известно?

@Override 
public void onActivityResult(int reqCode, int resultCode, Intent data) { 
    super.onActivityResult(reqCode, resultCode, data); 

    switch (reqCode) { 
     case (PICK_CONTACT) : 
      if (resultCode == Activity.RESULT_OK) { 
       Uri contactData = data.getData(); 
       Cursor c = getContentResolver().query(contactData, null, null, null, null); 
       if (c.moveToFirst()) { 
        String name = c.getString(c.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME)); 

        Intent i = new Intent(getApplicationContext(), ManageGuardian.class); 
        i.putExtra("guardian_name", name); 
        startActivity(i); 
       } 
      } 
      break; 
    } 
} 

Сейчас я получаю только контактное имя. Я хочу получить как имя, так и номер телефона, связанный с этим именем. С этим я хочу передать его в следующий вид деятельности, как это было сделано с намерением. Есть ли способ получить имя и номер телефона и передать его следующему действию? Я не могу понять это сейчас, и я в недоумении.

Спасибо!

+0

Вы считали, что вместо этого используете намерение ContactPicker? – brandall

ответ

1

Я определенно предлагаю использовать ContentPicker Intent, а затем начать другое действие, передавая эти данные. Сначала вы должны убедиться, что вы добавили READ_CONTACTS, используя разрешение на манифест. Я смог прочитать контакты, но не тянул их номера телефонов.

<uses-permission android:name="android.permission.READ_CONTACTS" /> 

Вам также необходимо убедиться, что вы заявляете свою вторую активность в манифесте.

<application 
    android:allowBackup="true" 
    android:icon="@drawable/ic_launcher" 
    android:label="@string/app_name" 
    android:theme="@style/AppTheme" > 
    <activity 
     android:name="com.example.fuuuuuuuuu.MainActivity" 
     android:label="@string/app_name" > 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 

      <category android:name="android.intent.category.LAUNCHER" /> 
     </intent-filter> 
    </activity> 
    <activity 
     android:name="com.example.fuuuuuuuuu.DetailActivity" 
     android:label="@string/title_activity_detail" > 
    </activity> 
</application> 

В моем примере коде, который работает на GenyMotion эмулятор с контактами заселенных, у меня есть два вида деятельности, основные и деталь.

activity_main.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:id="@+id/container" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    tools:context="com.example.fuuuuuuuuu.MainActivity"> 

<Button 
    android:id="@+id/btnSelectContact" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_alignParentLeft="true" 
    android:layout_alignParentTop="true" 
    android:layout_marginLeft="29dp" 
    android:layout_marginTop="34dp" 
    android:text="Pick a Contact" /> 

</RelativeLayout> 

Внутри activity_detail.xml, у меня есть:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:tools="http://schemas.android.com/tools" 
android:id="@+id/container" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
tools:context="com.example.fuuuuuuuuu.DetailActivity"> 

<TextView 
    android:id="@+id/txtName" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_alignParentLeft="true" 
    android:layout_alignParentRight="true" 
    android:layout_alignParentTop="true" 
    android:layout_marginTop="37dp" 
    android:text="" /> 

<TextView 
    android:id="@+id/txtPhone" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_alignParentLeft="true" 
    android:layout_alignParentRight="true" 
    android:layout_below="@+id/txtName" 
    android:layout_marginTop="22dp" 
    android:text="" /> 
</RelativeLayout> 

Внутри MainActivity.java, у меня есть этот код:

package com.example.fuuuuuuuuu; 

import android.app.Activity; 
import android.content.Intent; 
import android.database.Cursor; 
import android.net.Uri; 
import android.os.Bundle; 
import android.view.Menu; 
import android.view.MenuItem; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.Button; 
import android.provider.ContactsContract; 

public class MainActivity extends Activity { 

Button _btnSelectContact; 
static final int PICK_CONTACT_REQUEST = 1; 

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

    _btnSelectContact = (Button) findViewById(R.id.btnSelectContact); 
    _btnSelectContact.setOnClickListener(new OnClickListener() { 
     @Override 
     public void onClick(View arg0) { 
      Intent intent = new Intent(Intent.ACTION_PICK, ContactsContract.Contacts.CONTENT_URI); 
      startActivityForResult(intent, PICK_CONTACT_REQUEST); 
     } 
    }); 
} 

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 

    if (requestCode == PICK_CONTACT_REQUEST) { 
     if (resultCode == RESULT_OK) { 
      Uri contactUri = data.getData(); 

      Cursor cursor = getContentResolver().query(contactUri, null, null, null, null); 
      cursor.moveToFirst(); 
      String contactId = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts._ID)); 
      String displayName = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME)); 
      String hasPhoneNumberString = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER)); 
      Boolean hasPhoneNumber = Integer.parseInt(hasPhoneNumberString) > 0; 

      String phoneNumber = ""; 
      String selection = ContactsContract.CommonDataKinds.Phone.CONTACT_ID + " = " + contactId; 

      if (hasPhoneNumber) { 
       Cursor phones = getContentResolver().query(
         ContactsContract.CommonDataKinds.Phone.CONTENT_URI, 
         null, 
         selection, 
         null, null); 

       // Only getting one here ultimately, you could handle multiples depending on type 
       while (phones.moveToNext()) { 
        phoneNumber = phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)); 
       } 
       phones.close(); 
      } 

      cursor.close(); 

      Intent secondActivityIntent = new Intent(getBaseContext(), DetailActivity.class); 
      secondActivityIntent.putExtra("NAME", displayName); 
      secondActivityIntent.putExtra("PHONE", phoneNumber); 
      startActivity(secondActivityIntent); 
     } 
    } 
} 

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 

    getMenuInflater().inflate(R.menu.main, menu); 
    return true; 
} 

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    int id = item.getItemId(); 
    if (id == R.id.action_settings) { 
     return true; 
    } 
    return super.onOptionsItemSelected(item); 
} 
} 

Внутри DetailActivity. java, у меня есть:

package com.example.fuuuuuuuuu; 

import android.app.Activity; 
import android.os.Bundle; 
import android.view.Menu; 
import android.view.MenuItem; 
import android.widget.TextView; 

public class DetailActivity extends Activity { 

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

    Bundle extras = getIntent().getExtras(); 

    if (extras != null) { 
     String displayName = extras.getString("NAME"); 
     String phoneNumber = extras.getString("PHONE"); 

     TextView name = (TextView) findViewById(R.id.txtName); 
     TextView phone = (TextView) findViewById(R.id.txtPhone); 

     name.setText(displayName); 
     phone.setText(phoneNumber); 
    } 
} 

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 

    getMenuInflater().inflate(R.menu.detail, menu); 
    return true; 
} 

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    int id = item.getItemId(); 
    if (id == R.id.action_settings) { 
     return true; 
    } 
    return super.onOptionsItemSelected(item); 
} 

} 

Похоже, что вы были в большинстве своем, вам просто нужно было сделать дополнительный курсор, чтобы получить номера телефонов на основе выбранного пользователя. Я просто быстро бросил этот проект, но вы могли бы легко передать что-либо другому второму действию (User Id, Name, Phone, Email и т. Д.), А затем действовать по нему.

Смежные вопросы