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)

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.


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" />

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

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

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.


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


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.


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

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

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

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

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

6

Vous pouvez également l'utiliser:

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

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

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>

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


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

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.


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


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")));
                }
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.