Вызвать из проиложения по телефону нужный контакт
В приложении Criminal Intent для преступления можно выбрать подозреваемого из списка контактов. Также должна быть возможность позвонить этому подозреваемому.
Я явно делаю что-то не так, потому что ничего не работает: контакт выбирается, но как ему позвонить, я не понимаю.
CrimeFragment.java
public class CrimeFragment extends Fragment {
...
private static final int REQUEST_CONTACT = 1;
...
private Button mSuspectButton;
private Button mSuspectCallButton;
private String mSuspectID;
...
@Override
public void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
if (resultCode != Activity.RESULT_OK)
return;
if (requestCode == REQUEST_DATE) {
...
} else if (requestCode == REQUEST_CONTACT && data != null) {
// здесь всё работает
Uri contactUri = data.getData();
String[] queryFields = new String[] {
ContactsContract.Contacts.DISPLAY_NAME,
ContactsContract.Contacts._ID
};
try (Cursor c = getActivity().getContentResolver()
.query(contactUri, queryFields, null, null, null)) {
if (c.getCount() == 0)
return;
c.moveToFirst();
String suspect = c.getString(c.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
mCrime.setSuspect(suspect);
mSuspectButton.setText(suspect);
mSuspectID = c.getString(c.getColumnIndex(ContactsContract.Contacts._ID));
mSuspectCallButton.setEnabled(true);
}
}
}
// когда пользователь нажимает на кнопку mSuspectButton, он выбирает подозреваемого
private void attachSuspectButton(View view) {
// здесь всё работает
final Intent pickContact = new Intent(Intent.ACTION_PICK,
ContactsContract.Contacts.CONTENT_URI);
mSuspectButton = view.findViewById(R.id.crime_suspect);
mSuspectButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
startActivityForResult(pickContact, REQUEST_CONTACT);
}
});
if (!mCrime.getSuspect().isEmpty())
mSuspectButton.setText(mCrime.getSuspect());
PackageManager packageManager = getActivity().getPackageManager();
if (packageManager.resolveActivity(
pickContact,
PackageManager.MATCH_DEFAULT_ONLY) == null)
mSuspectButton.setEnabled(false);
}
// когда пользователь нажимает на кнопку mSuspectCallButton, он звонит подозреваемому
private void attachSuspectCallButton(View view) {
mSuspectCallButton = view.findViewById(R.id.crime_suspect_call);
mSuspectCallButton.setEnabled(false);
mSuspectCallButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// тут я что-то пытался написать
String[] whereArgs = new String[] { mSuspectID };
try (Cursor c = getActivity().getContentResolver().query(
ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
null,
ContactsContract.CommonDataKinds.Phone.CONTACT_ID + " = ?",
whereArgs,
null
)) {
if (c.getCount() == 0)
return;
c.moveToFirst();
Intent callContact = new Intent(Intent.ACTION_DIAL,
Uri.parse("tel:" + c.getString(0)));
startActivity(callContact);
}
}
});
}
}
UPD:
Можно пока оставить вопрос о том, правильно ли я написал метод attachSuspectCallButton(View), потому что для начала надо решить проблему того, что на строчке с созданием объекта c класса Cursor вылетает ошибка. Не могу привести весь текст ошибки, но она связана с тем, что у приложения нет разрешения android.permission.READ_CONTACTS.
Несмотря на это, в манифесте у меня это разрешение прописано:
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest
xmlns:android="http://schemas.android.com/apk/res/android"
package="com.bignerdranch.android.criminalintentv1">
<!-- на всякий случай добавил оба варианта-->
<uses-permission android:name="android.permission.READ_CONTACTS" />
<uses-permission-sdk-23 android:name="android.permission.READ_CONTACTS" />
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".CrimeListActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name=".CrimePagerActivity"
android:parentActivityName=".CrimeListActivity" />
</application>
</manifest>