Jak mogę otworzyć dialer z wyświetlonym numerem telefonu?


193

Nie muszę dzwonić na numer telefonu, po prostu potrzebuję dialera, aby otworzyć numer telefonu już wyświetlony. Czego Intentpowinienem użyć, aby to osiągnąć?

Odpowiedzi:


532

Dwa sposoby na osiągnięcie tego.

1) Konieczność uruchomienia dialera za pomocą kodu, bez interakcji użytkownika.

Trzeba Action_Dial,

użyj poniższego kodu spowoduje otwarcie Dialera z określonym numerem

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

Prefiks „tel:” jest wymagany , w przeciwnym razie zostanie zgłoszony następujący wyjątek: java.lang.IllegalStateException: Nie można wykonać metody działania.

Action_Dial nie wymaga żadnego pozwolenia.

Jeśli chcesz zainicjować połączenie bezpośrednio bez interakcji użytkownika , możesz użyć akcji Intent.ACTION_CALL. W takim przypadku musisz dodać następujące uprawnienie w pliku AndroidManifest.xml:

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

2) Musisz kliknąć ciąg numeru telefonu i rozpocząć połączenie.

android:autoLink="phone" 

Musisz użyć TextView z poniższą właściwością.

android: autoLink = "phone" android: linksClickable = "true" właściwość textView

W ten sposób nie musisz używać zamiaru ani uzyskiwać pozwolenia.


9
To jest świetne i różni się od Intent.ACTION_CALL tym, że nie dzwoni natychmiast
— Amt87

Czy ACTION_DIAL wymaga pozwolenia, czy tylko ACCESS_CALL?
— Marc Plano-Lesay

1
Te prace z numerami telefonów, z Danii , jak również :) Ty nie trzeba dodać +45 przed numerem. Działa dobrze po prostu analizując numer telefonu
— ymerdrengene

1
Mam problem z przyciskiem Wstecz po otwarciu dialera w nowej intencji. Mogę wrócić do mojej aplikacji tylko po naciśnięciu 3 przycisków Wstecz (pokazuje mi kilka ekranów dialera, których nie otworzyłem - sam dialer, utwórz nowy ekran kontaktów, ulubione). Czy ktoś wie, jak wrócić do aplikacji za jednym naciśnięciem przycisku Wstecz?
— kashlo

2
2012 ... Stare dobre czasy. To politycznie poprawny rok 2018, duże firmy sprzedają dane użytkowników, a nasze aplikacje muszą radzić sobie z biurokracją Androida, aby NIE obsługiwać SMS-ów i połączeń telefonicznych.
— Josh

52

Dość późno na odpowiedź, ale jeśli masz TextViewnumer, na którym wyświetlasz numer telefonu, to wcale nie musisz zajmować się zamiarami, możesz po prostu użyć atrybutu XML, android:autoLink="phone"a system operacyjny automatycznie zainicjuje ACTION_DIALzamiar.


Bardzo szybkie podejście!
— Taslim Oseni

7

Ok, odpowiedź na to pytanie będzie wyjątkowo późna. Ale tutaj jest tylko jedna próbka, jeśli chcesz to zrobić w Kotlin .

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

Myślałem, że to może komuś pomóc.


2

Jak wspomniano powyżej w @ashishduh, używanie android:autoLink="phonejest również dobrym rozwiązaniem. Ale ta opcja ma jedną wadę, nie działa z wszystkimi długościami numerów telefonów. Na przykład numer 11 numerów nie będzie działał z tą opcją. Rozwiązaniem jest prefiksowanie numerów telefonów kodem kraju.

Przykład:

08034448845 nie zadziała

ale +2348034448845będzie


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

W ten sposób można bezpośrednio otworzyć numer przypisany do etykiety EditText na dialer.


1

Dodaj zezwolenie w manifeście:

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

Utwórz przycisk lub dowolny przykład widżetu: 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);

    }
});

ta odpowiedź jest poprawna, ale ta odpowiedź nie pasuje do pytania.
— księżyc
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.