Firemonkey android read_phone_state autorisation d'exécution demande d'obtenir IMEI - android, delphi, permissions, firemonkey, delphi-10.2-tokyo

Comment puis-je obtenir l'autorisation read_phone_state à l'exécution pour obtenir le numéro IMEI?

  if not HasPermission("android.permission.READ_PHONE_STATE") then
begin

//ASK AND GET PERMISSION ?

end;


function TForm1.HasPermission(const Permission: string): Boolean;
begin
//Permissions listed at http://d.android.com/reference/android/Manifest.permission.html
{$IF RTLVersion >= 30}
Result := TAndroidHelper.Context.checkCallingOrSelfPermission(
{$ELSE}
Result := SharedActivityContext.checkCallingOrSelfPermission(
{$ENDIF}
StringToJString(Permission)) =
TJPackageManager.JavaClass.PERMISSION_GRANTED;


end;

Réponses:

3 pour la réponse № 1

MODIFIER:Désolé, je n'ai pas fait un peu plus de devoirs sur FireMonkey, c'est ce que j'ai pour avoir ma tête dans des sujets où ça n'appartient pas. J'ai ajouté ce contenu pour essayer de rendre ma réponse plus digne de la générosité.

Si vous pouvez restreindre la targetSdk sur l'application manifeste à 22 (5.1 Lollipop) alors l'utilisateur devra accorder l'autorisation sur l'installation afin HasPermission ne devrait jamais retourner faux. (Je ne sais pas comment cela fonctionne avec FireMonkey).

Si vous souhaitez utiliser les fonctionnalités d'autorisations dynamiques dans Marshmallow +, voici quelques informations que j'ai glanées cette page:

Vous devez avoir accès à Activity méthode de rappel onRequestPermissionsResult. Voici tous les obstacles que vous devrez traverser:

  • Utilisez l'outil open-source Dex2Jar convertir l'Android classes.dex fichier de Delphi à Java afin que vous puissiez compiler contre le FMXNativeActivity classe.
  • Coder une sous-classe de FMXNativeActivity en Java qui définit un native méthode (appelons-le onRequestPermissionsResultNative et remplace également le onRequestPermissionsResult méthode d'appel à la méthode native.
  • courir javac obtenir un fichier .class avec votre sous-classe
  • courir jar mettre le fichier .class dans un fichier .jar
  • courir dx.bat transformer votre fichier .jar en un fichier .dex Android
  • courir DexMerger fusionner votre fichier .dex dans le fichier classes.dex de Delphi
  • Maintenant tout ce qu'il reste à faire est d'écrire du code Delphi pour définir votre onRequestPermissionsResultNative méthode et l'enregistrer avec l'environnement JNI. Oh, et n'oubliez pas de passer au bon thread dans votre méthode native.

Le lien que j'ai référencé montre comment faire cela avec onActivityResult. Vous devrez adapter ces étapes pour l'autre méthode.

Et je n'ai même pas parlé de la façon de gérer l'OS qui met votre application en pause pour demander la permission à l'utilisateur et la reprendre après.

Que ce soit une leçon pour tous: ne mettez pas votre confiance dans les outils multiplateformes, vous serez déçu.


Je travaille en Java et non en Delphi, donc vous devrez extrapoler un peu ici.

Comme vous, je dois obtenir le numéro IMEI, et leLa boîte de dialogue système demande à l'utilisateur quelque chose comme: "Autoriser l'application à créer et gérer des appels téléphoniques?" J'ai besoin d'expliquer à l'utilisateur que cette application obtient juste l'ID de l'appareil et ne va pas faire ou gérer les appels téléphoniques.

  • Vérifiez si vous avez la permission
  • Si vous n'avez pas la permission, vérifiez si vous devriez afficher une explication
  • Si vous n'avez pas besoin d'explication, lancez l'opération de demande d'autorisation

Je devrais mentionner que shouldShowRequestPermissionRationale et requestPermissions sont des méthodes sur le Activity classe.

    private static final int READ_PHONE_STATE_PERMISSIONS_REQUEST = 2;

private boolean mHasReadRationale;

void doPermissionsStuff() {
// version checking code omitted, this block runs for marshmallow and later
if (checkSelfPermission(Manifest.permission.READ_PHONE_STATE) == PackageManager.PERMISSION_GRANTED) {
// do the operation that needs the permission here
} else {
// the flag indicates if the rationale dialog has already been displayed
if (! mHasReadRationale && shouldShowRequestPermissionRationale(Manifest.permission.READ_PHONE_STATE)) {
// pop a dialog that explains what"s going on to the user
} else {
requestPermissions(new String[] {Manifest.permission.READ_PHONE_STATE}, READ_PHONE_STATE_PERMISSIONS_REQUEST);
}
}
}

Dans le bouton positif de cette boîte de dialogue (c'est-à-dire que l'utilisateur veut continuer), réglez mHasReadRationale drapeau à vrai et appel doPermissionsStuff encore. (Pour Annuler, je renvoie l'utilisateur à l'écran précédent.)

Afin d'obtenir le résultat de la requestPermissions opération dont vous avez besoin pour remplacer le Activity"s onRequestPermissionsResult méthode:

private boolean mPermissionDenied;

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

switch (requestCode) {
case READ_PHONE_STATE_PERMISSIONS_REQUEST:
// I"m only checking for one permission, so I make assumptions here
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
// you can do the operation that needs the permission now
} else {
mPermissionDenied = true;  // set a flag for checking later
}
}
}

Apparemment, lorsque le système demande à l'utilisateurpermission, il arrête votre application, donc vous ne pouvez pas montrer une interface utilisateur à ce moment-là pour dire à l'utilisateur que vous n'avez pas la permission. Donc, je mets un drapeau et quand l'application reprend, puis Je dis à l'utilisateur que l'application n'a pas la permission de faire l'opération.

@Override
protected void onResumeFragments() {
super.onResumeFragments();
if (mPermissionDenied) {
// show dialog to the user that the app can"t do the operation because it doesn"t have permission
mPermissionDenied = false;
}
}

Alors voici un exemple de flux:

  • L'utilisateur veut un essai gratuit et l'application doit obtenir IMEI afin qu'ils ne puissent pas continuer à avoir l'essai gratuit encore et encore, jeez. doPermissionsStuff().
  • App appels checkSelfPermission() et détermine que la permission n'est pas encore accordée
  • App appels shouldShowRequestPermissionRationale(). Dans mon expérience, shouldShowRequestPermissionRationale() retourne seulement vrai après que l'utilisateur a refusé l'autorisation une fois. Donc, vous ne montrez pas encore l'interface utilisateur logique à l'utilisateur.
  • App appels requestPermissions()
  • Le système demandera à l'utilisateur "Autoriser l'application à effectuer et gérer les appels téléphoniques?"
  • L'utilisateur décide que WAAAAAAY est trop effrayant et appuie sur le bouton Non.
  • onRequestPermissionsResult() est appelé avec le résultat de refus et le mPermissionDenied se passe.
  • onResumeFragments() est appelé et une boîte de dialogue s'affiche pour l'utilisateur qu'il ne peut pas obtenir l'essai gratuit, car l'application n'a pas la permission.
  • L'utilisateur décide d'essayer à nouveau. doPermissionsStuff() est appelé.
  • App appels checkSelfPermission() et (encore une fois) détermine que la permission n'est pas encore accordée
  • App appels shouldShowRequestPermissionRationale(). Cette fois, il retourne vrai.
  • App affiche un message apaisant et apaisant àl'utilisateur que non, nous n'allons pas prendre en charge votre téléphone, nous voulons juste le monstre "numéro IMEI, c'est tout, et si vous n'autorisez pas l'application à accéder à l'IMEI, vous n'obtenez pas un essai gratuit, je dois tracer la ligne quelque part.
  • Les pressions de l'utilisateur continuent, le mHasReadRationale le drapeau est mis à vrai et doPermissionsStuff() méthode est appelée à nouveau.
  • App appels checkSelfPermission() et devine quoi? la permission n'est pas encore accordée
  • Puisque l'indicateur est défini, l'utilisateur ne reçoit pas l'interface utilisateur logique.
  • App appels requestPermissions()
  • Le système demandera à l'utilisateur "Autoriser l'application à effectuer et gérer les appels téléphoniques?"
  • L'utilisateur renonce à son destin et appuie sur Oui.
  • onRequestPermissionsResult() est appelé avec le résultat accordé et l'enregistrement d'essai gratuit avance.

Vous devriez également consulter l'exemple de code de Google à https://developer.android.com/samples/RuntimePermissions/index.html


questions connexes