Dej*_*jan 9 delphi permissions android firemonkey delphi-10.2-tokyo
如何在运行时获取read_phone_state权限以获取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;
Run Code Online (Sandbox Code Playgroud)
编辑:抱歉我没有在 FireMonkey 上做更多的功课。这就是我把注意力集中在不属于它的话题上所得到的结果。我添加此内容是为了使我的答案更值得赏金。
如果您可以将应用清单上的 限制targetSdk为 22 (5.1 Lollipop),那么用户将必须授予安装权限,因此HasPermission永远不应返回 false。(不知道 FireMonkey 是如何工作的)。
如果您想使用 Marshmallow+ 中的动态权限功能,以下是我从此页面收集的一些信息:
您需要有权访问Activity回调方法onRequestPermissionsResult。以下是您必须跨越的所有障碍:
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文件中onRequestPermissionsResultNative方法并将其注册到 JNI 环境。哦,不要忘记在本机方法中切换到正确的线程。我引用的链接显示了如何使用onActivityResult. 您必须针对其他方法调整这些步骤。
我什至没有讨论如何处理操作系统暂停您的应用程序以请求用户许可并在之后恢复它。
让这成为所有人的一个教训:不要相信跨平台工具;不要相信跨平台工具。你会失望的。
我使用 Java 而不是 Delphi,所以你必须在这里进行一些推断。
和你一样,我必须获取 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);
}
}
}
Run Code Online (Sandbox Code Playgroud)
在此对话框的肯定按钮中(即用户想要继续)将标志设置mHasReadRationale为 true 并调用doPermissionsStuff再次调用。(对于取消,我将用户带回到上一个屏幕。)
为了获得requestPermissions操作的结果,您需要重写 的Activity方法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
}
}
}
Run Code Online (Sandbox Code Playgroud)
显然,当系统请求用户许可时,它会停止您的应用程序,因此您此时无法显示 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;
}
}
Run Code Online (Sandbox Code Playgroud)
这是一个示例流程:
doPermissionsStuff().checkSelfPermission()并确定尚未授予权限shouldShowRequestPermissionRationale(). 在我的经验中,shouldShowRequestPermissionRationale()只有在用户拒绝一次权限后才返回 true。因此,您还没有向用户显示基本原理 UI。requestPermissions()onRequestPermissionsResult()被调用并返回拒绝结果并mPermissionDenied设置。onResumeFragments()被调用并向用户显示一个对话框,表明他们无法获得免费试用,因为该应用程序没有权限。doPermissionsStuff()叫做。checkSelfPermission()并(再次)确定尚未授予权限shouldShowRequestPermissionRationale(). 这次它返回true。mHasReadRationale标志设置为 true 并且doPermissionsStuff()再次调用方法。checkSelfPermission()- 你猜怎么着?尚未授予该权限requestPermissions()onRequestPermissionsResult()被调用并获得已授予的结果,免费试用注册将继续进行。您还应该查看 Google 的示例代码:https://developer.android.com/samples/RuntimePermissions/index.html
| 归档时间: |
|
| 查看次数: |
1638 次 |
| 最近记录: |