Как позвонить прямо в Android
Я знаю, что это было очень просто сделать, но я столкнулся с очень странной проблемой. Я должен вызвать полицию в опасной ситуации, просто нажав кнопку. Поэтому я использовал следующий код для вызова.
Intent callIntent = new Intent(Intent.ACTION_CALL);
callIntent.setData(Uri.parse("tel:100"));
callIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
ctx.startActivity(callIntent);
добавленной CALL_PHONE
разрешение в AndroidManifest.xml
, Проблема в том, что он открывает 100 на Dial Pad, но не делает вызов напрямую. Я хочу, чтобы это произошло немедленно, когда пользователь нажимает на кнопку.
Когда я пытался поставить +91 до 100, он автоматически набирает номер, но почему для таких номеров требуется плюс. Так что кто-нибудь, помогите мне, как решить эту проблему
6 ответов
Из документации ACTION_CALL
:
Примечание: будут ограничения на то, какие приложения могут инициировать вызов; большинство приложений должны использовать ACTION_DIAL.
Примечание: это намерение не может быть использовано для вызова экстренных служб. Однако приложения могут набирать номера экстренных служб, используя ACTION_DIAL.
Так что, похоже, это поведение нарочно.
Есть два способа вызова / начала вызова: ACTION_CALL и ACTION_DIAL. ACTION_DIAL откроет номеронабиратель только с заполненным номером, но позволяет пользователю фактически позвонить или отклонить вызов. ACTION_CALL немедленно позвонит по номеру и требует дополнительного разрешения. Поэтому убедитесь, что у вас есть разрешение
Прошло много времени. Но может помочь кому-то еще. Если вы хотите позвонить напрямую, вы должны использовать метод requestPermissions.
1. Добавьте эту строку в ваш файл манифеста:
<uses-permission android:name="android.permission.CALL_PHONE" />
2. Определите переменную класса в классе активности:
private static Intent phoneCallIntent; //If use don't need a member variable is good to use a static variable for memory performance.
3. Добавьте эти строки в метод onCreate упражнения:
final String permissionToCall = Manifest.permission.CALL_PHONE;
//Assume that you have a phone icon.
(findViewById(R.id.menuBarPhone)).setOnClickListener(new OnClickListener(){
public void onClick(View view) {
phoneCallIntent = new Intent(Intent.ACTION_CALL);
phoneCallIntent.setData(Uri.parse(getString(R.string.callNumber))); //Uri.parse("tel:your number")
if (ActivityCompat.checkSelfPermission(MainFrame.this, permissionToCall) != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(MainFrame.this, new String[]{permissionToCall}, 1);
return;
}
startActivity(phoneCallIntent);
}
});
4. И чтобы сделать вызов сразу после нажатия кнопки Разрешить, переопределите метод onRequestPermissionsResult:
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults){
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if(requestCode == 1){
final int permissionsLength = permissions.length;
for (int i = 0; i < permissionsLength; i++) {
if(grantResults[i] == PackageManager.PERMISSION_GRANTED){
startActivity(phoneCallIntent);
}
}
}
Когда пользователь даст разрешение, в следующий раз диалогового окна не будет, и вызов будет сделан напрямую.
private void phoneCall()
{
String phoneCallUri = "tel:91";
Intent phoneCallIntent = new Intent(Intent.ACTION_CALL);
phoneCallIntent.setData(Uri.parse(phoneCallUri));
startActivity(phoneCallIntent);
}
Лучший способ позвонить без вмешательства пользователя.
String uri = "tel:" + num.trim();
Intent intent = new Intent(Intent.ACTION_CALL);
intent.setData(Uri.parse(uri));
startActivity(intent);
Там может быть проблема, что система Android не распознает 100
как действительный номер телефона, вместо этого, если вы поставите код страны перед ним, то он работает нормально. Чтобы решить такую проблему, взгляните на эту библиотеку libnhonenumber. Вы можете использовать это как-то так
public static ArrayList<String> extractPhoneNumber(String content) {
ArrayList<String> numbers = new ArrayList<String>(0);
PhoneNumberUtil instance = PhoneNumberUtil.getInstance();
//Change IT with your contry code
Iterable<PhoneNumberMatch> matches = instance.findNumbers(content, "IT");
Iterator<PhoneNumberMatch> iterator = matches.iterator();
while (iterator.hasNext()) {
numbers.add(instance.format(iterator.next().number(), PhoneNumberFormat.INTERNATIONAL));
}
return numbers;
}