Android - 检查权限

Posted

技术标签:

【中文标题】Android - 检查权限【英文标题】:Android - Check Permission 【发布时间】:2016-07-22 09:43:20 【问题描述】:

此代码用于测试应用程序是否有权限,如果有权限则返回true,否则返回false。

但是当我运行应用程序停止工作时它不工作,所以我想知道为什么它不工作,如果这在代码中丢失了一些东西:

EDIT2 - 根据建议进行了一些更正,但仍然无效:

 public class CheckPermission extends Activity 
    private final Context context;
    private static final String MNC = "MNC";
    int permReq = 0;
    String permMan = "";

    public CheckPermission(Context context) 
        this.context = context;
    

    //perMan can be any code number higher than 0
    public void requestPermission(String permRequested)
        switch (permRequested) 
            case "CAMERA":
                //Request for Camera
                this.permReq =  ContextCompat.checkSelfPermission(context, Manifest.permission.CAMERA);
                this.permMan = Manifest.permission.CAMERA;
                break;
            case "INTERNET":
                //Requesr for Internet
                this.permReq =  ContextCompat.checkSelfPermission(context, Manifest.permission.INTERNET);
                this.permMan = Manifest.permission.INTERNET;
                break;
            case "STORAGE":
                //Request for group Storage - Read_External_Storage & Write_External_Storage
                this.permReq =  ContextCompat.checkSelfPermission(context, Manifest.permission_group.STORAGE);
                this.permMan = Manifest.permission_group.STORAGE;
                break;
            case "MICROPHONE":
                //Request for group Microphone - Record_Audio
                this.permReq =  ContextCompat.checkSelfPermission(context, Manifest.permission_group.MICROPHONE);
                this.permMan = Manifest.permission_group.MICROPHONE;
                break;
            case "LOCATION":
                //Request for group Location - Acess_Fine_Location & Acess_Coarse_Location
                this.permReq =  ContextCompat.checkSelfPermission(context, Manifest.permission_group.LOCATION);
                this.permMan = Manifest.permission_group.LOCATION;
                break;
            case "CALL":
                //Requesr for call
                this.permReq = ContextCompat.checkSelfPermission(context, Manifest.permission.CALL_PHONE);
                this.permMan = Manifest.permission.CALL_PHONE;
                break;
            default:
                break;
        
    

    public boolean hasPermission( String permRequested)
        final PackageManager pm = context.getPackageManager();

        if(isMNC_Or_Higher()) 
            requestPermission(permRequested);
            Toast.makeText(this.context, "Is MNC - permMan: " + this.permMan + " Perm required: " + permReq, Toast.LENGTH_SHORT).show();

            if (permReq != pm.PERMISSION_GRANTED) 
                ActivityCompat.requestPermissions(this, new String[]this.permMan, this.permReq);
                return false;
            
        
        return true;
    

    //check if is 6.0 or higher
    public boolean isMNC_Or_Higher()
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) 
            return true;
        
        return false;
    

    @Override
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) 

        if (requestCode == this.permReq) 
            if (grantResults.length == 1 &&
                    grantResults[0] == PackageManager.PERMISSION_GRANTED) 
                Toast.makeText(this, "Permissão concedida", Toast.LENGTH_SHORT).show();
             else 
                Toast.makeText(this, "Permissão negada", Toast.LENGTH_SHORT).show();
            
         else 
            super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        
    

错误:

PID:25504 java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法“android.content.Context android.content.Context.getApplicationContext()” 在 android.content.ContextWrapper.getApplicationContext(ContextWrapper.java:107) 在 com.dev.kamui.patrulhacomunitaria.CheckPermission.hasPermission(CheckPermission.java:68) 在 com.dev.kamui.patrulhacomunitaria.Pagina_Principal$1.onClick(Pagina_Principal.java:47) 在 android.view.View.performClick(View.java:5198) 在 android.view.View$PerformClick.run(View.java:21147) 在 android.os.Handler.handleCallback(Handler.java:739) 在 android.os.Handler.dispatchMessage(Handler.java:95) 在 android.os.Looper.loop(Looper.java:148) 在 android.app.ActivityThread.main(ActivityThread.java:5417) 在 java.lang.reflect.Method.invoke(本机方法) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)

【问题讨论】:

logcat中发布错误 你想如何开始这个活动? 我想这样开始CheckPermission checkPermission = new CheckPermission(getApplicationContext()); if(checkPermission.hasPermission("LOCATION")) ... 从 Activity 扩展你的类很奇怪,因为它看起来像简单的 Util 类 我真的想要我 Util calss,但如果我不扩展活动,我就无法调用 onRequestPermissionResult 【参考方案1】:

requestPermissions 需要这样调用

requestPermissions(this, new String[]this.permMan, this.permReq);

如果您希望 CheckPermission 作为 Util 类,则无需从 Activity 类继承它。也不需要做“this.context = context;”在 CheckPermission 构造函数中。而是通过 hasPermission 方法将上下文发送到 requestPermission 方法中。也在 ActivityCompat.requestPermissions 中使用它。然后在每个调用 hasPermission 的活动中实现 onRequestPermissionsResult。

【讨论】:

我在 checkSelfPermission 中遇到错误,每当我使用此代码时,应用程序就会停止运行。我尝试使用ActivityCompat.requestPermissions(this, new String[]this.permMan, this.permReq);,但没有解决问题。 你能不能试试:checkSelfPermission(这个,权限);最好添加错误日志。 没有工作我在代码之后在logcat中发布了错误 看来你没有得到应用程序上下文。您需要传递适当的上下文。参考***.com/questions/10641144并检查CheckPermission.java中的第68行 我想在这里做的只是一个问题,从其他活动中调用此活动中的一种方法,因为在许多活动中我需要检查用户是否已授予权限(android 6.0 - 23api)。你认为在这个场景中我做错了什么吗?例如,我不应该使用活动来执行此操作,因为我想要的是 Util 类【参考方案2】:

Activity 不应该有你写的这样的构造函数。

Activity 本身是上下文的子类,因此您可以编写 this 而不是 context

this.permReq = ContextCompat.checkSelfPermission(this, Manifest.permission_group.STORAGE);

【讨论】:

比我只使用@Override protected void onCreate(Bundle savedInstanceState) super.onCreate(savedInstanceState); 对吧?【参考方案3】:

从 Android 6.0 及更高版本开始,您必须在代码中请求权限。

私有静态最终 int PERMISSION_REQUEST_CODE = 1;

if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M) 

    if (checkSelfPermission(Manifest.permission.SEND_SMS)
            == PackageManager.PERMISSION_DENIED) 

        Log.d("permission", "permission denied to SEND_SMS - requesting it");
        String[] permissions = Manifest.permission.SEND_SMS;

        requestPermissions(permissions, PERMISSION_REQUEST_CODE);

    

【讨论】:

以上是关于Android - 检查权限的主要内容,如果未能解决你的问题,请参考以下文章

Android检查位置权限错误

如何检查是不是实际使用了 Android 权限?

Android 开发技巧 - Android 6.0 以上权限大坑和权限检查基类封装

Android的权限检查

检查Android中的用户是不是已经授予权限

在 Android 6.0 (sdk 23) 中检查自定义权限