2016-03-07 50 views
2

我需要在查询Android日历中的事件之前检查权限。 要做到这一点,Android工作室警告我需要在查询之前进行检查。 自动生成的代码是这片:使用android.content.Context.checkPermission检查权限时出现空指针异常

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

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

+1

从哪里调用?这个对象涉及到 –

+0

它是一个单独的类,控制器:公共类DummyData延伸活动{...} –

+0

以及你应该使用AppCompatActivity类不是活动 –

回答

15

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

这是行不通的。

从不延长Activity除非它是一个真正的活动,你将在清单中注册。

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

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

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

+0

事实证明,它是事实一个愚蠢的问题,但你的答案确实帮了我。我删除了extends Activity,并将上下文和活动传递给构造函数。谢谢! –

+0

@CommonsWare如上所述*将一个真正的Context对象传递给checkSelfPermission(),并将一个真实的Activity对象传递给requestPermissions()*。在片段中传递getContext()会工作吗?或者我必须使用getActivity()? – VishalKale

+0

@VishalKale:这两者都应该用于checkSelfPermission()的目的。 – CommonsWare

0

您必须在活动中的“此” 位置写下正确的活动。

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

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

对于requestPermissions方法,如果您传递活动,它实际上仍然有效。 (尽管你可能会发送上下文来保持一致性) – Venryx