使用 android.content.Context.checkPermission 检查权限时出现空指针异常

Null pointer exception when checking for permission with android.content.Context.checkPermission

我需要在查询 Android 日历中的事件之前检查权限。 为此,Android studio 警告我需要在查询之前进行检查。 自动生成的代码是这段:

if (ActivityCompat.checkSelfPermission(this, Manifest.permission.READ_CALENDAR) != PackageManager.PERMISSION_GRANTED) {
        System.out.println("NO ACCESS TO CALENDAR!! Abort mission, abort mission!!");
    }

尝试 运行 时,出现此错误:

Attempt to invoke virtual method 'int
android.content.Context.checkPermission(java.lang.String, int, int)' on a null object reference

所以很明显此时有些东西是空的,我尝试用不同的方式获取应用程序的上下文,但它仍然是同样的错误。 我尝试的另一件事是这段代码,它应该处理低于 Android 6:

的目标
if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_CALENDAR) != PackageManager.PERMISSION_GRANTED) {

        ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_CALENDAR},
                MY_PERMISSIONS_REQUEST_READ_CONTACTS);
    }

仍然出现同样的错误,有人可以帮我解决这个问题吗?

it's a separate class, controller: public class DummyData extends Activity { .... }

那是行不通的。

切勿 扩展 Activity 除非它是一个真正的 activity,您将在清单中注册它。

从不 通过构造函数创建 Activity 的实例(例如,代码中某处的 new DummyData())。使用 startActivity() 显示您在清单中注册的 activity。

就目前而言,虽然您的 DummyData class 从编译的角度来看可能有效,但它在运行时不起作用。 Activity 需要由框架实例化,而您的 DummyData.

不是这种情况

传递一个realContext对象给checkSelfPermission(),传递一个realActivity反对 requestPermissions()。在这种情况下,"real" 表示 "handed to you from the framework".

你必须在"this"的位置写上正确的activity activity 中的主要问题。

尝试在MainActivity中编写代码并测试。

   if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_CALENDAR) != PackageManager.PERMISSION_GRANTED) {

    ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_CALENDAR},
            MY_PERMISSIONS_REQUEST_READ_CONTACTS);
}

使用 (Activity)mContext 而不是这个。

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