Jak programowo nawiązać połączenie telefoniczne?

123

Przechodzę do czynności pod numer, pod który mam zadzwonić przez pakiet

a potem w takiej czynności mam przycisk żeby zadzwonić na ten numer, to jest kod:

callButton.setOnClickListener(new OnClickListener() {
            public void onClick(View v) {
                Intent intent = new Intent(Intent.ACTION_CALL, Uri.parse(bundle.getString("mobilePhone")));
            }
        }); 

Coś nie tak, bo jak wciskam guzik nic się nie dzieje ...

Co ja robię źle?

PD: Używam projektu kompatybilnego z Androidem 1.5 ... może rozmowa telefoniczna jest niekompatybilna z 1.5?

NullPointerException
źródło
pls wklej logcat o / p lub
opracuj

Odpowiedzi:

259

Zapomniałeś zadzwonić do startActivity. To powinno wyglądać tak:

Intent intent = new Intent(Intent.ACTION_CALL);

intent.setData(Uri.parse("tel:" + bundle.getString("mobilePhone")));
context.startActivity(intent);

Zamiar sam w sobie jest po prostu przedmiotem, który coś opisuje. To nic nie robi.

Nie zapomnij dodać odpowiedniego pozwolenia do swojego manifestu:

<uses-permission android:name="android.permission.CALL_PHONE" />
Lior
źródło
Cześć @Lior, jak mogę to zrobić w przypadku, gdy urządzenie ma podwójną kartę SIM. Czy można dzwonić przez określoną kartę SIM?
Dinash,
3
@Dinash: Spójrz na to już udzielone pytanie: stackoverflow.com/questions/13231962/call-from-second-sim
Lior
Użyłem tego samego kodu, ale nie działałem w Galaxy S7 edge. To jest mój kod Intent intentCall = new Intent (Intent.ACTION_CALL); String uri = "tel:" + number.trim (); intentCall.setData (Uri.parse (uri)); if (ActivityCompat.checkSelfPermission (getApplicationContext (), Manifest.permission.CALL_PHONE) == PackageManager.PERMISSION_GRANTED) {startActivity (intentCall); }
AngelJanniee,
Czy ten symulator może być używany do wykonywania połączeń bez fizycznego urządzenia
użytkownik3754136
24

Wypróbowałem to na moim telefonie i działa idealnie.

Intent intent = new Intent(Intent.ACTION_CALL);
intent.setData(Uri.parse("tel:900..." ));
startActivity(intent);

Dodaj to uprawnienie w pliku manifestu.

<uses-permission android:name="android.permission.CALL_PHONE" />
Anirudh
źródło
1
liczba to 1689,3,2,1,1. Dostaję problem, to będzie tylko 1689 .. Proszę o pomoc, jeśli masz jakieś rozwiązanie tego samego.
Teraiya Mayur
@TeraiyaMayur możesz najpierw usunąć wszelkie znaki nienumeryczne. Więc jeśli masz numer telefonu, tak jak String number = "1689,,3,2,1,1masznubmer = "tel:" + number.replaceAll("[^0-9]", "");
Spacer
@Walk, problemem jest to, że chcemy wywołać specjalne symbole, takie jak ,*. Muszą znajdować się wśród cyfr. Na emulatorze działa dobrze, ale na urządzeniu upuszcza dodatkowe symbole i cyfry.
CoolMind
13
 Intent callIntent = new Intent(Intent.ACTION_CALL, Uri.parse("tel:"+198+","+1+","+1)); 
             startActivity(callIntent);

dla wielu zamówionych połączeń

Służy do systemów wywołujących DTMF. Jeśli połączenie zostanie przerwane, powinieneś przekazywać więcej "," między numerami.

Dwivedi Ji
źródło
Dwivedi Ji: liczba to 1689, 3,2,1,1. Dostaję problem, to będzie tylko 1689 .. Proszę o pomoc, jeśli masz jakieś rozwiązanie tego samego.
Teraiya Mayur
@TeraiyaMayur, To zależy od systemu połączeń IVRS. Jego praca dla mnie ze względu na moje wezwanie wsparcie wygaszania podjąć wczesną reakcję.
Dwivedi Ji
Tak, masz rację, mam również prawidłowy numer IVR i działa dobrze. dzięki
Teraiya Mayur
7

W wybranej odpowiedzi nie ma sprawdzania uprawnień marshmallow. Nie będzie działać bezpośrednio w urządzeniu Marshmallow 6.0 lub nowszym.

Wiem, że jestem za późno, ale to pytanie ma duży głos, więc pomyślałem, że pomoże innym w przyszłości.

W urządzeniach marshmallow potrzebujemy pozwolenia na wykonanie połączenia ...

Oto przykład wykonania połączenia w piance lub wyższej.

Jak nawiązać połączenie w Android Marshmallow 6.0 lub nowszym

Vishal Chhodwani
źródło
2

Tutaj pokażę Ci, jak możesz wykonać telefon ze swojej działalności. Aby zadzwonić, musisz umieścić ten kod w swojej aplikacji.

try {
    Intent my_callIntent = new Intent(Intent.ACTION_CALL);
    my_callIntent.setData(Uri.parse("tel:"+phn_no));
    //here the word 'tel' is important for making a call...
    startActivity(my_callIntent);
} catch (ActivityNotFoundException e) {
    Toast.makeText(getApplicationContext(), "Error in your phone call"+e.getMessage(), Toast.LENGTH_LONG).show();
}
Pir Fahim Shah
źródło
1
@Astor Zdefiniowałem to bardzo jasno i już uzyskałem przez to punkty, co oznacza, że ​​moja odpowiedź jest dla niektórych lepsza od drugiej.
Pir Fahim Shah
2

To nie wymaga pozwolenia.

val intent = Intent(Intent.ACTION_DIAL, Uri.parse("tel:+123456"))
startActivity(intent)

Lub

val intent = Intent(Intent.ACTION_DIAL, Uri.fromParts("tel", "+123456", null))
startActivity(intent)

Ale pokazuje jeszcze jedno okno dialogowe (z pytaniem, czy chcesz zadzwonić na telefon tylko raz, czy zawsze). Więc lepiej byłoby używać ACTION_CALLz uprawnieniem (patrz Odwołane uprawnienie android.permission.CALL_PHONE ).

CoolMind
źródło
0
protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main); 
   final Button button = (Button) findViewById(R.id.btn_call);
    button.setOnClickListener(new View.OnClickListener() {
        public void onClick(View v) {
            String mobileNo = "123456789";
            String uri = "tel:" + mobileNo.trim();
            Intent intent = new Intent(Intent.ACTION_CALL);
            intent.setData(Uri.parse(uri));
            startActivity(intent);
        }
    });*
 }
Muhammad Usman Ghani
źródło
0

Jeśli ktoś szuka w Kotlinie

    val  uri = "tel:+800******"
    val call_customer_service = Intent(Intent.ACTION_CALL)
    call_customer_service.setData(Uri.parse(uri))
    startActivity(call_customer_service)

Podobnie jak niektóre inne rozwiązania wymaga android.permission.CALL_PHONEpozwolenia.

mughil
źródło