Как сделать звонок непосредственно в 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 на клавиатуре набора номера, но не делает прямой вызов. Я хочу, чтобы это произошло немедленно, когда пользователь нажимает на кнопку.

Когда я пытался поставить +91 перед 100, он автоматически набирает номер, но почему плюс требуется для таких номеров. Так что кто-нибудь помогите мне решить эту проблему

6 4

6 ответов:

Из документации ACTION_CALL:

Примечание: существуют ограничения на то, какие приложения могут инициировать вызов; большинство приложений должны использовать ACTION_DIAL.

Примечание: это намерение не может быть использовано для вызова экстренных номеров. Однако приложения могут набирать номера экстренных служб с помощью ACTION_DIAL.

Таким образом, кажется, что это поведение намеренно.

Может возникнуть проблема, что система 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;
}
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);

Есть два намерения для вызова / запуска вызова: ACTION_CALL и ACTION_DIAL. ACTION_DIAL только откроет набор с заполненным номером, но позволит пользователю фактически позвонить или отклонить вызов. ACTION_CALL немедленно вызовет номер и потребует дополнительного разрешения. Поэтому убедитесь, что у вас есть разрешение

Прошло много времени. Но может помочь кому-то еще. Если вы хотите вызвать непосредственно, вы должны использовать метод requestPermissions.

1. Добавьте эту строку в файл манифеста:

<uses-permission android:name="android.permission.CALL_PHONE" />

2. определите переменную класса в классе activity:

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. и для совершения вызова сразу после нажатия на кнопку Allow, override 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);
            }
        }
    }

Когда пользователь даст разрешение, в следующий раз не будет диалогового окна и вызов будет сделан напрямую.