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)
UMAR
sumber

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.

Secara ridcully
sumber
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" />
Denny Sharma
sumber
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);
cprcrack
sumber
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);
wheeliez
sumber
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.

UMAR
sumber
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.

MBH
sumber
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)));
}
Artemiy
sumber
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);     
Osama Ibrahim
sumber
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();
}
Abhay Anand
sumber
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();
    }
}
Atif Mahmood
sumber
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);

sumber
6

Anda dapat menggunakan ini juga:

String uri = "tel:" + posted_by.replaceAll("[^0-9|\\+]", "");
Áron Pável
sumber
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();
}
Pembuat kode
sumber
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>
Shohan Ahmed Sijan
sumber
3

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

SaKet
sumber
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)
Sumit Jain
sumber
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.

MindBrain
sumber
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" :)

Charlie Scott-Skinner
sumber
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();
    }
Deepak Singh
sumber
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")));
                }
Mohsinali
sumber