Come effettuare una telefonata usando l'intento in Android?


329

Sto usando il seguente codice per effettuare una chiamata in Android ma mi sta dando un'eccezione di sicurezza, per favore aiutatemi.

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

permessi

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

Eccezione

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)

Risposte:


383

Puoi usare Intent.ACTION_DIALinvece di Intent.ACTION_CALL. Questo mostra il dialer con il numero già inserito, ma consente all'utente di decidere se effettuare effettivamente la chiamata o meno. ACTION_DIALnon richiede l' CALL_PHONEautorizzazione.


ACTION_DIAL non richiede l'autorizzazione, questa è una differenza importante rispetto all'intento ACTION_CALL :)
maxwellnewage

237

Questa demo ti sarà utile ...

Fare clic sul pulsante di chiamata:

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

Autorizzazione in Manifest:

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

1
+1 per "tel:". Ho chiamato invece e non ho avuto alcuna eccezione intenzionale. Tnx
Tina,

Questo semplicemente non funziona nel mio Nexus 4. Apre il dialer che mostra il numero di telefono ma non avvia la chiamata senza l'interazione dell'utente. Qualche suggerimento?
MatheusJardimB,

5
Qual è la differenza tra il codice nella domanda e in questa risposta? Come risolve il problema?
Gavriel

Questo apre skype per me.
RJB

Aggiungi anche l'autorizzazione per l'
autonomia di

180

Opzione più elegante:

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

5
Funziona senza aggiungere nulla a Manifest come la risposta precedente
Pavlos,

4
Nessuna autorizzazione di runtime richiesta. +1
kike,

82

Usa l'azione ACTION_DIAL nel tuo intento, in questo modo non avrai bisogno di alcuna autorizzazione. Il motivo per cui è necessaria l'autorizzazione con ACTION_CALL è effettuare una telefonata senza alcuna azione da parte dell'utente.

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

2
Questo è meglio nel caso in cui non è necessario chiedere il permesso.
zackygaurav,

1
C'è un punto e virgola mancante nella seconda riga del codice. risposta perfetta!
ahmed_khan_89,

73

Va tutto bene.

ho appena inserito il tag delle autorizzazioni di chiamata prima del tag dell'applicazione nel file manifest

e ora tutto funziona bene.


2
Vedi la mia risposta qui sotto su come ottenere quasi lo stesso senza la necessità di un'autorizzazione e con la possibilità che l'utente non effettui effettivamente la chiamata.
Ridcully,

3
Inoltre, essere a conoscenza di dispositivi di telefonia-less: stackoverflow.com/a/9300036/693752
Snicolas

ulteriori informazioni come suggerito da Snicolas londatiga.net/it/programming/android/…
Lorensius WL T

31

NOTA IMPORTANTE:

Se si utilizza Intent.ACTION_CALLè necessario aggiungere l' CALL_PHONEautorizzazione.

È solo se non vuoi che la tua app venga visualizzata in Google Play per tablet che non accettano la carta SIM o non hanno il GSM.

NELLA TUA ATTIVITÀ:

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

MANIFESTO:

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

Quindi, se non è una funzionalità fondamentale per la tua app, cerca di evitare di aggiungere CALL_PHONEautorizzazioni.

ALTRE SOLUZIONI:

Mostra l'app del telefono con il numero scritto sullo schermo, quindi l'utente dovrà solo fare clic sul pulsante di chiamata:

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

Nessun permesso necessario per questo.


24

Solo il semplice oneliner senza ulteriori autorizzazioni necessarie:

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

18

usa questo codice completo

          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
Questa tecnica ha funzionato per me, anche se ho dovuto modificare Intent.ACTION_DIAL in Intent.Anction_CALL.
Naeem A. Malik,

12

Richiedi l'autorizzazione in manifest

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

Per chiamare utilizzare questo codice

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
Penso che non hai bisogno dell'autorizzazione poiché la tua app non si chiama da sola, ma chiede all'app dedicata (che ha l'autorizzazione) di farlo.
Mostrapotski,

9

Autorizzazione in AndroidManifest.xml

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

Codice completo:

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

permessi:

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

Intent:

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

6

Puoi usare anche questo:

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

5

Per effettuare un'attività di chiamata utilizzando gli intenti, è necessario richiedere le autorizzazioni appropriate.

Per questo includi usa le autorizzazioni nel file AndroidManifest.xml.

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

Quindi includere il seguente codice nella propria attività

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

Per chiamate dal dialer (nessuna autorizzazione necessaria):

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

Per chiamate dirette dall'app (è necessaria l'autorizzazione):

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

Autorizzazione:

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

3

Per evitare ciò, è possibile utilizzare la GUI per immettere le autorizzazioni. Eclipse si occupa di dove inserire il tag di autorizzazione e più spesso non è corretto


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

In Android per alcune funzionalità è necessario aggiungere l'autorizzazione al file manifest.

  1. Vai al progetto AndroidManifest.xml
  2. Fai clic sulla scheda Autorizzazioni
  3. Clicca su Aggiungi
  4. Seleziona Usa autorizzazione
  5. Vedi l'istantanea di seguitoinserisci qui la descrizione dell'immagine

6. Salvare il file manifest e quindi eseguire il progetto. Il tuo progetto ora dovrebbe funzionare come previsto.


1
Quale IDE stai usando?
SHA2NK,

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

^ La risposta sta nell'output dell'eccezione " 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")));
                }
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.