如何使用kivy处理android运行时权限

时间:2017-11-27 11:34:52

标签: android python kivy android-permissions pyjnius

我发现kivy是非常google框架来构建跨平台应用程序,我对kivy非常感兴趣,只是为了做我认为简单和舒适的kivy应用程序。

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

其实我在google上搜索过,但没有单一的工作示例。我应该回到android / java还是可以使用kivy和其他一些python库。

3 个答案:

答案 0 :(得分:3)

pyjnius是必经之路。您必须使用pyjnius来移植these instructions。这涉及以下步骤:

  • 很遗憾,对ContextCompat.checkSelfPermission的api调用是在android sdk支持库中实现的,该库必须单独下载, 因此,请获取具有与您的Android API级别for example here最匹配的版本的.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

也许最干净的方法是将p4a的PythonActivity.java皮条客化,但这是现在为我做的。

答案 1 :(得分: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 example

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

答案 2 :(得分:0)

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