【问题标题】:Is there any way with FireMonkey to use android-support-v4 that goes with Marshmallow?FireMonkey 有什么方法可以使用与 Marshmallow 配套的 android-support-v4 吗?
【发布时间】:2016-09-29 12:07:44
【问题描述】:

我需要与 Android Marshmallow 一起使用的 android-support-v4,因为它包含对象 PermissionChecker,并且这是了解用户是否拒绝应用权限(例如位置)的唯一方法(在 Marshmallow 及更高版本上) )。

我看到 C:\Program Files (x86)\Embarcadero\Studio\18.0\lib\android\debug\android-support-v4.jar 但我在 C:\Program Files ( x86)\Embarcadero\Studio\18.0\lib\android\debug\classes.dex 所以我猜这是一个旧的 support-v4,它在 classes.dex 中使用。

有没有办法更新 classes.dex 以使用最新的 android-support-v4 ?

【问题讨论】:

  • 那么,我是否明白,在 Marshmallow 上,您不能使用常规权限检查,根据代码中的代码,在这里说我答案中的第二个列表:stackoverflow.com/a/39763742/2817399 或我的答案中的第二个列表这里:stackoverflow.com/a/39642846/2817399 ?
  • @blong:为了更好地解释:事实证明,清单中的 targetSdkVersion 必须是 23,我的是 22。如果您的目标 SDK 是 23(Android 6),则所有权限(在您的清单)默认禁用,而如果您的目标 SDK 为 22(Android 5.1)并且您的应用在 Android 6 上运行,则在用户安装应用时默认启用所有权限,即使用户撤销权限稍后,提到的 API 返回不正确的值(我认为这是一个错误)。

标签: android delphi firemonkey


【解决方案1】:

这就是我所做的:

针对 C:\Users\Public\Documents\Embarcadero\Studio\18.0\PlatformSDKs\android-sdk-windows\extras\android\support\v4 中的 android-support-v4.jar 文件使用 Java2OP(您可能需要在 Android SDK 管理器的 Extras 部分下载 Android 支持库),因为 PermissionChecker 存在于该 jar 中。

在项目的库节点中禁用 android-support-v4.dex.jar。

将android-support-v4.jar(在步骤1中提到)添加到项目中

如果用户拒绝了权限(即在 Android 6 或更高版本中),现在使用 TJPermissionChecker.JavaClass.checkSelfPermission 返回正确的结果

【讨论】:

    【解决方案2】:

    我对已发布问题的评论/问题的答案可能是“哦,我没有尝试过”,并且常规方法工作得很好,这是一个执行常规 Android 权限检查的单元。

    unit MiscU;
    
    interface
    
    function HasPermission(const Permission: string): Boolean;
    
    implementation
    
    uses
      FMX.Helpers.Android,
      Androidapi.Helpers,
      Androidapi.JNI.JavaTypes,
      Androidapi.JNI.GraphicsContentViewText;
    
    function 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;
    
    end.
    

    如果发现我根本不了解更现代的 Android 版本的某些方面,并且此列表与提问者试图解决的问题完全无关,我将删除此答案。

    【讨论】:

    • 感谢布隆!这个例子很好,但它不适用于棉花糖。事实上,这是设计使然,在棉花糖上,用户可以拒绝应用程序的特定权限(如位置)。但是为了保持向后兼容性,应用程序不会知道此权限被拒绝(因为在棉花糖之前这是不可能的,当我们安装应用程序时,该应用程序拥有所有权限并且用户无法撤销它们),而是应用程序将当它调用被拒绝的功能时接收 null 或默认值。因此得出结论,如果 targetSdkVersion
    • 使您的代码工作的唯一选择是将 targetSdkVersion 更新为 23,但我不知道它是否与 Firemonkey(和柏林)兼容。我开始一个新线程来询问它:stackoverflow.com/questions/39772269/…
    猜你喜欢
    • 2013-08-12
    • 2013-01-17
    • 2014-10-22
    • 2020-04-16
    • 1970-01-01
    • 1970-01-01
    • 2015-08-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多