【问题标题】:Android - Checking Permissions in a Separate ClassAndroid - 在单独的类中检查权限
【发布时间】:2017-10-05 02:31:49
【问题描述】:

我发现了一些涉及此问题的其他主题,但解决方案对我不起作用。

我有一个类PermissionsManager.java,其中包含检查权限的方法,我在MainActivity.java 中调用它。我从一些人那里读到我必须将上下文和活动传递给checkPermissions(),但我尝试了虽然上下文允许我的应用程序在已授予权限的情况下工作,但如果尚未授予权限,应用程序将崩溃。我无法通过合适的 Activity。

我可以将所有代码放在我的 MainActivity 中,并且我知道它可以在那里工作,因为我已经完成了所有工作,但我真的很想以 MVC 模式设置我的代码,以使视图与控制器分开。

我收到以下错误:

java.lang.NullPointerException:尝试调用虚拟方法'int android.content.Context.checkPermission(java.lang.String, int, int)' 在空对象引用上

谁能解释一下如何让它发挥作用?

权限管理器

import android.Manifest;
import android.content.DialogInterface;
import android.content.pm.PackageManager;
import android.os.Build;
import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatActivity;

import java.util.ArrayList;
import java.util.List;

/**
 * Created on 5/6/2017.
 */

public class PermissionsManager extends AppCompatActivity {
    final private int REQUEST_CODE_ASK_MULTIPLE_PERMISSIONS = 124;

    public void checkPermissions() {
        List<String> permissionsNeeded = new ArrayList<String>();

        final List<String> permissionsList = new ArrayList<String>();
        if (!addPermission(permissionsList, Manifest.permission.READ_CONTACTS))
            permissionsNeeded.add("Read Contacts");
        if (!addPermission(permissionsList, Manifest.permission.SEND_SMS))
            permissionsNeeded.add("Send SMS Texts");
        if (!addPermission(permissionsList, Manifest.permission.RECEIVE_SMS))
            permissionsNeeded.add("Receive SMS Texts");
        if (!addPermission(permissionsList, Manifest.permission.READ_SMS))
            permissionsNeeded.add("Read SMS Texts");


        if (permissionsList.size() > 0) {
            if (permissionsNeeded.size() > 0) {
                // Need Rationale
                String message = "This app requires the following permissions to function correctly: \n" + permissionsNeeded.get(0);
                for (int i = 1; i < permissionsNeeded.size(); i++)
                    message = message + "\n" + permissionsNeeded.get(i);
                showMessageOKCancel(message,
                        new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialog, int which) {
                                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                                    requestPermissions(permissionsList.toArray(new String[permissionsList.size()]),
                                            REQUEST_CODE_ASK_MULTIPLE_PERMISSIONS);
                                }
                            }
                        });
                return;
            }
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                requestPermissions(permissionsList.toArray(new String[permissionsList.size()]),
                        REQUEST_CODE_ASK_MULTIPLE_PERMISSIONS);
            }
            return;
        }
    }

    private void showMessageOKCancel(String message, DialogInterface.OnClickListener okListener) {
        new AlertDialog.Builder(this)
                .setMessage(message)
                .setPositiveButton("OK", okListener)
                .setNegativeButton("Cancel", null)
                .create()
                .show();
    }

    private boolean addPermission(List<String> permissionsList, String permission) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            if (checkSelfPermission(permission) != PackageManager.PERMISSION_GRANTED) {
                permissionsList.add(permission);
                // Check for Rationale Option
                if (!shouldShowRequestPermissionRationale(permission))
                    return false;
            }
        }
        return true;
    }
}

MainActivity OnCreate 方法

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        // Check Permissions
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            PermissionsManager permissionsManager = new PermissionsManager();
            permissionsManager.checkPermissions();
        }
    }

我尝试了一些这样的代码,但它对我不起作用。

if(ContextCompat.checkSelfPermission((Activity)mContext,Manifest.permission.REA
        D_SMS)!=PackageManager.PERMISSION_GRANTED)    
       {
            ActivityCompat.requestPermissions((Activity) mContext, new String[]{Manifest.permission.READ_SMS},
                        MY_PERMISSIONS_REQUEST_READ_SMS);
       }

【问题讨论】:

    标签: java android model-view-controller permissions


    【解决方案1】:

    谁能解释一下如何让它发挥作用?

    第 1 步:永远不要自己创建活动的实例,因为它根本不起作用,并会导致像您所拥有的异常一样。摆脱PermissionsManager permissionsManager = new PermissionsManager();

    第 2 步:让 MainActivity 扩展自 PermissionsManager

    我真的很想以 MVC 模式设置我的代码,以使视图与控制器分开

    我不明白 MVC 是如何与这里联系在一起的。无论如何,您的活动必须至少在一定程度上了解权限,因为您的活动必须实现onRequestPermissionsResults()。如果您想将权限逻辑移动到您的MainActivity(可能还有其他活动)扩展的基类中,那很好。

    或者,查看the seemingly infinite number of runtime permissions helper libraries

    【讨论】:

    • 谢谢。 Base 类的想法奏效了。现在我的 MainActivity 不再那么杂乱了。你是对的,MVC 不是正确的想法。我必须继续学习。
    • 嗨,@CommonsWare 请尽可能检查这个问题.. stackoverflow.com/questions/42968587/… 谢谢
    猜你喜欢
    • 2017-09-26
    • 2016-07-22
    • 2017-07-15
    • 2015-12-06
    • 2014-01-08
    • 2016-07-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多