連絡先リストからその番号の連絡先を選択します。数週間にわたって多くのソリューションと調査を読みましたが、すべての記事が適切に機能しませんでした。次のようなコード:
Intent intent = new Intent(Intent.ACTION_PICK, ContactsContract.Contacts.CONTENT_URI);
startActivityForResult(intent, PICK_CONTACT);
//およびactivityresultで:
if (resultCode == Activity.RESULT_OK) {
Uri contactData = data.getData();
Cursor c = managedQuery(contactData, null, null, null, null);
if (c.moveToFirst()) {
String name = c.getString(c.getColumnIndexOrThrow(ContactsContract.Contacts.DISPLAY_NAME));
tv1.setText(name);
}
}
または、すべての連絡先を取得するためのこのコードですが、連絡先の数がありません:
String[] contacts = new String[] {People.NAME, People.NUMBER};
Uri contentUri = People.CONTENT_URI;
Cursor cursor = managedQuery(contentUri, contacts, null, null, null);
String textContacts = "";
if (cursor.moveToFirst()) {
String myname = null;
String mynumber = null;
do {
textContacts = textContacts + cursor.getString(cursor.getColumnIndex(People.NAME)) + " : " + cursor.getString(cursor.getColumnIndex(People.NUMBER)) + "\n";
} while (cursor.moveToNext());
tv1.setText(textContacts);
}
誰も私を助けることができますか? my Androidは2.3.3
次のコードを試してみてください:
// You need below permission to read contacts
<uses-permission Android:name="Android.permission.READ_CONTACTS"/>
// Declare
static final int PICK_CONTACT=1;
Intent intent = new Intent(Intent.ACTION_PICK, ContactsContract.Contacts.CONTENT_URI);
startActivityForResult(intent, PICK_CONTACT);
//code
@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 = managedQuery(contactData, null, null, null, null);
if (c.moveToFirst()) {
String id =c.getString(c.getColumnIndexOrThrow(ContactsContract.Contacts._ID));
String hasPhone =c.getString(c.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER));
if (hasPhone.equalsIgnoreCase("1")) {
Cursor phones = getContentResolver().query(
ContactsContract.CommonDataKinds.Phone.CONTENT_URI,null,
ContactsContract.CommonDataKinds.Phone.CONTACT_ID +" = "+ id,
null, null);
phones.moveToFirst();
cNumber = phones.getString(phones.getColumnIndex("data1"));
System.out.println("number is:"+cNumber);
}
String name = c.getString(c.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
}
}
break;
}
}
電話連絡先にアクセスするには、Intent.ACTION_PICKを使用します。コードとして
Uri uri = Uri.parse("content://contacts");
Intent intent = new Intent(Intent.ACTION_PICK, uri);
intent.setType(Phone.CONTENT_TYPE);
startActivityForResult(intent, REQUEST_CODE);
どこ
private static final int REQUEST_CODE = 1;
また、選択した連絡先にアクセスするには、onActivityResult()メソッドを使用します。コードとして
@Override
protected void onActivityResult(int requestCode, int resultCode,
Intent intent) {
if (requestCode == REQUEST_CODE) {
if (resultCode == RESULT_OK) {
Uri uri = intent.getData();
String[] projection = { Phone.NUMBER, Phone.DISPLAY_NAME };
Cursor cursor = getContentResolver().query(uri, projection,
null, null, null);
cursor.moveToFirst();
int numberColumnIndex = cursor.getColumnIndex(Phone.NUMBER);
String number = cursor.getString(numberColumnIndex);
int nameColumnIndex = cursor.getColumnIndex(Phone.DISPLAY_NAME);
String name = cursor.getString(nameColumnIndex);
Log.d(TAG, "ZZZ number : " + number +" , name : "+name);
}
}
};
連絡先データを読み取る許可をアプリケーションマニフェストに追加します。
_<uses-permission Android:name="Android.permission.READ_CONTACTS"/>
_
以下のようにアクティビティで_
Intent.Action_Pick
_を使用します
_Intent contactPickerIntent = new Intent(Intent.ACTION_PICK,
ContactsContract.CommonDataKinds.Phone.CONTENT_URI);
startActivityForResult(contactPickerIntent, RESULT_PICK_CONTACT);
_
次に、
onActivityResult()
をオーバーライドします
_ @Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
// check whether the result is ok
if (resultCode == RESULT_OK) {
// Check for the request code, we might be usign multiple startActivityForReslut
switch (requestCode) {
case RESULT_PICK_CONTACT:
Cursor cursor = null;
try {
String phoneNo = null ;
String name = null;
Uri uri = data.getData();
cursor = getContentResolver().query(uri, null, null, null, null);
cursor.moveToFirst();
int phoneIndex =cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER);
phoneNo = cursor.getString(phoneIndex);
textView2.setText(phoneNo);
} catch (Exception e) {
e.printStackTrace();
}
break;
}
} else {
Log.e("MainActivity", "Failed to pick contact");
}
}
_
これで動作します
クリックまたはフォーカスイベントで連絡先リストから連絡先を選択する場合は、このコードをコピーして、アクティビティに貼り付けます。
編集テキストのイベント:
phoneNo.setOnFocusChangeListener(new OnFocusChangeListener()
{ public void onFocusChange(View v, boolean hasFocus)
{
Intent intent = new Intent(Intent.ACTION_PICK, ContactsContract.Contacts.CONTENT_URI);
startActivityForResult(intent,PICK_CONTACT );//PICK_CONTACT is private static final int, so declare in activity class
} });
連絡先名と電話番号を取得する機能IS:
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 = managedQuery(contactData, null, null, null, null);
if (c.moveToFirst()) {
String id =
c.getString(c.getColumnIndexOrThrow(ContactsContract.Contacts._ID));
String hasPhone =
c.getString(c.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER));
if (hasPhone.equalsIgnoreCase("1")) {
Cursor phones = getContentResolver().query(
ContactsContract.CommonDataKinds.Phone.CONTENT_URI,null,
ContactsContract.CommonDataKinds.Phone.CONTACT_ID +" = "+ id,
null, null);
phones.moveToFirst();
String phn_no = phones.getString(phones.getColumnIndex("data1"));
String name = c.getString(c.getColumnIndex(StructuredPostal.DISPLAY_NAME));
Toast.makeText(this, "contact info : "+ phn_no+"\n"+name, Toast.LENGTH_LONG).show();
}
}
}
}
}
ここに私が実装したものがあります:
private String[] getContactList(){
ContentResolver cr = getContentResolver();
Cursor cur = cr.query(ContactsContract.Contacts.CONTENT_URI, null, null, null, null);
Log.i(LOG_TAG, "get Contact List: Fetching complete contact list");
ArrayList<String> contact_names = new ArrayList<String>();
if (cur.getCount() > 0)
{
while (cur.moveToNext())
{
String id = cur.getString(cur.getColumnIndex(ContactsContract.Contacts._ID));
String name = cur.getString(cur.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
if (cur.getString(cur.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER.trim())).equalsIgnoreCase("1"))
{
if (name!=null){
//contact_names[i]=name;
Cursor pCur = cr.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,null,ContactsContract.CommonDataKinds.Phone.CONTACT_ID +" = ?",new String[]{id}, null);
while (pCur.moveToNext())
{
String PhoneNumber = pCur.getString(pCur.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
PhoneNumber = PhoneNumber.replaceAll("-", "");
if (PhoneNumber.trim().length() >= 10) {
PhoneNumber = PhoneNumber.substring(PhoneNumber.length() - 10);
}
contact_names.add(name + ":" + PhoneNumber);
//i++;
break;
}
pCur.close();
pCur.deactivate();
// i++;
}
}
}
cur.close();
cur.deactivate();
}
String[] contactList = new String[contact_names.size()];
for(int j = 0; j < contact_names.size(); j++){
contactList[j] = contact_names.get(j);
}
return contactList;
}
この関数を呼び出して、AutoCompleteTextViewを使用して連絡先名と10桁の番号を表示および選択することができます。この関数は文字列配列を返します。arrayListを直接返し、最後のforループを削除できます。
私のためのこの仕事
携帯番号と名前を取得
startActivityForResult(new Intent(Intent.ACTION_PICK, ContactsContract.Contacts.CONTENT_URI), TYPE_CONTACT);
case TYPE_CONTACT:uriContact = data.getData();
String name=retrieveContactName();
System.out.println("name = " + name);
String number=retrieveContactNumber();
System.out.println("number = " + number);
break;
}}
private String retrieveContactNumber(){
String contactNumber = null;
// getting contacts ID
Cursor cursorID = getContentResolver().query(uriContact,
new String[]{ContactsContract.Contacts._ID},
null, null, null);
if (cursorID.moveToFirst()) {
contactID = cursorID.getString(cursorID.getColumnIndex(ContactsContract.Contacts._ID));
}
cursorID.close();
Log.d(TAG, "Contact ID: " + contactID);
// Using the contact ID now we will get contact phone number
Cursor cursorPhone = 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 (cursorPhone.moveToFirst()) {
contactNumber = cursorPhone.getString(cursorPhone.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
}
cursorPhone.close();
Log.d(TAG, "Contact Phone Number: " + contactNumber);
return contactNumber;
}
private String retrieveContactName() {
String contactName = null;
// querying contact data store
Cursor cursor = getContentResolver().query(uriContact, 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();
Log.d(TAG, "Contact Name: " + contactName);
return contactName;
}
携帯電話番号とメールアドレスを取得する
//電話番号を取得
name = getIntent().getExtras().getString("name");
id = getIntent().getExtras().getString("contactid");
Cursor cursorPhone = 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[]{id.toString()},
null);
String contactNumber = null;
if (cursorPhone.moveToFirst()) {
contactNumber = cursorPhone.getString(cursorPhone.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
System.out.println("contactnum"+contactNumber);
}
}
cursorPhone.close();
//メールアドレスを取得
Cursor emailCursor = getContentResolver().query(ContactsContract.CommonDataKinds.Email.CONTENT_URI,
null,
ContactsContract.CommonDataKinds.Email.CONTACT_ID + " = ?", new String[]{id}, null);
if (emailCursor.moveToFirst()) {
String phone = emailCursor.getString(emailCursor.getColumnIndex(ContactsContract.CommonDataKinds.Email.DATA));
int type = emailCursor.getInt(emailCursor.getColumnIndex(ContactsContract.CommonDataKinds.Email.TYPE));
String s = (String) ContactsContract.CommonDataKinds.Email.getTypeLabel(AddContactActivity.this.getResources(), type, "");
etEmail.setText(phone);
}
emailCursor.close();
}
このコードは、電子メールなどではなく、携帯電話番号の連絡先に対して機能します。私はこのコードを最も簡単に見つけました。問題がある場合はお知らせください。
電話データ型のピックインテントでアクティビティを開始します。
findViewById(R.id.choose_contact_button).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent pickContact = new Intent(Intent.ACTION_PICK, ContactsContract.CommonDataKinds.Phone.CONTENT_URI);
startActivityForResult(pickContact, PICK_CONTACT_REQUEST);
}
});
OnAcitivityResult()を設定します。
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent intent){
switch (requestCode){
case PICK_CONTACT_REQUEST:
if (resultCode == RESULT_OK){
Uri contactUri = intent.getData();
Cursor nameCursor = getContentResolver().query(contactUri, null, null, null, null);
if (nameCursor.moveToFirst()){
String name = nameCursor.getString(nameCursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));
String number = nameCursor.getString(nameCursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
((EditText)findViewById(R.id.person_name)).setText(name);
((EditText)findViewById(R.id.enter_mobile)).setText(number);
nameCursor.close();
}
}
break;
}
}
これはあなたを助けるかもしれません:
public void onActivityResult(int reqCode, int resultCode, Intent data) {
super.onActivityResult(reqCode, resultCode, data);
try {
if (resultCode == Activity.RESULT_OK) {
Uri contactData = data.getData();
Cursor cur = managedQuery(contactData, null, null, null, null);
ContentResolver contect_resolver = getContentResolver();
if (cur.moveToFirst()) {
String id = cur.getString(cur.getColumnIndexOrThrow(ContactsContract.Contacts._ID));
String name = "";
String no = "";
Cursor phoneCur = contect_resolver.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null,
ContactsContract.CommonDataKinds.Phone.CONTACT_ID + " = ?", new String[]{id}, null);
if (phoneCur.moveToFirst()) {
name = phoneCur.getString(phoneCur.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));
no = phoneCur.getString(phoneCur.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
}
Log.e("Phone no & name :***: ", name + " : " + no);
txt.append(name + " : " + no + "\n");
id = null;
name = null;
no = null;
phoneCur = null;
}
contect_resolver = null;
cur = null;
// populateContacts();
}
} catch (IllegalArgumentException e) {
e.printStackTrace();
Log.e("IllegalArgumentException::", e.toString());
} catch (Exception e) {
e.printStackTrace();
Log.e("Error :: ", e.toString());
}
}
次のコードを試してください、
Intent intent = new Intent(Intent.ACTION_PICK);
intent.setType(ContactsContract.Contacts._ID);
startActivityForResult(intent, PICK_CONTACT);
public void onActivityResult(int requestCode, int resultCode, Intent intent)
{
if (requestCode == PICK_CONTACT)
{
Cursor cursor = managedQuery(Email.CONTENT_URI, null, Email.CONTACT_ID + " = " + intent.getData(), null, null);
cursor.moveToNext();
String contactId = cursor.getString(cursor.getColumnIndex(Email._ID));
String name = cursor.getString(cursor.getColumnIndexOrThrow(Email.DATA1));
Toast.makeText(this, "Contect LIST = "+name, Toast.LENGTH_LONG).show();
}
}
マニフェストまたは実行時の許可がなければ、これを試すことができます。
連絡先アプリから名前と連絡先番号の両方をピックアップします。このコードにより、連絡先アプリは連絡先名の下に番号も表示します。
コードは、連絡先アプリから単一の名前と番号のみを選択することです。
private void openContactSelectionIntent() {
Intent intent = new Intent(Intent.ACTION_PICK, ContactsContract.Contacts.CONTENT_URI);
intent.setType(ContactsContract.CommonDataKinds.Phone.CONTENT_TYPE);
startActivityForResult(Intent.createChooser(intent, "Select Contact"), RC_SELECT_CONTACT);
}
そして、これはonActivityResult
メソッドのコードです
Uri uri1 = data.getData();
Cursor c = managedQuery(uri1, null, null, null, null);
if (c.moveToFirst()) {
String name = c.getString(c.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
System.out.println("name is: " + name);
}
Cursor cursor = getContentResolver().query(uri1, null, null, null, null);
if (null == cursor) return;
try {
while (cursor.moveToNext()) {
String number = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Email.DATA));
System.out.println("number is "+number);
}
}catch (Exception e){
e.printStackTrace();
}finally {
cursor.close();
}
kotlin による連絡先からの選択番号の完全なコード
companion object {
const val RQ_CONTACTS = 232
}
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
if (resultCode == RESULT_OK) {
if (requestCode == RQ_CONTACTS) {
data?.let { contactPicked1(it) }
}
super.onActivityResult(requestCode, resultCode, data)
}
}
private fun getContactByNumber() {
val intent = Intent(Intent.ACTION_PICK, ContactsContract.Contacts.CONTENT_URI)
intent.setDataAndType(ContactsContract.Contacts.CONTENT_URI, ContactsContract.CommonDataKinds.Phone.CONTENT_TYPE)
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)
startActivityForResult(intent, RQ_CONTACTS)
}
private fun contactPicked1(data: Intent) {
var cursor: Cursor? = null
try {
val uri = data.data
cursor = requireActivity().contentResolver.query(uri, arrayOf(ContactsContract.CommonDataKinds.Phone.NUMBER) , null, null, null)
if (cursor.moveToFirst()) {
val phoneNo: String? =
cursor.getString(cursor.getColumnIndexOrThrow(ContactsContract.CommonDataKinds.Phone.NUMBER))
//Your code Example: phoneNo?.let{dialogAddFriend.setTextToField(it) }
}
} catch (e: Exception) {
e.printStackTrace()
} finally {
cursor?.close()
}
}
連絡先に複数の番号がある場合も、この解決策を試すことができます
Intent intent = new Intent(Intent.ACTION_PICK, ContactsContract.CommonDataKinds.Phone.CONTENT_URI);
startActivityForResult(intent , REQUEST_CODE_ADDRESS_BOOK
);
そして、アクティビティ結果について:
@Override
public void onActivityResult(int reqCode, int resultCode, Intent data) {
super.onActivityResult(reqCode, resultCode, data);
switch (reqCode) {
case (REQUEST_CODE_ADDRESS_BOOK):
if (resultCode == Activity.RESULT_OK) {
Uri contactData = data.getData();
Cursor c = getContentResolver().query(contactData, null, null, null, null);
c.moveToFirst();
String phoneNumber = c.getString(c.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
c.close();
}
break;
}
}
そして、番号はphoneNumber変数になります。
if (requestCode == RESULT_CONTACTS && resultCode == Activity.RESULT_OK) {
Uri uri;
Cursor cursor1, cursor2;
String TempNameHolder, TempNumberHolder, TempContactID, IDresult = "";
int IDresultHolder;
uri = data.getData();
cursor1 = getContentResolver().query(uri, null, null, null, null);
if (cursor1.moveToFirst()) {
TempNameHolder = cursor1.getString(cursor1.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
mToMeetName = TempNameHolder.trim();
TempContactID = cursor1.getString(cursor1.getColumnIndex(ContactsContract.Contacts._ID));
IDresult = cursor1.getString(cursor1.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER));
IDresultHolder = Integer.valueOf(IDresult);
if (IDresultHolder == 1) {
cursor2 = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, ContactsContract.CommonDataKinds.Phone.CONTACT_ID + " = " + TempContactID, null, null);
while (cursor2.moveToNext()) {
TempNumberHolder = cursor2.getString(cursor2.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
mToMeetName = TempNumberHolder.trim();
mEditTextToMeet.setText(TempNumberHolder + "( " + TempNameHolder + " )");
//number.setText(TempNumberHolder);
}
}
}
}
LiveDataを使用して、連絡先リストから名前と番号を取得し、連絡先のアクセス許可も確認できます。
ReadContactsViewModel
public class ReadContactsViewModel extends AndroidViewModel {
private MutableLiveData<ArrayList<Contat>> contactList;
public ReadContactsViewModel(@NonNull Application application) {
super(application);
}
public MutableLiveData<ArrayList<Contat>> getContacts(Context context) {
if (contactList == null) {
String phoneNumber;
ArrayList<Contat> savedContacts = new ArrayList<>();
Contat savedContact;
ContentResolver cr = context.getContentResolver();
ArrayList<String> idList = new ArrayList<>();
if (cr != null) {
Cursor cur = cr.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, null, null, "UPPER(" + ContactsContract.Contacts.DISPLAY_NAME + ") ASC");
if (cur != null) {
while (cur.moveToNext()) {
phoneNumber = cur.getString(cur.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
if (phoneNumber.length() > 9) {
savedContact = new Contat();
phoneNumber = phoneNumber.replaceAll("\\s+", "");
String id = phoneNumber.substring(phoneNumber.length() - 7);//last 7 digits of numbers
String name = cur.getString(cur.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));
String photoThumb = cur.getString(cur.getColumnIndex(ContactsContract.CommonDataKinds.Phone.PHOTO_THUMBNAIL_URI));
savedContact.setNumber(phoneNumber);
savedContact.setName(name);
if (!idList.contains(id)) {
savedContacts.add(savedContact);
idList.add(id);
}
}
}
cur.close();
idList.clear();
}
}
contactList = new MutableLiveData<>();
contactList.setValue(savedContacts);
}
return contactList;
}
これで、このsavedContactList
を取得するか、サーバーに送信できます。また、許可TedPermission
を使用しました。
private void syncContacts() {
ReadContactsViewModel readContactsViewModel = ViewModelProviders.of(this)
.get(ReadContactsViewModel.class);
Observer<ArrayList<Contat>> readContactsObserver =
new Observer<ArrayList<Contat>>() {
@Override
public void onChanged(@Nullable ArrayList<Contat> savedContactList) {
assert savedContactList != null;
for (int i = 0; i < savedContactList.size(); i++) {
Contat savedContact = savedContactList.get(i);
contactPostList.add(new Contat(savedContact.getName(), savedContact.getNumber()));
}
youractiviy.this.postContactsToServer();
}
};
contactPermissionListener = new PermissionListener() {
@Override
public void onPermissionGranted() {
readContactsViewModel.getContacts(youractiviy.this)
.observe(youractiviy.this,
readContactsObserver);
}
@Override
public void onPermissionDenied(ArrayList<String> deniedPermissions) {
}
};
TedPermission.with(this).setPermissionListener(contactPermissionListener).setDeniedMessage(R.string.permission_denied).setPermissions(Manifest.permission.READ_CONTACTS).check();
}