web-dev-qa-db-fra.com

Android M onRequestPermissionsResult in non-Activity

J'ai une application qui doit trouver l'utilisateur emplacement, et l'emplacement est récupéré dans différentes classes, j'ai donc écrit une classe distincte (pas une classe d'activité) qui récupère l'emplacement de l'utilisateur en utilisant emplacement services, cela fonctionne bien sous Android M mais nécessite des autorisations d'exécution dans Android M, je veux vérifier les autorisations dans ma classe de localisation et je sais comment les vérifier mais je ne peux pas utiliser la méthode onRequestPermissionsResult dans ma classe Location, car ma classe Location ne s'étend à aucune activité.

Alors, que dois-je faire pour y parvenir? toute aide/indice est apprécié Merci d'avance

20
MD Husnain Tahir

Puisque public void onRequestPermissionsResult (int requestCode, String permissions [], int [] grantResults) est une méthode abstraite de Interface ActivityCompat.OnRequestPermissionsResultCallback . Voir la documentation

Implémentez simplement cette interface dans la classe requise et c'est fait. Par exemple

class location implements  ActivityCompat.OnRequestPermissionsResultCallback{ }

Maintenant, remplacez simplement onRequestPermissionsResult ()

 @Override
public void onRequestPermissionsResult(int requestCode,
                                       String permissions[], int[] grantResults) {
    switch (requestCode) {
     // case Statements
    }
}
16
AkshayK

Vous êtes invités à appeler checkSelfPermission() à partir d'une classe non UI, car cela n'a besoin que de Context.

Cependant, vous devez appeler requestPermissions() sur une activité ou un fragment. Vous remplacez onRequestPermissionsResult() sur cette activité identique ou fragment. Ce n'est pas différent que d'appeler startActivityForResult() et d'implémenter onActivityResult().

L'idée est que vous demandez la permission avant de faire quoi que ce soit qui implique vos classes non-UI qui traitent avec des emplacements.

7
CommonsWare

1- créer une activité transparente

<activity Android:name=".activity.activity.CheckStoragePermissionsActivity" Android:theme="@style/Theme.Transparent">

<style name="Theme.Transparent" parent="Theme.AppCompat">
        <item name="Android:windowIsTranslucent">true</item>
        <item name="Android:windowBackground">@Android:color/transparent</item>
        <item name="Android:windowContentOverlay">@null</item>
        <item name="Android:windowNoTitle">true</item>
        <item name="Android:windowIsFloating">true</item>
        <item name="Android:backgroundDimEnabled">false</item>
    </style>

2- Personnalisez votre activité

public class CheckStoragePermissionsActivity extends AppCompatActivity {

    private String[] permissions;
    private int pCode = 12321;
    public static PermissionListener permissionListener;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        checkPermissions();
    }

    private void checkPermissions() {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {

            permissions = new String[]{Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE};

            boolean flag = false;
            for (String s : permissions)
                if (checkSelfPermission(s) != PackageManager.PERMISSION_GRANTED)
                    flag = true;

            if (flag) {
                requestPermissions(permissions, pCode);
            } else {
                permissionListener.permissionResult(true);
                finish();
            }
        }else
            finish();
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
        if (requestCode == pCode) {
            boolean flag = true;
            if (Android.os.Build.VERSION.SDK_INT >= Android.os.Build.VERSION_CODES.M)
                for (int i = 0, len = permissions.length; i < len; i++)
                    if (grantResults[i] != PackageManager.PERMISSION_GRANTED)
                        flag = false;
            if (flag) {
                if (permissionListener != null)
                    permissionListener.permissionResult(true);
            } else if (permissionListener != null)
                permissionListener.permissionResult(false);
            finish();
        }
    }
}

3- permissionListener est une interface statique et peut être définie directement avant context.startActivity (...), ou utilisez votre plan pour trouver le résultat de l'autorisation.

public interface PermissionListener extends Serializable {
    void permissionResult(boolean hasPermission);
}

4- enfin appeler context.startActivity(new Intent(context, CheckStoragePermissionsActivity.class));

CheckStoragePermissionsActivity fait tout ce qui est nécessaire et se termine après l'action de l'utilisateur Autoriser ou Refuser.

4
Misagh

Vous ne pouvez pas le remplacer. Cette méthode n'est disponible que pour l'activité et les fragments. Mais vous pouvez créer une méthode statique à l'intérieur de votre classe Location et l'appeler à partir de la méthode onRequestPermissionResult substituée de votre activité/fragment.

J'ai créé une implémentation personnalisée pour Location combinée à une autorisation. Vous pouvez également utiliser une bibliothèque appelée Let for permissions.

4
Embydextrous

vous pouvez probablement créer une classe qui étend l'activité (AppCompactActivity est mieux), implémenter tout le code de localisation nécessaire et étend avec cette classe toutes les activités où vous devez l'utiliser.

0
user3132789