2016-03-07 48 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