我正在尝试使用 ContactsContract,Phone 中的联系人 ID 从 CommonDataKinds.Phone 中提取电话号码
Posted
技术标签:
【中文标题】我正在尝试使用 ContactsContract,Phone 中的联系人 ID 从 CommonDataKinds.Phone 中提取电话号码【英文标题】:I'm trying to extract phone number from CommonDataKinds.Phone using contact ID from ContactsContract,Phone 【发布时间】:2021-10-27 21:59:45 【问题描述】:在请求访问联系人的权限时,只要用户按“是”按钮,就会产生以下错误消息。
java.lang.RuntimeException: Failure delivering result ResultInfowho=@android:requestPermissions:, request=131074, result=-1, data=Intent act=android.content.pm.action.REQUEST_PERMISSIONS (has extras) to activity com.example.criminalintent/com.example.criminalintent.CrimePagerActivity: java.lang.IllegalArgumentException: the bind value at index 1 is null
com.example.criminalintent.CrimeFragment.getSuspectPhoneNumber(CrimeFragment.java:302)
at com.example.criminalintent.CrimeFragment.updateSuspectNumber(CrimeFragment.java:322) at com.example.criminalintent.CrimeFragment.onRequestPermissionsResult(CrimeFragment.java:337)
302行是查询可疑电话号码。我从联系人 ID 中获取电话号码的代码如下。
private String getSuspectPhoneNumber(String contactId)
String suspectPhoneNumber=null;
Uri phoneContactUri= ContactsContract.CommonDataKinds.Phone.CONTENT_URI;
//returns columns
String[] queryFields= new String[]
ContactsContract.Data.CONTACT_ID,
ContactsContract.CommonDataKinds.Phone.NUMBER,
ContactsContract.CommonDataKinds.Phone.TYPE;
//Selection criteria (where clause)
String mSelectionClause= ContactsContract.Data.CONTACT_ID + "=?";
//Selection criteria (where args)
String mSelectionArgs[] = contactId ;
//Does query and returns cursor object
//line 302
Cursor c= getActivity().getContentResolver().
query(phoneContactUri,queryFields,mSelectionClause,mSelectionArgs,null);
try
if (c.getCount() == 0)
return null;
c.moveToNext();
int phoneType=c.getInt(c.getColumnIndex(ContactsContract.CommonDataKinds.Phone.TYPE));
if (phoneType==ContactsContract.CommonDataKinds.Phone.TYPE_MOBILE)
suspectPhoneNumber=c.getString(c.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
finally
c.close();
return suspectPhoneNumber;
以下代码是 onActivityResults 方法的一部分,用于获取联系人/嫌疑人姓名及其电话号码的权限。
else if (requestCode == REQUEST_CONTACT && data != null)
String suspectName=getCrimeSuspect(data);
mCrime.setSuspect(suspectName);
mSuspectButton.setText(suspectName);
if (hasContactsPermission())
updateSuspectNumber();
else
requestPermissions(CONTACTS_PERMISSIONS,REQUEST_CONTACTS_PERMISSIONS);
【问题讨论】:
请添加 onActivityResult() 代码。会有问题的。 嗨,我已经添加了 onActivityResult 方法,如上所示。我认为我的问题是我不确定如何使用联系人 ID 变量来提取电话号码。我的联系人 ID 变量在另一种方法中初始化,仅提取联系人姓名和 ID。但是,getSuspectNumber 方法中的联系人 id 变量为 null。 那么,您在 getSuspectNumber 中得到了 null? 【参考方案1】:当没有找到特别是 _ID 的联系人并使用 onRequestPermissionsResult() 而不是 onActivityResult() 时,您将获得 null。
注意:请在 Manifest 中检查您的 ReadContact 权限,并授予运行时权限。
完整示例:
public class MainActivity extends AppCompatActivity
@Override
protected void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if (ContextCompat.checkSelfPermission(getApplicationContext(), Manifest.permission.READ_CONTACTS) != PackageManager.PERMISSION_GRANTED)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M)
requestPermissions(new String[]Manifest.permission.READ_CONTACTS, 0);
else
getId();
//get _ID and NAME
public void getId()
ContentResolver cr = getContentResolver();
Cursor cur = cr.query(ContactsContract.Contacts.CONTENT_URI, null, null, null, null);
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));
getNumbers(cr, id);
//get Numbers where ( _ID = CONTACT_ID).
public String getNumbers(ContentResolver cr, String Id)
List<String> Numbers = new ArrayList<>();
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));
int phoneType = pCur.getInt(pCur.getColumnIndex(ContactsContract.CommonDataKinds.Phone.TYPE));
System.out.println("Contact No:==> " + phoneType);
if (phoneType == ContactsContract.CommonDataKinds.Phone.TYPE_MOBILE)
Numbers.add(phoneNumber);
//return null when when no contacts found in specific ID otherwise it will generate error.
if (Numbers.size() == 0)
return null;
else
System.out.println("Contact No:==> " + Numbers.get(0));
return Numbers.get(0);// get number from particular index and to get all numbers set datatype String to List<String>.
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults)
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (requestCode == 0)
getId();
【讨论】:
以上是关于我正在尝试使用 ContactsContract,Phone 中的联系人 ID 从 CommonDataKinds.Phone 中提取电话号码的主要内容,如果未能解决你的问题,请参考以下文章
ContactsContract 按联系人 ID 查找电话号码
联系人列表仅使用意图 ContactsContract 显示一个电话号码
从 ContactsContract 表中获取数据时出现 SQLITE 异常