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
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
}
}
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.
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.
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.
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.