4

我发现 kivy 是构建跨平台应用程序的非常好的框架,我对 kivy 非常感兴趣,只是为了做 android 应用程序,因为我认为 kivy 很容易和舒适。

在尝试了几个示例之后,我很想知道应该如何处理 kivy 应用程序的 android 运行时权限。

实际上我在谷歌上搜索过,但没有一个可行的例子。我应该回到 android / java 还是可以使用 kivy 和其他一些 python 库。

4

4 回答 4

4

pyjnius 是要走的路。您必须使用 pyjnius移植这些指令。这涉及以下步骤:

  • 不幸的是,对 ContextCompat.checkSelfPermission 的 api 调用是在必须单独下载的 android sdk 支持库中实现的,因此请获取与您的 android API 级别最匹配的版本的 .aar,例如此处
  • 将其复制到您的项目目录中并从您的 buildozer.spec 中引用它:

    android.add_aars = support-v4-26.0.0-alpha1.aar  
    
  • 确保 jinius 在 buildozer.spec 的要求中

  • 使用以下代码片段

注意:这是一个阻止功能,它会等待权限对话框得到回答。如果应用程序已经拥有权限,该函数会立即返回。因此,例如,如果您想获得写入 SD 卡和相机的权限,这都是“危险权限”,请调用:

perms = ["android.permission.READ_EXTERNAL_STORAGE",
         "android.permission.WRITE_EXTERNAL_STORAGE",
         "android.permission.CAMERA"]

haveperms = acquire_permissions(perms)

这里是获取权限的函数:

import time
import functools
import jnius

def acquire_permissions(permissions, timeout=30):
    """
    blocking function for acquiring storage permission

    :param permissions: list of permission strings , e.g. ["android.permission.READ_EXTERNAL_STORAGE",]
    :param timeout: timeout in seconds
    :return: True if all permissions are granted
    """

    PythonActivity = jnius.autoclass('org.kivy.android.PythonActivity')
    Compat = jnius.autoclass('android.support.v4.content.ContextCompat')
    currentActivity = jnius.cast('android.app.Activity', PythonActivity.mActivity)

    checkperm = functools.partial(Compat.checkSelfPermission, currentActivity)

    def allgranted(permissions):
        """
        helper function checks permissions
        :param permissions: list of permission strings
        :return: True if all permissions are granted otherwise False
        """
        return reduce(lambda a, b: a and b,
                    [True if p == 0 else False for p in map(checkperm, permissions)]
                    )

    haveperms = allgranted(permissions)
    if haveperms:
        # we have the permission and are ready
        return True

    # invoke the permissions dialog
    currentActivity.requestPermissions(permissions, 0)

    # now poll for the permission (UGLY but we cant use android Activity's onRequestPermissionsResult)
    t0 = time.time()
    while time.time() - t0 < timeout and not haveperms:
        # in the poll loop we could add a short sleep for performance issues?
        haveperms = allgranted(permissions)

    return haveperms

可能最干净的方法是 pimp p4a 的 PythonActivity.java 来做到这一点,但现在这个是为我做的。

于 2018-11-30T07:58:14.067 回答
1

我知道这个答案有点晚了,但是要获得权限,您必须在构建之前指定它们。例如 buildozer 使用 buildozer.spec。在此文件中,您可以指定所需的权限。

于 2020-08-14T17:24:34.167 回答
1

python-for-android 没有任何处理运行时权限的代码。我希望尽快看到它,但没有 ETA。

如果您有兴趣并且知道如何操作,您可以自己添加代码。如果您想尝试一下,非常欢迎这样的贡献。

于 2017-11-28T01:16:33.397 回答
0

嗨,这个问题很旧,但你可以使用

request_permissions([Permission.WRITE_EXTERNAL_STORAGE])
#For requesting permission you can pass a list with all the permissions you need

check_permission('android.permission.WRITE_EXTERNAL_STORAGE')
#returns True if you have the permission 

您可以检查:python-for-android 示例

您可以检查代码和可以使用此方法使用的权限列表: python-for-android 代码

于 2019-12-23T03:44:34.910 回答