Bagaimana cara membuat panggilan telepon menggunakan niat di Android?


329

Saya menggunakan kode berikut untuk melakukan panggilan di Android tetapi memberi saya pengecualian keamanan tolong bantu.

 posted_by = "111-333-222-4";

 String uri = "tel:" + posted_by.trim() ;
 Intent intent = new Intent(Intent.ACTION_CALL);
 intent.setData(Uri.parse(uri));
 startActivity(intent);

izin

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

Pengecualian

11-25 14:47:01.661: ERROR/AndroidRuntime(302): Uncaught handler: thread main exiting due to uncaught exception
11-25 14:47:01.681: ERROR/AndroidRuntime(302): java.lang.SecurityException: Permission Denial: starting Intent { act=android.intent.action.CALL dat=tel:111-333-222-4 cmp=com.android.phone/.OutgoingCallBroadcaster } from ProcessRecord{43d32508 302:com.Finditnear/10026} (pid=302, uid=10026) requires android.permission.CALL_PHONE
11-25 14:47:01.681: ERROR/AndroidRuntime(302):     at android.os.Parcel.readException(Parcel.java:1218)
11-25 14:47:01.681: ERROR/AndroidRuntime(302):     at android.os.Parcel.readException(Parcel.java:1206)
11-25 14:47:01.681: ERROR/AndroidRuntime(302):     at android.app.ActivityManagerProxy.startActivity(ActivityManagerNative.java:1214)
11-25 14:47:01.681: ERROR/AndroidRuntime(302):     at android.app.Instrumentation.execStartActivity(Instrumentation.java:1373)
11-25 14:47:01.681: ERROR/AndroidRuntime(302):     at android.app.Activity.startActivityForResult(Activity.java:2749)
11-25 14:47:01.681: ERROR/AndroidRuntime(302):     at android.app.Activity.startActivity(Activity.java:2855)
11-25 14:47:01.681: ERROR/AndroidRuntime(302):     at com.Finditnear.PostDetail$2$1$1$1.onClick(PostDetail.java:604)
11-25 14:47:01.681: ERROR/AndroidRuntime(302):     at com.android.internal.app.AlertController$AlertParams$3.onItemClick(AlertController.java:884)
11-25 14:47:01.681: ERROR/AndroidRuntime(302):     at android.widget.AdapterView.performItemClick(AdapterView.java:284)
11-25 14:47:01.681: ERROR/AndroidRuntime(302):     at android.widget.ListView.performItemClick(ListView.java:3285)
11-25 14:47:01.681: ERROR/AndroidRuntime(302):     at android.widget.AbsListView$PerformClick.run(AbsListView.java:1640)

Jawaban:


383

Anda bisa menggunakan Intent.ACTION_DIALbukan Intent.ACTION_CALL. Ini menunjukkan dialer dengan nomor yang sudah dimasukkan, tetapi memungkinkan pengguna untuk memutuskan apakah benar-benar melakukan panggilan atau tidak. ACTION_DIALtidak memerlukan CALL_PHONEizin.


ACTION_DIAL tidak memerlukan izin, ini perbedaan penting dibandingkan dengan maksud ACTION_CALL :)
maxwellnewage

237

Demo ini akan membantu Anda ...

Klik tombol panggil:

Intent intent = new Intent(Intent.ACTION_CALL, Uri.parse("tel:" + "Your Phone_number"));
startActivity(intent);

Izin dalam Manifes:

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

1
+1 untuk "tel:". Saya malah menelepon dan tidak mendapat pengecualian maksud. Tnx
Tina

Ini sama sekali tidak berfungsi di nexus 4. Saya membuka dialer yang menunjukkan nomor telepon tetapi tidak memulai panggilan tanpa interaksi pengguna. Ada saran?
MatheusJardimB

5
Apa perbedaan antara kode dalam pertanyaan dan jawaban ini? Bagaimana cara mengatasi masalah?
Gavriel

Ini membuka skype untuk saya.
RJB

Silakan tambahkan Izin Panggilan Telepon Waktu Jalankan juga
Raghu Krishnan R

180

Opsi yang lebih elegan:

String phone = "+34666777888";
Intent intent = new Intent(Intent.ACTION_DIAL, Uri.fromParts("tel", phone, null));
startActivity(intent);

5
Ini berfungsi tanpa menambahkan apa pun pada Manifest seperti jawaban sebelumnya
Pavlos

4
Tidak diperlukan izin runtime. +1
kike

82

Gunakan tindakan ACTION_DIAL sesuai keinginan Anda, dengan cara ini Anda tidak perlu izin apa pun. Alasan Anda memerlukan izin dengan ACTION_CALL adalah untuk membuat panggilan telepon tanpa tindakan apa pun dari pengguna.

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

2
Ini lebih baik jika Anda tidak perlu meminta izin.
zackygaurav

1
Ada titik koma yang hilang di baris kedua kode. jawaban sempurna!
ahmed_khan_89

73

Semuanya baik-baik saja.

saya baru saja menempatkan tag izin panggilan sebelum tag aplikasi dalam file manifes

dan sekarang semuanya bekerja dengan baik.


2
Lihat jawaban saya di bawah ini tentang cara mencapai hampir sama tanpa perlu izin dan dengan kesempatan bagi pengguna untuk tidak benar-benar melakukan panggilan.
Ridcully

3
Perhatikan juga perangkat tanpa telepon: stackoverflow.com/a/9300036/693752
Snicolas

info lebih lanjut seperti yang disarankan oleh Snicolas londatiga.net/it/programming/android/…
Lorensius WL T

31

CATATAN PENTING:

Jika Anda menggunakan, Intent.ACTION_CALLAnda harus menambahkan CALL_PHONEizin.

Okey hanya jika Anda tidak ingin aplikasi Anda muncul di google play untuk tablet yang tidak mengambil kartu SIM atau tidak memiliki GSM.

DALAM AKTIVITAS ANDA:

            Intent callIntent = new Intent(Intent.ACTION_CALL);
            callIntent.setData(Uri.parse("tel:" + Constants.CALL_CENTER_NUMBER));
            startActivity(callIntent);

NYATA:

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

Jadi, jika ini bukan fitur penting untuk aplikasi Anda, cobalah untuk tidak menambahkan CALL_PHONEizin.

SOLUSI LAINNYA:

Adalah untuk menunjukkan aplikasi Telepon dengan nomor yang tertulis di layar, sehingga pengguna hanya perlu mengklik tombol panggil:

            Intent dialIntent = new Intent(Intent.ACTION_DIAL);
            dialIntent.setData(Uri.parse("tel:" + Constants.CALL_CENTER_NUMBER));
            startActivity(dialIntent);

Tidak diperlukan izin untuk ini.


24

Cukup oneliner sederhana tanpa izin tambahan yang diperlukan:

private void dialContactPhone(final String phoneNumber) {
    startActivity(new Intent(Intent.ACTION_DIAL, Uri.fromParts("tel", phoneNumber, null)));
}

18

gunakan kode lengkap ini

          Intent callIntent = new Intent(Intent.ACTION_DIAL);
          callIntent.setData(Uri.parse("tel:"+Uri.encode(PhoneNum.trim())));
          callIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
          startActivity(callIntent);     

1
Teknik ini berhasil bagi saya, meskipun saya harus mengubah Intent.ACTION_DIAL menjadi Intent.Anction_CALL.
Naeem A. Malik

12

Minta Izin dalam manifes

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

Untuk panggilan gunakan kode ini

Intent in = new Intent(Intent.ACTION_CALL, Uri.parse("tel:99xxxxxxxx"));
try {
    startActivity(in);
} catch (android.content.ActivityNotFoundException ex) {
    Toast.makeText(mcontext, "Could not find an activity to place the call.", Toast.LENGTH_SHORT).show();
}

3
Saya pikir Anda tidak memerlukan izin karena aplikasi Anda tidak memanggilnya sendiri, tetapi meminta aplikasi khusus (yang memiliki izin) untuk melakukannya.
Mostrapotski

9

Izin di AndroidManifest.xml

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

Kode lengkap:

private void onCallBtnClick(){
    if (Build.VERSION.SDK_INT < 23) {
        phoneCall();
    }else {

        if (ActivityCompat.checkSelfPermission(mActivity,
                Manifest.permission.CALL_PHONE) == PackageManager.PERMISSION_GRANTED) {

            phoneCall();
        }else {
            final String[] PERMISSIONS_STORAGE = {Manifest.permission.CALL_PHONE};
            //Asking request Permissions
            ActivityCompat.requestPermissions(mActivity, PERMISSIONS_STORAGE, 9);
        }
    }
}

@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
    boolean permissionGranted = false;
    switch(requestCode){
        case 9:
            permissionGranted = grantResults[0]== PackageManager.PERMISSION_GRANTED;
            break;
    }
    if(permissionGranted){
        phoneCall();
    }else {
        Toast.makeText(mActivity, "You don't assign permission.", Toast.LENGTH_SHORT).show();
    }
}

private void phoneCall(){
    if (ActivityCompat.checkSelfPermission(mActivity,
            Manifest.permission.CALL_PHONE) == PackageManager.PERMISSION_GRANTED) {
        Intent callIntent = new Intent(Intent.ACTION_CALL);
        callIntent.setData(Uri.parse("tel:12345678900"));
        mActivity.startActivity(callIntent);
    }else{
        Toast.makeText(mActivity, "You don't assign permission.", Toast.LENGTH_SHORT).show();
    }
}

8

Izin:

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

Maksud:

Intent callIntent = new Intent(Intent.ACTION_CALL);
callIntent.setData(Uri.parse("tel:0377778888"));
startActivity(callIntent);

6

Anda dapat menggunakan ini juga:

String uri = "tel:" + posted_by.replaceAll("[^0-9|\\+]", "");

5

Untuk melakukan aktivitas panggilan menggunakan maksud, Anda harus meminta izin yang tepat.

Untuk itu Anda sertakan menggunakan izin dalam file AndroidManifest.xml.

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

Kemudian sertakan kode berikut dalam aktivitas Anda

if (ActivityCompat.checkSelfPermission(mActivity,
        Manifest.permission.CALL_PHONE) == PackageManager.PERMISSION_GRANTED) {
    //Creating intents for making a call
    Intent callIntent = new Intent(Intent.ACTION_CALL);
    callIntent.setData(Uri.parse("tel:123456789"));
    mActivity.startActivity(callIntent);

}else{
    Toast.makeText(mActivity, "You don't assign permission.", Toast.LENGTH_SHORT).show();
}

4

Untuk panggilan dari dialer (Tidak diperlukan izin):

   fun callFromDailer(mContext: Context, number: String) {
        try {
            val callIntent = Intent(Intent.ACTION_DIAL)
            callIntent.data = Uri.parse("tel:$number")
            mContext.startActivity(callIntent)
        } catch (e: Exception) {
            e.printStackTrace()
            Toast.makeText(mContext, "No SIM Found", Toast.LENGTH_LONG).show()
        }
    }

Untuk panggilan langsung dari aplikasi (Diperlukan izin):

  fun callDirect(mContext: Context, number: String) {
        try {
            val callIntent = Intent(Intent.ACTION_CALL)
            callIntent.data = Uri.parse("tel:$number")
            mContext.startActivity(callIntent)
        } catch (e: SecurityException) {
            Toast.makeText(mContext, "Need call permission", Toast.LENGTH_LONG).show()
        } catch (e: Exception) {
            e.printStackTrace()
            Toast.makeText(mContext, "No SIM Found", Toast.LENGTH_LONG).show()
        }
    }

Izin:

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

3

Untuk menghindari ini - seseorang dapat menggunakan GUI untuk memasukkan izin. Eclipse mengurus di mana harus memasukkan tag izin dan lebih sering tidak benar


2
// Java
String mobileNumber = "99XXXXXXXX";
Intent intent = new Intent();
intent.setAction(Intent.ACTION_DIAL); // Action for what intent called for
intent.setData(Uri.parse("tel: " + mobileNumber)); // Data with intent respective action on intent
startActivity(intent);

// Kotlin
val mobileNumber = "99XXXXXXXX"
val intent = Intent()
intent.action = Intent.ACTION_DIAL // Action for what intent called for
intent.data = Uri.parse("tel: $mobileNumber") // Data with intent respective action on intent
startActivity(intent)

1

Di Android untuk fungsionalitas tertentu, Anda perlu menambahkan izin ke file Manifest.

  1. Buka Proyek AndroidManifest.xml
  2. Klik pada Tab Izin
  3. Klik Tambah
  4. Pilih Izin Penggunaan
  5. Lihat foto di bawahmasukkan deskripsi gambar di sini

6. Simpan file manifes dan kemudian jalankan proyek Anda. Proyek Anda sekarang harus berjalan seperti yang diharapkan.


1
IDE mana yang Anda gunakan?
SHA2NK

1
11-25 14:47:01.681: ERROR/AndroidRuntime(302): blah blah...requires android.permission.CALL_PHONE

^ Jawabannya terletak pada output pengecualian " requires android.permission.CALL_PHONE" :)


1
    final public void Call(View view){

    try {

        EditText editt=(EditText)findViewById(R.id.ed1);
        String str=editt.getText().toString();
        Intent intent = new Intent(Intent.ACTION_DIAL, Uri.parse("tel:"+str));
        startActivity(intent);
    }
    catch (android.content.ActivityNotFoundException e){

        Toast.makeText(getApplicationContext(),"App failed",Toast.LENGTH_LONG).show();
    }

1
 if(ContextCompat.checkSelfPermission(
        mContext,android.Manifest.permission.CALL_PHONE) != 
              PackageManager.PERMISSION_GRANTED) {
                    ActivityCompat.requestPermissions((Activity) mContext, new 
                  String[]{android.Manifest.permission.CALL_PHONE}, 0);
                } else {
                    startActivity(new Intent(Intent.ACTION_CALL, Uri.parse("tel:" + "Your Number")));
                }
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.