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

时间:2016-03-07 13:20:05

标签: java android android-context android-permissions

在查询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
      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);
    }

仍然得到同样的错误,有人可以帮我吗?

3 个答案:

答案 0 :(得分:15)

  

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

这不会起作用。

从不延长Activity,除非它是真实的活动,您将在清单中注册。

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

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

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

答案 1 :(得分:1)

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

答案 2 :(得分:0)

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

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

let termList = [];
const termsRef = firebase.database().ref('vocab/');
termsRef.on('child_added', snap => termList.push(snap.val().term));