是否可以从库中请求运行时权限?

时间:2016-04-18 11:48:52

标签: android android-permissions

我们制作一些客户在他们的应用程序中实现的库,现在我们希望更新它们以支持Android 6.0新的权限模型。

我的问题是,是否有任何方法可以在运行时从我们的库(主要是静态类)请求危险权限,而不是要求客户端在使用我们的库之前请求这些权限。

我一直在搞乱它,但对我来说似乎不太可能,看起来它必须来自我们没有的活动。

我是对的还是有办法吗?

提前致谢。

3 个答案:

答案 0 :(得分:7)

  

看起来必须来自我们没有的活动。

正确。这是因为权限请求逻辑严重依赖于startActivityForResult()onActivityResult(),包装处理权限请求。

另外,请求权限需要与整个应用程序流紧密相关,而无UI的库无法知道此时是否适合尝试请求权限。

欢迎您通过ContextCompat.checkSelfPermission()检查您是否拥有该权限,因为它没有用户界面。因此,您可以使用它来检查库的入口点是否具有执行工作所需的权限,而不是仅仅让SecurityException或其他任何事情发生。

答案 1 :(得分:0)

首先,我想告诉你运行时权限检查Android M,如果你想通过用户授予权限,你需要在活动或片段(在主线程上)上打开用户交互权限对话框。

因此,您可以为您的功能创建方法,参数为

的方法

public void yourMethod(Activty activity){

//条件适用于下面的权限检查

if (ContextCompat.checkSelfPermission(activity,
                Manifest.permission.READ_CONTACTS)
        != PackageManager.PERMISSION_GRANTED) {

    // Should we show an explanation?
    if (ActivityCompat.shouldShowRequestPermissionRationale(activity,
            Manifest.permission.READ_CONTACTS)) {

        // Show an expanation to the user *asynchronously* -- don't block
        // this thread waiting for the user's response! After the user
        // sees the explanation, try again to request the permission.

    } else {

        // No explanation needed, we can request the permission.

        ActivityCompat.requestPermissions(activity,
                new String[]{Manifest.permission.READ_CONTACTS},
                MY_PERMISSIONS_REQUEST_READ_CONTACTS);

        // MY_PERMISSIONS_REQUEST_READ_CONTACTS is an
        // app-defined int constant. The callback method gets the
        // result of the request.
    }
}
}

// Now you can handle call back in your activity through overriding the method // onRequestPermissionsResult this method must be written in your activity class  

 @Override
public void onRequestPermissionsResult(int requestCode,
        String permissions[], int[] grantResults) {
    switch (requestCode) {
        case MY_PERMISSIONS_REQUEST_READ_CONTACTS: {
            // If request is cancelled, the result arrays are empty.
            if (grantResults.length > 0
                && grantResults[0] == PackageManager.PERMISSION_GRANTED) {

                // permission was granted, yay! Do the
                // contacts-related task you need to do.

               yourMethod(YourActivity.this);

            } else {

                // permission denied, boo! Disable the
                // functionality that depends on this permission.

              // you can also call your method here  but it may be create                          infinite loop if user deny run time permission
            }
            return;
        }

        // other 'case' lines to check for other
        // permissions this app might request
    }
}

活动对象也可以创建参数化构造。 为方法创建接口。

答案 2 :(得分:0)

您可以使用我的图书馆从任何地方请求权限。

https://github.com/nabinbhandari/Android-Permissions

您只需传递Context参数即可轻松申请权限。您甚至不必覆盖方法onRequestPermissionsResult

示例代码:

Permissions.check(this/*context*/, Manifest.permission.CALL_PHONE, null,
        new PermissionHandler() {
            @Override
            public void onGranted() {
                //do your task.
            }
        });

只需这一小块代码,您就可以从任何地方请求权限!