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