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

在查询Android日历以查找事件之前,我需要检查权限。 要做到这一点,Android工作室警告我需要在查询之前进行检查。 自动生成的代码就是这个:

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

尝试运行它时,我收到此错误:

尝试调用虚方法’int
null对象引用上的android.content.Context.checkPermission(java.lang.String,int,int)’

所以很明显,此时某些东西是空的,我试图以不同的方式获取应用程序的上下文,但它仍然是相同的错误。 我试过的其他事情是这个代码,它应该处理低于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); } 

仍然得到同样的错误,任何人都可以帮助我吗?

它是一个单独的类,控制器:公共类DummyData扩展Activity {….}

那不行。

永远不要扩展Activity除非它是一个真实的活动,你将在清单中注册。

永远不要通过构造函数创建Activity的实例(例如,代码中某处的new DummyData() )。 使用startActivity()显示已在清单中注册的活动。

就目前而言,虽然您的DummyData类可能从编译的角度来看,但它在运行时不起作用。 一个Activity需要由框架实例化,而DummyData则不是这种情况。

将一个真实的 Context对象传递给checkSelfPermission() ,并将一个真实的 Activity对象传递给requestPermissions() 。 在这种情况下,“真实”意味着“从框架中交给您”。

使用(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); } 

你必须在活动中“这个”主要问题的位置写下正确的活动。

尝试在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); }