Android'de niyet kullanarak nasıl telefon görüşmesi yapılır?


329

Android'de arama yapmak için aşağıdaki kodu kullanıyorum, ancak bana güvenlik istisnası veriyor lütfen yardım edin.

 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);

izinler

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

İstisna

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)

Yanıtlar:


383

Bunun Intent.ACTION_DIALyerine kullanabilirsiniz Intent.ACTION_CALL. Bu numarayı girilmiş numarayı gösterir, ancak kullanıcının gerçekten arama yapıp yapmayacağına karar vermesine izin verir. izin ACTION_DIALgerektirmez CALL_PHONE.


ACTION_DIAL izin gerektirmez, bu ACTION_CALL amacı ile karşılaştırıldığında önemli bir farktır :)
maxwellnewage

237

Bu demo sizin için yararlı olacaktır ...

Çağrı düğmesine tıklandığında:

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

Bildiride İzin:

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

1
"Tel:" için +1. Onun yerine aradım ve herhangi bir niyetim yoktu. Tnx
Tina

Bu benim nexus 4'te çalışmıyor. Telefon numarasını gösteren çeviriciyi açar ancak kullanıcı etkileşimi olmadan aramayı başlatmaz. Herhangi bir öneriniz var mı?
MatheusJardimB

5
Sorudaki ve bu cevaptaki kod arasındaki fark nedir? Sorunu nasıl çözer?
Gavriel

Bu skype'ı benim için açar.
RJB

Lütfen Çağrı Telefonu Çalışma süresi İzni ekleyin
Raghu Krishnan R

180

Daha zarif seçenek:

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

5
Bu, Manifest'e önceki yanıt gibi bir şey eklemeden çalışır
Pavlos

4
Çalışma zamanı izni gerekmez. +1
kike

82

ACTION_DIAL eylemini niyetinizde kullanın, böylece izne ihtiyacınız olmayacak. ACTION_CALL ile izne ihtiyacınızın nedeni, kullanıcıdan herhangi bir işlem yapmadan telefon görüşmesi yapmaktır.

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

2
İzin istemeniz durumunda bu daha iyidir.
zackygaurav

1
Kodun ikinci satırında noktalı virgül var. mükemmel cevap!
ahmed_khan_89

73

Herşey yolunda.

ben sadece manifest dosyasında uygulama etiketi önce arama izinleri etiketi yerleştirdi

ve şimdi her şey yolunda gidiyor.


2
Bir izne ihtiyaç duymadan ve kullanıcının gerçekten arama yapmama şansı olmadan neredeyse aynı şeyi nasıl elde edeceğinizle ilgili aşağıdaki cevabımı görün.
Ocak'ta Ridcully

3
Ayrıca, telefonsuz cihazlara da dikkat edin: stackoverflow.com/a/9300036/693752
Snicolas

Snicolas tarafından önerilen diğer bilgiler londatiga.net/it/programming/android/…
Lorensius WL T

31

ÖNEMLİ NOT:

Kullanıyorsanız izin Intent.ACTION_CALLeklemelisiniz CALL_PHONE.

Sadece uygulamanızın SIM kart almayan veya GSM içermeyen tabletler için google play'de görünmesini istemiyorsanız okey.

FAALİYETİNİZDE:

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

BELİRGİN:

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

Uygulamanız için kritik bir özellik değilse, CALL_PHONEizin eklemekten uzak durmaya çalışın .

DİĞER ÇÖZÜM:

Ekranda yazılı numara ile Telefon uygulamasını göstermektir, bu nedenle kullanıcının sadece arama düğmesine tıklaması gerekir:

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

Bunun için izin gerekmez.


24

Herhangi bir ek izin gerekmeden sadece basit bir oneliner:

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

18

bu tam kodu kullan

          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
Intent.ACTION_DIAL değerini Intent.Anction_CALL olarak değiştirmek zorunda kalmama rağmen bu teknik benim için çalıştı.
Naeem A. Malik

12

Manifest'te İzin İste

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

Aramak için bu kodu kullanın

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
Uygulamanız kendisini çağırmıyor, ancak özel uygulamadan (izinli) bunu yapmasını istediğinden izne ihtiyacınız olmadığını düşünüyorum.
Mostrapotski

9

AndroidManifest.xml dosyasında izin

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

Tam kod:

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

İzinler:

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

niyet:

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

6

Bunu da kullanabilirsiniz:

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

5

Amaçları kullanarak bir arama etkinliği yapmak için uygun izinleri istemelisiniz.

Bunun için AndroidManifest.xml dosyasına izinleri kullanır.

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

Ardından etkinliğinize aşağıdaki kodu ekleyin

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

Numara çeviriciden arama yapmak için (İzin gerekmez):

   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()
        }
    }

Uygulamadan doğrudan arama için (İzin gerekli):

  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()
        }
    }

İzin:

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

3

Bundan kaçınmak için - izinleri girmek için GUI'yi kullanabilirsiniz. Eclipse izin etiketinin nereye ekleneceğine dikkat eder ve daha sık doğru olmaz


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

Android'de belirli işlevler için Manifest dosyasına izin eklemeniz gerekir.

  1. Projelere Git AndroidManifest.xml
  2. İzinler Sekmesine tıklayın
  3. Ekle'ye tıklayın
  4. Kullanım İznini Seçin
  5. Aşağıdaki fotoğrafa bakınresim açıklamasını buraya girin

Manifest dosyasını kaydedin ve ardından projenizi çalıştırın. Projenizin şimdi beklendiği gibi çalışması gerekiyor.


1
Hangi IDE'yi kullanıyorsunuz?
SHA2NK

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

^ Cevap istisna çıktı " 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")));
                }
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.