首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Android -检查权限

问Android -检查权限
EN

Stack Overflow用户
提问于 2016-04-02 16:21:01
回答 3查看 3.7K关注 0票数 0

此代码用于测试应用程序在被检查后是否具有权限,如果您有权限,则返回true,否则返回false。

但是当我运行应用程序停止工作时,它就不起作用了,所以我想知道它为什么不能工作,如果代码中缺少了什么:

EDIT2 --提出了一些建议,但仍然没有奏效:

代码语言:javascript
复制
 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.Contextandroid.content.ContextWrapper.getApplicationContext(ContextWrapper.java:107) at com.dev.kamui.patrulhacomunitaria.CheckPermission.hasPermission(CheckPermission.java:68)在com.dev.kamui.patrulhacomunitaria.Pagina_Principal$1.onClick(Pagina_Principal.java:47) at android.view.View.performClick(View.java:5198)在android.view.View$PerformClick.run(View.java:21147) at android.os.Handler.handleCallback(Handler.java:739)在android.os.Handler.dispatchMessage(Handler.java:95) at android.os.Looper.loop(Looper.java:148)在android.app.ActivityThread.main(ActivityThread.java:5417) at java.lang.reflect.Method.invoke(原生方法)在com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-04-02 16:34:38

需要像这样调用requestPermissions

代码语言:javascript
复制
requestPermissions(this, new String[]{this.permMan}, this.permReq);

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

票数 1
EN

Stack Overflow用户

发布于 2016-04-02 19:17:46

活动不应该像您所写的那样具有构造函数。

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

代码语言:javascript
复制
this.permReq = ContextCompat.checkSelfPermission(this, Manifest.permission_group.STORAGE);
票数 0
EN

Stack Overflow用户

发布于 2018-10-26 09:52:27

在Android6.0和更高版本中,您必须在代码中请求许可。

私有静态最终int PERMISSION_REQUEST_CODE = 1;

代码语言:javascript
复制
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);

    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36375724

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档