web-dev-qa-db-fra.com

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

J'utilise le code suivant pour passer un appel dans Android mais il me donne une exception de sécurité, merci de m'aider.

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

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.

70
UMAR

Vous pouvez utiliser Intent.ACTION_DIAL au lieu de Intent.ACTION_CALL. Ceci affiche le numéroteur avec le numéro déjà entré, mais permet à l'utilisateur de décider s'il souhaite réellement lancer l'appel ou non. ACTION_DIAL ne nécessite pas l'autorisation CALL_PHONE.

362
Ridcully

Cette démo vous sera utile ...

Sur appel, cliquez sur le bouton:

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

Permission dans le manifeste:

 <uses-permission Android:name="Android.permission.CALL_PHONE" />
215
Denny Sharma

Option plus élégante:

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

Utilisez l'action ACTION_DIAL dans votre intention, de cette manière, vous n'aurez besoin d'aucune permission. Si vous avez besoin de l'autorisation avec ACTION_CALL, vous devez 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);
61
wheeliez

NOTE IMPORTANTE:

Si vous utilisez Intent.ACTION_CALL, vous devez ajouter l'autorisation CALL_PHONE.

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

DANS VOTRE ACTIVITE:

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

Par conséquent, s'il ne s'agit pas d'une fonctionnalité essentielle de votre application, évitez d'ajouter la permission CALL_PHONE.

AUTRE SOLUTION:

Pour afficher l'application Téléphone avec le numéro inscrit à l'écran, 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 requise pour cela.

25
MBH

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

utiliser 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);     
16
Osama Ibrahim

Demande de permission 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();
}
11
Abhay Anand

Permissions:

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

Intention:

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

Permission 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();
    }
}
6
Atif Mahmood

Pour effectuer une activité d’appel en utilisant les intentions, vous devez demander les autorisations appropriées.

Pour cela, vous incluez des autorisations dans le fichier AndroidManifest.xml.

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

Ensuite, incluez 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();
}
5
Codemaker

Vous pouvez aussi utiliser ceci:

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

Pour éviter cela, vous pouvez utiliser l'interface graphique pour saisir des autorisations. Eclipse prend soin de l'endroit où insérer l'étiquette de permission et le plus souvent alors not est correct

3
SaKet
    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
Deepak Singh

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

  1. Allez dans les projets AndroidManifest.xml
  2. Cliquez sur l'onglet Autorisations
  3. Cliquez sur Ajouter
  4. Sélectionner les autorisations d'utilisation
  5. Voir l'instantané ci-dessousenter image description here

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

1
MindBrain
_11-25 14:47:01.681: ERROR/AndroidRuntime(302): blah blah...requires Android.permission.CALL_PHONE
_

^ La réponse se trouve dans la sortie d'exception "requires Android.permission.CALL_PHONE" :)

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")));
                }
1
Mohsinali

Pour un appel du composeur (aucune autorisation requise):

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

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

Permission:

<uses-permission Android:name="Android.permission.CALL_PHONE"></uses-permission>
0
Shohan Ahmed Sijan