Как позвонить прямо в 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;
}
Другие вопросы по тегам