firemonkeyアンドロイド、アンドロイド、デルファイ、許可、firemonkey、delphi-10.2-tokyoを取得するためのアンドロイドのread_phone_stateランタイムパーミッション

実行時にIMEI番号を取得するためにread_phone_state権限を取得するにはどうすればよいですか?

  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;

回答:

回答№1の場合は3

編集:申し訳ありませんが、私はFireMonkeyでもう少し宿題をしませんでした。これは私の頭を話題に固執させるためのものです。私はこの内容を追加して、私の答えを恩恵に値するものにしようとしました。

あなたが targetSdk 22(5.1 Lollipop)のアプリケーションマニフェストでは、ユーザーはインストールの許可を与える必要があります HasPermission falseを返すべきではありません。 (FireMonkeyでどのように動作するかはわかりません)。

Marshmallow +のダイナミックパーミッション機能を使用したい場合は、ここからいくつかの情報を収集します このページ

あなたはあなたにアクセスする必要があります Activity コールバックメソッド onRequestPermissionsResult。ここであなたは飛び抜けなければならないだろう。

  • オープンソースツールを使用するDex2JarはAndroidを変換する classes.dex DelphiからJavaに戻ってコンパイルすることができます FMXNativeActivity クラス。
  • コードのサブクラス FMXNativeActivity Javaを定義する native メソッド(それを呼び出す onRequestPermissionsResultNative また、 onRequestPermissionsResult メソッドを呼び出してネイティブメソッドに呼び出します。
  • 走る javac あなたのサブクラスで.classファイルを取得する
  • 走る jar .classファイルを.jarファイルに入れる
  • 走る dx.bat .jarファイルをAndroidの.dexファイルに変換する
  • 走る DexMerger .dexファイルをDelphiのclasses.dexファイルにマージする
  • 今すぐ残されているのは、あなたの定義するためのトリッキーなDelphiコードを書くことです onRequestPermissionsResultNative JNI環境に登録してください。ああ、ネイティブメソッドで正しいスレッドに切り替えるのを忘れないでください。

私が参照したリンクは、これを行う方法を示しています onActivityResult。これらのステップを他の方法に適応させる必要があります。

OSを処理してアプリケーションを一時停止させてユーザーに許可を求め、後でそれを再開する方法についても話はしなかった。

これをすべての教訓にしましょう:クロスプラットフォームのツールにあなたの信念を入れないでください、あなたは失望します。


私はDelphiではなくJavaで作業しますので、ここで少し推論する必要があります。

あなたと同じように、私はIMEI番号を取得しなければなりません。システムダイアログは、ユーザーに次のような質問をします。「アプリケーションが電話をかけて管理するのを許可しますか?」そのアプリがデバイスIDを取得しているだけで、電話をかけたり管理したりするわけではないことをユーザーに説明する必要があります

  • 許可を得ているかどうか確認してください
  • 許可を得ていない場合は、説明を表示する必要があるかどうかを確認してください
  • 説明を表示する必要がない場合は、許可要求操作を開始してください

私はそれを言及すべきです shouldShowRequestPermissionRationale そして requestPermissions の方法 Activity クラス。

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

このダイアログのポジティブボタン(つまり、ユーザーが続行したい)で、 mHasReadRationale 真にフラグを立てて電話する doPermissionsStuff 再び。 (キャンセルの場合は、前の画面に戻ります)

結果を得るためには、 requestPermissions 操作をオーバーライドする必要があります Activity"s onRequestPermissionsResult 方法:

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

明らかに、システムがユーザーにあなたのアプリを停止するので、その時点でUIを表示して、あなたに許可がないことをユーザーに伝えることはできません。だから私はフラグを設定し、アプリケーションが再開すると、 次に 私は、アプリケーションに操作を実行する権限がないことをユーザーに伝えます。

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

ここでは例の流れを示します:

  • ユーザーは無料トライアルを望んでおり、アプリはIMEIを取得する必要があるため、無料トライアルを何度も何度もやり続けることはできません。 doPermissionsStuff()
  • アプリコール checkSelfPermission() 許可がまだ与えられていないと判断する
  • アプリコール shouldShowRequestPermissionRationale()。私の経験では、 shouldShowRequestPermissionRationale() ユーザーが許可を一度拒否した後にのみtrueを返します。したがって、ユーザーに合理的なUIをまだ表示することはできません。
  • アプリコール requestPermissions()
  • システムは、ユーザーに「アプリケーションによる通話の作成と管理の許可」を求めます。
  • ユーザーはWAAAAAAYが怖すぎると判断し、[いいえ]ボタンを押します。
  • onRequestPermissionsResult() 拒否結果とともに呼び出されます。 mPermissionDenied 設定されます。
  • onResumeFragments() が呼び出され、アプリが許可を得ていないため無料の試用版を入手できないというダイアログがユーザに表示されます。
  • ユーザーはもう一度やり直すことにします。 doPermissionsStuff() が呼び出されます。
  • アプリコール checkSelfPermission() 許可がまだ付与されていないと判断した場合
  • アプリコール shouldShowRequestPermissionRationale()。今回は真を返します。
  • アプリは静かで落ち着いたメッセージを表示します私たちはあなたの携帯電話を引き継ぐつもりはない、私たちはちょうどあなたがIMEI番号を持っていることを望んでいます、それはすべてです、そしてあなたがIMEIにアクセスすることを許可しないならば、あなたは無料トライアル。私は線を描く必要があります どこかで
  • ユーザーの押しが続行されるので、 mHasReadRationale flagはtrueに設定され、 doPermissionsStuff() メソッドが再び呼び出されます。
  • アプリコール checkSelfPermission() そして - 何を推測する?許可はまだ与えられていない
  • フラグが設定されているため、ユーザーは根拠UIを取得しません。
  • アプリコール requestPermissions()
  • システムは、ユーザーに「アプリケーションによる通話の作成と管理の許可」を求めます。
  • ユーザーは自分自身を運命に戻し、はいを押す。
  • onRequestPermissionsResult() 許可された結果で呼び出され、無料試用登録が進められます。

また、Googleのサンプルコードも https://developer.android.com/samples/RuntimePermissions/index.html


関連する質問
メニュー
最も人気のある