Android M请求权限非活动

时间:2015-07-19 15:09:28

标签: android android-6.0-marshmallow

我的小部件调用Activity范围之外的安全权限。是否可以在Activity

之外请求 Android M 的权限

7 个答案:

答案 0 :(得分:5)

不,这是不可能的。您可以做的是发送通知,用户可以点击然后使用活动来请求/管理权限(可能使用对话框主题)。

答案 1 :(得分:2)

您只能从“活动”或“片段”中请求权限。

找出您觉得App需要权限的Activity或Fragment中的一个点,然后调用requestPermission方法。发送通知将不起作用,因为您希望您的代码处理直到您获得所请求的权限,然后从onRequestPermissionResult()方法恢复您的功能。

答案 2 :(得分:2)

我认为只要您使用该方法,就可以在活动之外申请许可

ActivityCompat.requestPermissions (Activity activity, String[] permissions, int requestCode)

从支持库中传递Activity作为方法的参数。

例如:

ActivityCompat.requestPermissions(targetActivity, new String[] {Manifest.permission.CAMERA}, PERMISSION_REQUEST_CODE);

其中targetActivity是应该实现该方法的Activity:

onRequestPermissionsResult (int requestCode, String[] permissions, int[] grantResults)

这是处理de权限请求结果的方法。

答案 3 :(得分:2)

您可以使用Easy Permissions库。

Android要求这些请求来自Activity。使用简易权限这不再是一个问题,只要您提供Context,您就可以从任何地方请求权限。此外,如果您请求已授予的权限,则不会提示用户。

enter image description here

完全披露,我们公司管理和开发这个免费使用的库。话虽如此,我们相信它是一个有用的工具,我们不会分享它。

答案 4 :(得分:2)

我正在创建一个需要检查许多活动中的权限的应用程序,因此我创建了一个静态类,可以在该应用程序中全局使用它。 而且有效。 这对我有用。

我创建了一种方法来检查类似这样的其他类中的权限请求。

public class CheckForPermissions implements ActivityCompat.OnRequestPermissionsResultCallback {
private static final int MY_PERMISSIONS_REQUEST_READ_LOCATION = 1;


    public static void checkForLocationPermissions(Activity context){
        if(ContextCompat.checkSelfPermission(context, Manifest.permission.ACCESS_FINE_LOCATION)  != PackageManager.PERMISSION_GRANTED
        || ContextCompat.checkSelfPermission(context, Manifest.permission.ACCESS_COARSE_LOCATION)  != PackageManager.PERMISSION_GRANTED){
            ActivityCompat.requestPermissions(context,
                    new String[]{Manifest.permission.ACCESS_FINE_LOCATION},
                    MY_PERMISSIONS_REQUEST_READ_LOCATION);

    }
}}

在“活动”中,我这样调用方法

        CheckForPermissions.checkForLocationPermissions(this);

答案 5 :(得分:0)

我找到了一种似乎可以正常工作的解决方法。诀窍是创建一个透明的活动,仅在该活动中可以请求权限,然后立即完成。当然,您仍然需要一个上下文,但是它不一定是一项活动。 活动可以通过广播返回结果(允许或拒绝)(因为在活动之外不可能startActivtyForResult)。

您可以使用此活动:

import android.content.Intent
import android.content.pm.PackageManager
import android.os.Bundle
import android.support.v4.app.ActivityCompat
import android.support.v7.app.AppCompatActivity

internal const val PERMISSIONS_KEY = "permissions"
internal const val ACTION_PERMISSIONS_GRANTED = "GetPermissionsActivity.permissions_granted"
internal const val ACTION_PERMISSIONS_DENIED = "GetPermissionsActivity.permissions_denied"

class GetPermissionsActivity: AppCompatActivity() {

    private val permissionRequestCode = 0

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        ActivityCompat.requestPermissions(
            this,
            intent.getStringArrayExtra(PERMISSIONS_KEY),
            permissionRequestCode
        )
    }

    override fun onRequestPermissionsResult(
        requestCode: Int,
        permissions: Array<out String>,
        grantResults: IntArray
    ) {
        if (requestCode == permissionRequestCode) {
            if ((grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED)) {
                sendBroadcast(Intent(ACTION_PERMISSIONS_GRANTED))
            } else {
                sendBroadcast(Intent(ACTION_PERMISSIONS_DENIED))
            }
            finish()
        } else {
            super.onRequestPermissionsResult(requestCode, permissions, grantResults)
        }
    }
}

这种活动风格

<style name="Theme.Transparent" parent="Theme.AppCompat">
    <item name="android:windowIsTranslucent">true</item>
    <item name="android:windowBackground">@android:color/transparent</item>
    <item name="android:windowContentOverlay">@null</item>
    <item name="android:windowNoTitle">true</item>
    <item name="android:windowIsFloating">true</item>
    <item name="android:backgroundDimEnabled">false</item>
    <item name="android:windowAnimationStyle">@null</item>
</style>

在清单中:

<activity android:name="GetPermissionsActivity" android:theme="@style/Theme.Transparent" />

然后像这样使用它(需要上下文)

class SomeClass : BroadcastReceiver() {

    private fun someFunction(context: Context) {
        val intentFilter = IntentFilter()
        intentFilter.addAction(ACTION_PERMISSIONS_GRANTED)
        intentFilter.addAction(ACTION_PERMISSIONS_DENIED)
        context.registerReceiver(this, intentFilter)
        val intent = Intent(context, GetPermissionsActivity::class.java)
        intent.putExtra(PERMISSIONS_KEY, arrayOf(<your permissions>))
        context.startActivity(intent)
    }

    override fun onReceive(context: Context, intent: Intent) {
        when {
            intent.action == ACTION_PERMISSIONS_GRANTED -> {
                context.unregisterReceiver(this)
                onPermissionsGranted()
            }
            intent.action == ACTION_PERMISSIONS_DENIED -> {
                context.unregisterReceiver(this)
                onPermissionsDenied()
            }
            else -> super.onReceive(context, intent)
        }
    }

    private fun onPermissionsGranted() {
        // ...
    }

    private fun onPermissionsDenied() {
        // ...
    }
}

答案 6 :(得分:-2)

可以从您的活动外部调用requestPermissions(),但在您的班级中,您应该拥有该活动的上下文。

ActivityCompat.requestPermissions((Activity)context, new String[]{permission.READ_PHONE_STATE}, REQUEST_CODE);

为了工作,您应该在活动中实施以下方法

onRequestPermissionsResult (int requestCode, String[] permissions, int[] grantResults)

这样当用户点击弹出窗口中的允许或拒绝按钮时,这个覆盖方法就会执行