Как заставить звонилку открыться с отображенным номером телефона?


193

Мне не нужно звонить по номеру телефона, мне просто нужно, чтобы звонилка открывалась с уже отображенным номером телефона. Что Intentя должен использовать для достижения этой цели?

Ответы:


532

Два способа добиться этого.

1) Нужно запустить звонилку через код, без взаимодействия с пользователем.

Вам нужно Action_Dial,

используйте код ниже, он откроет номеронабиратель с указанным номером

Intent intent = new Intent(Intent.ACTION_DIAL);
intent.setData(Uri.parse("tel:0123456789"));
startActivity(intent); 

Префикс 'tel:' является обязательным , в противном случае будет выдано следующее исключение: java.lang.IllegalStateException: Не удалось выполнить метод действия.

Action_Dial не требует никакого разрешения.

Если вы хотите инициировать вызов напрямую, без участия пользователя , вы можете использовать действие Intent.ACTION_CALL. В этом случае вы должны добавить следующее разрешение в ваш AndroidManifest.xml:

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

2) Нужно, чтобы пользователь щелкнул строку Phone_Number и начал звонок.

android:autoLink="phone" 

Вам нужно использовать TextView со свойством ниже.

android: autoLink = "phone" android: linksClickable = "true" свойство textView

Вам не нужно использовать намерение или получить разрешение таким образом.


9
Это здорово и отличается от Intent.ACTION_CALL тем, что не вызывает сразу
Amt87

Требует ли разрешение ACTION_DIAL или только ACCESS_CALL?
Марк Плано-Лесей

1
Это работает и с телефонными номерами из Дании :). Вам не нужно добавлять +45 перед номером. Работает нормально, просто
разбирая

1
У меня возникла проблема с кнопкой возврата после открытия звонилки в новом намерении. Я могу вернуться к своему приложению только при 3-х нажатиях на кнопку «назад» (показывает несколько экранов дозвона, которые я не открывал - сам номеронабиратель, создание нового экрана контактов, избранное). Кто-нибудь знает, как вернуться в приложение одним нажатием кнопки назад?
Кашло

2
2012 ... старые добрые времена. Это политически корректный 2018 год, крупные компании продают пользовательские данные, и нашим приложениям приходится иметь дело с бюрократией Android, чтобы НЕ поддерживать SMS и телефонные звонки.
Джош

52

Довольно поздно для ответа, но если у вас есть, TextViewчто вы показываете номер телефона, то вам вообще не нужно иметь дело с намерениями, вы можете просто использовать атрибут XML, android:autoLink="phone"и ОС автоматически инициирует ACTION_DIALIntent.


Очень быстрый подход!
Taslim Oseni

7

Ладно, будет очень поздно, чтобы ответить на этот вопрос. Но вот только один пример, если вы хотите сделать это в Kotlin .

val intent = Intent(Intent.ACTION_DIAL)
intent.data = Uri.parse("tel:<number>")
startActivity(intent)

Думаю, это может кому-то помочь.


2

Как упоминалось выше @ashishduh, использование android:autoLink="phoneтакже является хорошим решением. Но эта опция имеет один недостаток, она не работает со всеми номерами телефонов. Например, телефонный номер из 11 номеров не будет работать с этой опцией. Решение состоит в том, чтобы префикс ваших телефонных номеров с кодом страны.

Пример:

08034448845 не будет работать

но +2348034448845будет


1
<TextView
 android:id="@+id/phoneNumber"
 android:autoLink="phone"
 android:linksClickable="true"
 android:text="+91 22 2222 2222"
 />

Вот как вы можете открыть номер назначенного ярлыка EditText на номеронабирателе напрямую.


1

Добавить разрешение в манифесте:

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

Сделать кнопку или любой пример виджета: btnCall

btnCall.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        Intent callIntent = new Intent(Intent.ACTION_DIAL);
        callIntent.setData(Uri.parse("tel: +98990*******");
        startActivity(callIntent);

    }
});

этот ответ правильный, но этот ответ не совпадает с вопросом.
Луна
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.