web-dev-qa-db-fra.com

Action d'appel d'intention ne fonctionne pas sur Guimauve

J'essaie de lancer une action d'intention d'appel sur un périphérique dont le système d'exploitation est Marshmallow, en procédant comme d'habitude (cela fonctionne sur les versions ci-dessous):

Ajouter une permission:

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

Ouvrez l'intention:

Intent intent = new Intent(Intent.ACTION_CALL);
                    intent.setData(Uri.parse("tel:" + getString(R.string.connect_phone)));
                    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                    startActivity(intent);

Voici le journal que je reçois:

EXCEPTION FATALE: principale

Processus: com.app.calling, PID: 4250 Java.lang.SecurityException: refus d'autorisations: intention de départ { act = Android.intent.action.CALL date = tel: xxxxxxxxxxxxxx flg = 0x10000000 cmp = com.Android.server.telecom/.components.UserCallActivity VirtualScreenParam = Params {mDisplayId = -1, null, mFlags = 0x00000000)}} from ProcessRecord {1618b01 4250: com.app.calling/u0a234} (pid = 4250, uid = 10234) avec l'autorisation révoquée Android.permission.CALL_PHONE sur Android.os.Parcel.readException (Parcel.Java:1620) sur Android.os.Parcel.readException (Parcel.Java:1573) à Android.app.ActivityManagerProxy.startActivity (ActivityManagerNative.Java:3130) à Android.app.Instrumentation.execStartActivity (Instrumentation.Java:1540) sur Android.app.Activity.startActivityForResult (Activity.Java:4283) sur Android.app.Activity.startActivityForResult (Activity.Java:4230) à Android.support.v4.app.FragmentActivity.startActivityFromFragment (FragmentActivity.Java:849) à Android.support.v4.app.FragmentActivity $ HostCallbacks.onStartActivityFromFragment (FragmentActivity.Java:907) sur Android.support.v4.app.Fragment.startActivity (Fragment.Java:919) à com.app.calling.activity.fragment.ConnectFragment $ 2.onGroupClick (ConnectFragment.Java:44) à Android.widget.ExpandableListView.handleItemClick (ExpandableListView.Java:676) à Android.widget.ExpandableListView.performItemClick (ExpandableListView.Java:654) sur Android.widget.AbsListView $ PerformClick.run (AbsListView.Java:3821) sur Android.widget.AbsListView $ 3.exécutez (AbsListView.Java:5841) sur Android.os.Handler.handleCallback (Handler.Java:739) sur Android.os.Handler.dispatchMessage (Handler.Java:95) sur Android.os.Looper.loop (Looper.Java:158) sur Android.app.ActivityThread.main (ActivityThread.Java:7224) à Java.lang.reflect.Method.invoke (Méthode native) à com.Android.internal.os.ZygoteInit $ MethodAndArgsCaller.run (ZygoteInit.Java:1230) sur com.Android.internal.os.ZygoteInit.main (ZygoteInit.Java:1120)

Encore une fois, ce processus fonctionne bien dans la version précédente (Lollipop et KitKat) n’est malheureusement pas sur Marshmallow, quelqu'un sait-il pourquoi ou ce qui me manque?

8

Depuis Android 6.0 (API 23), les autorisations dangereuses doivent être déclarées dans les manifestes ET. Vous devez explicitement demander cette autorisation à l'utilisateur. Selon this list, CALL_PHONE est considéré comme une autorisation dangereuse.

Chaque fois que vous effectuez une opération nécessitant une autorisation dangereuse, vous devez vérifier si cette autorisation a été accordée par l'utilisateur. Si ce n'est pas le cas, vous devez en demander l'autorisation. Voir Demander des autorisations au moment de l'exécution sur les développeurs Android.

5
KevinOrr

Méthode pour faire un appel

public void onCall() {
        int permissionCheck = ContextCompat.checkSelfPermission(this, Manifest.permission.CALL_PHONE);

        if (permissionCheck != PackageManager.PERMISSION_GRANTED) {
            ActivityCompat.requestPermissions(
                    this,
                    new String[]{Manifest.permission.CALL_PHONE},
                    "123");
        } else {
            startActivity(new Intent(Intent.ACTION_CALL).setData(Uri.parse("tel:12345678901")));
        }
    }

Vérifier la permission

@Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        switch (requestCode) {

            case 123:
                if ((grantResults.length > 0) && (grantResults[0] == PackageManager.PERMISSION_GRANTED)) {
                    onCall();
                } else {
                    Log.d("TAG", "Call Permission Not Granted");
                }
                break;

            default:
                break;
        }
    }
16

À partir de la version Marshmallow, vous devez demander l'autorisation au moment de l'exécution, pas seulement dans le fichier manifeste Voici la documentation:

Demander des autorisations au moment de l'exécution

J'espère que ça aide.

1
Etienne GT