Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android M请求权限非活动_Android_Android 6.0 Marshmallow - Fatal编程技术网

Android M请求权限非活动

Android M请求权限非活动,android,android-6.0-marshmallow,Android,Android 6.0 Marshmallow,我的小部件在活动范围外调用以保护权限。是否可以在活动之外为Android M请求权限?不,不可能。您可以做的是发送一个通知,用户可以点击该通知,然后使用“活动”请求/管理权限(可能使用对话框主题)。您只能从“活动”或“片段”请求权限 找出活动或片段中您认为应用程序需要权限的点,然后调用requestPermission方法。发送通知将不起作用,因为您希望在获得请求的权限之前取消代码处理,然后从onRequestPermissionResult()方法恢复功能。我认为,只要使用该方法,就可以在活动

我的小部件在
活动
范围外调用以保护权限。是否可以在
活动
之外为Android M请求权限?

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

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


找出活动或片段中您认为应用程序需要权限的点,然后调用requestPermission方法。发送通知将不起作用,因为您希望在获得请求的权限之前取消代码处理,然后从onRequestPermissionResult()方法恢复功能。

我认为,只要使用该方法,就可以在活动之外请求权限

并将活动作为方法的参数传递

例如:

ActivityCompat.requestPermissions(targetActivity, new String[] {Manifest.permission.CAMERA}, PERMISSION_REQUEST_CODE);
其中targetActivity是应实施该方法的活动:

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

您可以使用该库

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


充分披露,我们公司管理和开发此免费使用的图书馆。尽管如此,我们相信这是一个有用的工具,否则我们不会分享它

我找到了一个似乎很好的解决办法。诀窍是创建一个透明的活动,该活动仅用于请求权限,然后立即完成。当然,您仍然需要一个上下文,但它不一定是一个活动。 活动可以通过广播返回结果(允许或拒绝)(因为
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)
        }
    }
}
导入android.content.Intent
导入android.content.pm.PackageManager
导入android.os.Bundle
导入android.support.v4.app.ActivityCompat
导入android.support.v7.app.AppActivity
内部const val PERMISSIONS\u KEY=“PERMISSIONS”
内部const val ACTION_PERMISSIONS_grated=“GetPermissionsActivity.PERMISSIONS_grated”
内部const val ACTION\u PERMISSIONS\u DENIED=“GetPermissionsActivity.PERMISSIONS\u DENIED”
类GetPermissionsActivity:AppCompativeActivity(){
private val permissionRequestCode=0
重写创建时的乐趣(savedInstanceState:Bundle?){
super.onCreate(savedInstanceState)
ActivityCompat.requestPermissions(
这
intent.getStringArrayExtra(权限密钥),
许可请求代码
)
}
覆盖onRequestPermissionsResult(
请求代码:Int,
权限:数组,
格兰特结果:因塔雷
) {
if(requestCode==permissionRequestCode){
if((grantResults.isNotEmpty()&&grantResults[0]==PackageManager.PERMISSION_已授予)){
sendBroadcast(意图(操作权限授予))
}否则{
发送广播(意图(操作\权限\拒绝))
}
完成()
}否则{
super.onRequestPermissionsResult(请求代码、权限、GrantResult)
}
}
}
这是活动的风格

<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>

真的
@android:彩色/透明
@空的
真的
真的
假的
@空的
在舱单中:

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

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

class-SomeClass:BroadcastReceiver(){
私有函数(上下文:上下文){
val intentFilter=intentFilter()
intentFilter.addAction(已授予操作权限)
intentFilter.addAction(操作\u权限\u被拒绝)
registerReceiver(这个,intentFilter)
val intent=intent(上下文,GetPermissionsActivity::class.java)
intent.putExtra(权限\密钥,arrayOf())
上下文。起始触觉(意图)
}
覆盖接收(上下文:上下文,意图:意图){
什么时候{
intent.action==操作\u权限\u授予->{
上下文。取消注册接收者(此)
onPermissionsGranted()
}
intent.action==操作\u权限\u被拒绝->{
上下文。取消注册接收者(此)
OnPermissionsDeed()
}
else->super.onReceive(上下文、意图)
}
}
私人娱乐许可证{
// ...
}
许可证规定的私人娱乐(){
// ...
}
}

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

我创建了一个方法来检查像这样的不同类中的权限请求

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);

配置活动也是处理此问题的好地方。虽然用户可以进入权限屏幕并撤销任何以前给定的权限,但是仍然需要通知方法。我也会考虑把这个小部件放在一个允许撤销的UI状态中作为一个替代的方法。活动之外的意思是从一个服务或一个广播接收器,在那里你根本没有活动。这个答案毫无帮助。通常,您可以将上下文对象传递给非活动类,并在需要上下文而没有活动时使用它。尽管请求权限是另一回事。@Gabe一方面你是对的,但另一方面,问题并没有指出发问者想打电话的地方
        CheckForPermissions.checkForLocationPermissions(this);