Comment passer un appel téléphonique en utilisant l'intention dans Android?

329

J'utilise le code suivant pour passer un appel sur Android, mais cela me donne une exception de sécurité, aidez-moi.

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

autorisations

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

Exception

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
la source

Réponses:

383

Vous pouvez utiliser à la Intent.ACTION_DIALplace de Intent.ACTION_CALL. Cela montre le composeur avec le numéro déjà entré, mais permet à l'utilisateur de décider s'il doit réellement passer l'appel ou non. ACTION_DIALne nécessite pas l' CALL_PHONEautorisation.

Ridiculement
la source
ACTION_DIAL ne nécessite pas d'autorisation, c'est une différence importante par rapport à l'intention d'ACTION_CALL :)
maxwellnewage
237

Cette démo vous sera utile ...

Sur le bouton d'appel, cliquez sur:

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

Autorisation dans le manifeste:

 <uses-permission android:name="android.permission.CALL_PHONE" />
Denny Sharma
la source
1
+1 pour "tel:". J'ai plutôt appelé et je n'ai eu aucune exception d'intention. Tnx
Tina
Cela ne fonctionne tout simplement pas dans mon nexus 4. Il ouvre le numéroteur affichant le numéro de téléphone mais ne démarre pas l'appel sans interaction de l'utilisateur. Une suggestion?
MatheusJardimB
5
Quelle est la différence entre le code dans la question et dans cette réponse? Comment résout-il le problème?
Gavriel
Cela ouvre skype pour moi.
RJB
S'il vous plaît ajouter la permission de temps d'appel téléphonique aussi
Raghu Krishnan R
181

Option plus élégante:

String phone = "+34666777888";
Intent intent = new Intent(Intent.ACTION_DIAL, Uri.fromParts("tel", phone, null));
startActivity(intent);
cprcrack
la source
5
Cela fonctionne sans rien ajouter au Manifeste comme la réponse précédente
Pavlos
4
Aucune autorisation d'exécution requise. +1
kike
82

Utilisez l'action ACTION_DIAL dans votre intention, de cette façon, vous n'aurez besoin d'aucune autorisation. La raison pour laquelle vous avez besoin de l'autorisation avec ACTION_CALL est de passer un appel téléphonique sans aucune action de l'utilisateur.

Intent intent = new Intent(Intent.ACTION_DIAL);
intent.setData(Uri.parse("tel:0987654321"));
startActivity(intent);
Wheeliez
la source
2
C'est mieux dans le cas où vous n'avez pas besoin de demander la permission.
zackygaurav
1
Il y a un point-virgule manquant dans la deuxième ligne du code. réponse parfaite!
ahmed_khan_89
73

Tout va bien.

je viens de placer la balise des autorisations d'appel avant la balise d'application dans le fichier manifeste

et maintenant tout fonctionne bien.

UMAR
la source
2
Voir ma réponse ci-dessous sur la façon d'obtenir presque la même chose sans avoir besoin d'une autorisation et avec une chance pour l'utilisateur de ne pas réellement faire l'appel.
Ridcully
3
Faites également attention aux
plus d'informations comme suggéré par Snicolas londatiga.net/it/programming/android/…
Lorensius WL T
31

NOTE IMPORTANTE:

Si vous utilisez, Intent.ACTION_CALLvous devez ajouterCALL_PHONE autorisation.

Ce n'est correct que si vous ne voulez pas que votre application apparaisse dans Google Play pour les tablettes qui ne prennent pas de carte SIM ou qui n'ont pas de GSM.

DANS VOTRE ACTIVITÉ:

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

MANIFESTE:

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

Donc, si ce n'est pas une fonctionnalité critique pour votre application, essayez de ne pas ajouter d' CALL_PHONEautorisation.

AUTRE SOLUTION:

Est d'afficher l'application Téléphone avec le numéro écrit à l'écran, donc l'utilisateur n'aura qu'à cliquer sur le bouton d'appel:

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

Aucune autorisation nécessaire pour cela.

MBH
la source
24

Juste le simple oneliner sans aucune autorisation supplémentaire nécessaire:

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

utilisez ce code complet

          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
la source
1
Cette technique a fonctionné pour moi, même si j'ai dû changer Intent.ACTION_DIAL en Intent.Anction_CALL.
Naeem A. Malik
12

Demande d'autorisation dans le manifeste

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

Pour appeler, utilisez ce code

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
la source
3
Je pense que vous n'avez pas besoin de l'autorisation car votre application ne s'appelle pas elle-même, mais demande à l'application dédiée (qui a la permission) de le faire.
Mostrapotski
9

Autorisation dans AndroidManifest.xml

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

Code complet:

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
la source
8

Autorisations:

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

Intention:

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

la source
6

Vous pouvez également l'utiliser:

String uri = "tel:" + posted_by.replaceAll("[^0-9|\\+]", "");
Áron Pável
la source
5

Pour effectuer une activité d'appel à l'aide d'intentions, vous devez demander les autorisations appropriées.

Pour cela, vous incluez les autorisations d'utilisation dans le fichier AndroidManifest.xml.

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

Incluez ensuite le code suivant dans votre activité

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();
}
Codemaker
la source
4

Pour l'appel du composeur (aucune autorisation nécessaire):

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

Pour un appel direct depuis l'application (autorisation nécessaire):

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

Autorisation:

<uses-permission android:name="android.permission.CALL_PHONE"></uses-permission>
Shohan Ahmed Sijan
la source
3

Pour éviter cela - on peut utiliser l'interface graphique pour entrer des autorisations. Eclipse prend soin de l'endroit où insérer la balise d'autorisation et le plus souvent, ce n'est pas correct

SaKet
la source
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
la source
1

Dans Android, pour certaines fonctionnalités, vous devez ajouter l'autorisation au fichier Manifest.

  1. Accédez au Projets AndroidManifest.xml
  2. Cliquez sur l'onglet Permissions
  3. Cliquez sur Ajouter
  4. Sélectionner une autorisation d'utilisation
  5. Voir l'instantané ci-dessousentrez la description de l'image ici

6.Enregistrez le fichier manifeste, puis exécutez votre projet. Votre projet devrait maintenant s'exécuter comme prévu.

MindBrain
la source
1
Quel IDE utilisez-vous?
SHA2NK
1
11-25 14:47:01.681: ERROR/AndroidRuntime(302): blah blah...requires android.permission.CALL_PHONE

^ La réponse réside dans la sortie d'exception " requires android.permission.CALL_PHONE" :)

Charlie Scott-Skinner
la source
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
la source
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
la source