Firemonkey android read_phone_state povolenie na spustenie vyžaduje IMEI - android, delphi, povolenia, firemonkey, delphi-10.2-tokyo

Ako môžem získať povolenie read_phone_state počas spustenia na získanie čísla 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;

odpovede:

3 pre odpoveď č. 1

EDIT:Ospravedlňujem sa, že som neurobil trochu viac domácich úloh na FireMonkey. To je to, čo mi prináša, keď som si prilepil hlavu do tém, kde to nepatrí. Pridal som tento obsah, aby som sa pokúsil o to, aby moja odpoveď zaslúžila väčšiu odmenu.

Ak môžete obmedziť targetSdk v aplikácii manifest 22 (5.1 Lollipop), potom bude používateľ musieť udeliť povolenie na inštaláciu tak HasPermission nikdy by sa nemal vrátiť nepravdivý. (Nie ste si istí, ako to funguje s FireMonkey).

Ak chcete používať možnosti dynamických povolení v programe Marshmallow +, je tu niekoľko informácií, ktoré som získal od táto strana:

Musíte mať prístup k Activity metóda spätného volania onRequestPermissionsResult, Tu sú všetky obruče, ktoré budete musieť skákať:

  • Použite open-source nástroj Dex2Jar previesť Android classes.dex súbor z Delphi späť do Java, takže si môžete zostaviť proti FMXNativeActivity trieda.
  • Kód podtriedy FMXNativeActivity v jazyku Java, ktorý definuje a native metódu (nechajte ju volať onRequestPermissionsResultNative a tiež má prednosť onRequestPermissionsResult metódu pre volanie na natívnu metódu.
  • beh javac získať súbor .class s podtriedou
  • beh jar umiestniť súbor .class do súboru .jar
  • beh dx.bat aby sa váš .jar súbor zmenil na súbor .dex v systéme Android
  • beh DexMerger na zlúčenie vášho .dex súboru do súboru Delphi classes.dex
  • Teraz všetko, čo zostalo urobiť, je napísať nejaký chúlostivý kód Delphi, ktorý by definoval vaše onRequestPermissionsResultNative metódu a zaregistrujte ju v prostredí JNI. Oh, a nezabudnite prepnúť na správny závit v natívnej metóde.

Odkaz, na ktorý odkazujem, ukazuje, ako to urobiť onActivityResult, Musíte prispôsobiť tieto kroky pre druhú metódu.

A ani som nehovoril o tom, ako zaobchádzať s operačným systémom pozastaviacim vašu aplikáciu a požiadať o povolenie používateľa a pokračovať po ňom.

Nech je to lekcia pre všetkých: Neukladajte svoju vieru do nástrojov na platforme, budete sklamaní.


Pracujem v jazyku Java, nie Delphi, takže tu budete musieť trošku extrapolovať.

Rovnako ako vy, musím získať číslo IMEI asystémový dialóg sa používateľovi pýta niečo ako: "Povoliť aplikácii vytvárať a spravovať telefonické hovory?" Potrebujem vysvetliť používateľovi, že táto aplikácia dostáva iba ID zariadenia a nebude robiť ani spravovať telefonické hovory.

  • Skontrolujte, či máte povolenie
  • Ak nemáte povolenie, skontrolujte, či by ste mali zobraziť vysvetlenie
  • Ak nemusíte zobrazovať vysvetlenie, spustite operáciu žiadosti o povolenie

Mal by som to spomenúť shouldShowRequestPermissionRationale a requestPermissions sú metódy na Activity trieda.

    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);
}
}
}

V pozitívnom tlačidle tohto dialógového okna (t. J. Používateľ chce pokračovať) nastavte mHasReadRationale vlajka na pravdivé a zavolajte doPermissionsStuff znova. (Pre zrušenie posielam používateľa späť na predchádzajúcu obrazovku.)

Aby sa získal výsledok requestPermissions potrebujete prepísať Activity"s onRequestPermissionsResult metóda:

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

Zrejme keď systém požiada užívateľa opovolenie zastaví vašu aplikáciu, takže v tomto bode nemôžete zobraziť používateľské rozhranie, aby používateľovi povedal, že nemáte povolenie. Takže som nastavil vlajku a keď sa obnoví aplikácia, potom Povedal som používateľovi, že aplikácia nemá povolenie na vykonanie operácie.

@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;
}
}

Takže tu je príklad toku:

  • Používateľ chce bezplatnú skúšobnú verziu a aplikáciu potrebnú na získanie IMEI, takže nemôžu pokračovať v skúšobnej verzii znova a znova. doPermissionsStuff(),
  • Výzvy aplikácií checkSelfPermission() a určuje, že povolenie ešte nie je udelené
  • Výzvy aplikácií shouldShowRequestPermissionRationale(), Podľa mojich skúseností, shouldShowRequestPermissionRationale() iba vracia pravdivý po tom, čo používateľ raz odmietol povolenie. Takže zatiaľ nemáte používateľské rozhranie pre používateľov.
  • Výzvy aplikácií requestPermissions()
  • Systém požiada používateľa "Povoliť aplikácii vytvárať a spravovať telefonické hovory?"
  • Užívateľ sa rozhodne, že je WAAAAAAY príliš strašidelný a stlačí tlačidlo Nie.
  • onRequestPermissionsResult() sa volá s výsledkom popierania a mPermissionDenied sa nastaví.
  • onResumeFragments() dostanete volanie a zobrazí sa dialógové okno pre používateľa, že nemôže získať bezplatnú skúšobnú verziu, pretože aplikácia nemá povolenie.
  • Používateľ sa rozhodne skúsiť znova. doPermissionsStuff() sa nazýva.
  • Výzvy aplikácií checkSelfPermission() a (opäť) určuje, že povolenie ešte nie je udelené
  • Výzvy aplikácií shouldShowRequestPermissionRationale(), Tentoraz sa vráti pravda.
  • Aplikácia zobrazí upokojujúce a upokojujúce správypoužívateľovi, že nie, nechceme prevziať telefón, chceme len číslo IMEI, to je všetko a ak nechcete, aby aplikácia získala prístup k IMEI, nebudete mať bezplatná skúšobná verzia niekam,
  • Užívateľské tlačidlá pokračujú, takže mHasReadRationale flag je nastavený na true a doPermissionsStuff() metóda sa opäť zavolá.
  • Výzvy aplikácií checkSelfPermission() a hádaj čo? povolenie sa ešte neudelí
  • Keďže príznak je nastavený, používateľ nemá dostatočné užívateľské rozhranie.
  • Výzvy aplikácií requestPermissions()
  • Systém požiada používateľa "Povoliť aplikácii vytvárať a spravovať telefonické hovory?"
  • Užívateľ rezignuje na osud a stlačí Áno.
  • onRequestPermissionsResult() sa volá s udeleným výsledkom a bezplatná registrácia skúšok sa posunie dopredu.

Taktiež by ste si mali pozrieť vzorový kód spoločnosti Google na adrese https://developer.android.com/samples/RuntimePermissions/index.html


Súvisiace otázky
Ponuka