web-dev-qa-db-fra.com

Comment demander la permission de passer un appel téléphonique à partir de Android à partir de Android version Marshmallow en avant?

J'essaie de passer un appel téléphonique depuis Android, et j'ai également défini des autorisations d'exécution. Et il demande s'il faut autoriser les appels téléphoniques. Mais lorsque j'appuie sur Autoriser, l'application se bloque:

Voici comment je l'ai implémenté:

private static final int REQUEST_PHONE_CALL = 1;
Intent intent = new Intent(Intent.ACTION_CALL, Uri.parse("tel:" + "+918511812660"));

if (Android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
    if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.CALL_PHONE) != PackageManager.PERMISSION_GRANTED) {
        ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.CALL_PHONE},REQUEST_PHONE_CALL);
    }
    else
    {
        startActivity(intent);
    }
}
else
{
    startActivity(intent);
}


@Override
public void onRequestPermissionsResult(int requestCode,
                                       String permissions[], int[] grantResults) {
    switch (requestCode) {
        case REQUEST_PHONE_CALL: {
            if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                startActivity(intent);
            }
            else
            {

            }
            return;
        }
    }
}

Voici ce que j'obtiens dans logcat:

Java.lang.RuntimeException: Failure delivering result ResultInfo{who=@Android:requestPermissions:, 
     request=1, result=-1, data=Intent { act=Android.content.pm.action.REQUEST_PERMISSIONS (has extras) }} 
     to activity {com.devpost.airway/com.devpost.airway.activities.MainActivity}: 
     Java.lang.NullPointerException: Attempt to invoke virtual method 
     'Java.lang.String Android.content.Intent.toString()' on a null object reference

      at Android.app.ActivityThread.deliverResults(ActivityThread.Java:3733)
      at Android.app.ActivityThread.handleSendResult(ActivityThread.Java:3776)
      at Android.app.ActivityThread.-wrap16(ActivityThread.Java)
      at Android.app.ActivityThread$H.handleMessage(ActivityThread.Java:1412)
      at Android.os.Handler.dispatchMessage(Handler.Java:102)
      at Android.os.Looper.loop(Looper.Java:148)
      at Android.app.ActivityThread.main(ActivityThread.Java:5461)
      at Java.lang.reflect.Method.invoke(Native Method)
      at com.Android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.Java:726)
      at com.Android.internal.os.ZygoteInit.main(ZygoteInit.Java:616)

Caused by: Java.lang.NullPointerException: Attempt to invoke virtual method 
    'Java.lang.String Android.content.Intent.toString()' on a null object reference
      at Android.app.Instrumentation.execStartActivity(Instrumentation.Java:1485)
      at Android.app.Activity.startActivityForResult(Activity.Java:3930)
      at Android.support.v4.app.BaseFragmentActivityJB.startActivityForResult(BaseFragmentActivityJB.Java:48)
      at Android.support.v4.app.FragmentActivity.startActivityForResult(FragmentActivity.Java:75)
      at Android.app.Activity.startActivityForResult(Activity.Java:3890)
      at Android.support.v4.app.FragmentActivity.startActivityForResult(FragmentActivity.Java:856)
      at Android.app.Activity.startActivity(Activity.Java:4213)
      at Android.app.Activity.startActivity(Activity.Java:4181)
      at com.devpost.airway.activities.MainActivity.onRequestPermissionsResult(MainActivity.Java:140)
      at Android.app.Activity.dispatchRequestPermissionsResult(Activity.Java:6582)
      at Android.app.Activity.dispatchActivityResult(Activity.Java:6460)
      at Android.app.ActivityThread.deliverResults(ActivityThread.Java:3729)
      at Android.app.ActivityThread.handleSendResult(ActivityThread.Java:3776) 
      at Android.app.ActivityThread.-wrap16(ActivityThread.Java) 
      at Android.app.ActivityThread$H.handleMessage(ActivityThread.Java:1412) 
      at Android.os.Handler.dispatchMessage(Handler.Java:102) 
      at Android.os.Looper.loop(Looper.Java:148) 
      at Android.app.ActivityThread.main(ActivityThread.Java:5461) 
      at Java.lang.reflect.Method.invoke(Native Method) 
      at com.Android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.Java:726) 
      at com.Android.internal.os.ZygoteInit.main(ZygoteInit.Java:616) 

Quelle est la cause possible de cela?

12
OBX

La trace de la pile semble indiquer que votre flux d'autorisations fonctionne correctement, mais l'appel à startActivity depuis onRequestPermissionsResult() plante. Le Intent que vous passez à startActivity est-il correctement défini? Je ne vois pas qu'il soit défini dans cette partie du code.

Notez également que ContextCompat.checkSelfPermission gère la vérification de la version du SDK en votre nom, vous devriez donc pouvoir utiliser

if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.CALL_PHONE) != PackageManager.PERMISSION_GRANTED) {
    ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.CALL_PHONE},REQUEST_PHONE_CALL);
}
else
{
    startActivity(intent);
}

par lui-même, sans le code de vérification de version du SDK enveloppant.

23
Fabian Tamp

Je ferais mieux de suggérer d'utiliser ACTION_DIAL plutôt que ACTION_CALL lors de la construction de l'intention d'appeler un numéro particulier. En utilisant ACTION_DIAL, vous n'aurez besoin d'aucune autorisation d'appel dans votre application, car ACTION_DIAL ouvre le composeur avec le numéro déjà entré et permet en outre à l'utilisateur de décider s'il doit réellement passer l'appel ou modifier le numéro de téléphone avant d'appeler ou de ne pas appeler du tout.

Intent intent = new Intent(Intent.ACTION_DIAL, Uri.parse("tel:" + "Your Phone_number"));// Initiates the Intent 
startActivity(intent);
21
Abhishek Luthra

Vous devez créer votre Intent dans onRequestPermissionsResult


@Override
public void onRequestPermissionsResult(int requestCode,
                                       String permissions[], int[] grantResults) {
    switch (requestCode) {
        case REQUEST_PHONE_CALL: {
            if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                    Intent intent = new Intent(Intent.ACTION_CALL, Uri.parse("tel:" + "+918511812660"));
                startActivity(intent);
            }
            else
            {

            }
            return;
        }
    }
} 
5
Tin Tran

ajouter une nouvelle méthode

public static boolean hasPermissions(Context context, String... permissions) {
if (Android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && context != null && permissions != null) {
    for (String permission : permissions) {
        if (ActivityCompat.checkSelfPermission(context, permission) != PackageManager.PERMISSION_GRANTED) {
            return false;
        }
    }
}
return true;
}

ajouter ceci dans Global

int PERMISSION_ALL = 1; 
String[] PERMISSIONS = {Manifest.permission.READ_CONTACTS, Manifest.permission.CALL_PHONE};

et écrivez le code ci-dessous dans onCreate

if(!hasPermissions(this, PERMISSIONS)){
ActivityCompat.requestPermissions(this, PERMISSIONS, PERMISSION_ALL);
}
1
Ganesh Pokale

Remplacez votre onRequestPermissionsResult par ci-dessous, vous devez d'abord créer le intent puis l'appeler avec l'autorisation accordée. C'est là que vous vous trompez.

@Override
public void onRequestPermissionsResult(int requestCode,
                                       String permissions[], int[] grantResults) {
    switch (requestCode) {
        case REQUEST_PHONE_CALL : {
            // If request is cancelled, the result arrays are empty.
            if (grantResults.length > 0
                    && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                Intent intent = new Intent(Intent.ACTION_CALL, Uri.parse("tel:" + "+918511812660"));

                if (ActivityCompat.checkSelfPermission(this, Manifest.permission.CALL_PHONE) == PackageManager.PERMISSION_GRANTED) {
                    startActivity(intent);
                }
            }
        }
    }
}
0
himanshu1496