Ответ 1
В android 6.0 (Api lvl 23) у нас есть что-то, называемое "Runtime Permissions". Вы должны прочитать об этом.
Вы можете найти документацию здесь.
Я пытаюсь программным образом вызывать число со следующим кодом:
String number = ("tel:" + numTxt.getText());
Intent intent = new Intent(Intent.ACTION_CALL);
intent.setData(Uri.parse(number));
startActivity(intent);
Я установил разрешение в манифесте:
<uses-permission android:name="android.permission.CALL_PHONE"/>
Я работаю с реальным устройством для тестирования и отладки, это Nexus 5 с Android M, моя compileSdkVersion - 23. Я получаю следующее исключение безопасности:
error: Permission Denial: starting Intent { act=android.intent.action.CALL dat=tel:xxxxxxxxxx cmp=com.android.server.telecom/.components.UserCallActivity } from ProcessRecord{cbbd7c1 5228:com.dialerTest.DialerApp/u0a96} (pid=5228, uid=10096) with revoked permission android.permission.CALL_PHONE
Я искал веб-сайт и это сообщество для аналогичного Q/A и не смог найти ответ. Любая помощь будет оценена.
В android 6.0 (Api lvl 23) у нас есть что-то, называемое "Runtime Permissions". Вы должны прочитать об этом.
Вы можете найти документацию здесь.
Разрешение CALL_PHONE принадлежит группе опасных разрешений.
Поэтому, если ваши целевые приложения для Android - 23 или выше, а ваше устройство работает на Android 6.0 или более поздней версии, вы должны запросить разрешение CALL_PHONE во время работы приложения.
Пример:
String number = ("tel:" + numTxt.getText());
mIntent = new Intent(Intent.ACTION_CALL);
mIntent.setData(Uri.parse(number));
// Here, thisActivity is the current activity
if (ContextCompat.checkSelfPermission(thisActivity,
Manifest.permission.CALL_PHONE)
!= PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(thisActivity,
new String[]{Manifest.permission.CALL_PHONE},
MY_PERMISSIONS_REQUEST_CALL_PHONE);
// MY_PERMISSIONS_REQUEST_CALL_PHONE is an
// app-defined int constant. The callback method gets the
// result of the request.
} else {
//You already have permission
try {
startActivity(mIntent);
} catch(SecurityException e) {
e.printStackTrace();
}
}
Когда ваше приложение запрашивает разрешения, система представляет пользователю диалоговое окно. Когда пользователь отвечает, система вызывает ваше приложение onRequestPermissionsResult(), передавая ему ответ пользователя.
@Override
public void onRequestPermissionsResult(int requestCode,
String permissions[], int[] grantResults) {
switch (requestCode) {
case MY_PERMISSIONS_REQUEST_CALL_PHONE: {
// If request is cancelled, the result arrays are empty.
if (grantResults.length > 0
&& grantResults[0] == PackageManager.PERMISSION_GRANTED) {
// permission was granted, yay! Do the phone call
} else {
// permission denied, boo! Disable the
// functionality that depends on this permission.
}
return;
}
// other 'case' lines to check for other
// permissions this app might request
}
}
ACTION_DIAL
код может работать, только если вы сделаете ACTION_DIAL
, а не ACTION_CALL
где вам нужно запросить разрешение, поэтому, если вы хотите позвонить, следуйте этому примеру:
Манифест:
<uses-permission android:name="android.permission.CALL_PHONE" />
Код:
import static android.Manifest.permission.CALL_PHONE;
Intent i = new Intent(Intent.ACTION_CALL);
i.setData(Uri.parse("tel:0612312312"));
/*
Intent i = new Intent(Intent.ACTION_DIAL);
i.setData(Uri.parse("tel:0612312312"));
if (i.resolveActivity(getPackageManager()) != null) {
startActivity(i);
}*/
if (ContextCompat.checkSelfPermission(getApplicationContext(), CALL_PHONE) == PackageManager.PERMISSION_GRANTED) {
startActivity(i);
} else {
requestPermissions(new String[]{CALL_PHONE}, 1);
}
в классе фрагмента
Intent callIntent = new Intent(Intent.ACTION_CALL);
callIntent.setData(Uri.parse("tel:" +driver_no ));
if (ContextCompat.checkSelfPermission(getActivity(), CALL_PHONE) == PackageManager.PERMISSION_GRANTED) {
startActivity(callIntent);
} else {
requestPermissions(new String[]{CALL_PHONE}, 1);
}