Android - Android 6.0 儲存權限被停用導致錯誤問題 - java.lang.NullPointerException: file

Android - java.lang.NullPointerException: file

當我需要使用相機、相簿,並且儲存在某個外部檔案位置如下呼叫

File mediaStorageDir = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES), "BJ4");

卻發生了

Caused by: java.lang.NullPointerException: file
	at android.net.Uri.fromFile(Uri.java:455)

原因在

if (! mediaStorageDir.exists()){
    if (! mediaStorageDir.mkdirs()){
        return null;
    }
}

取得的檔案是null

並且使用了

Uri fileUri = Uri.fromFile(mediaStorageDir)

所以產生了 java.lang.NullPointerException: file 這樣的錯誤

我也實測過了。

如果我故意對該應用程式,設定不可使用儲存的權限,

就會發生回傳的檔案為null

稍後再想辦法解決權限的問題

目前是有文章針對這個問題在處理

http://blog.tonycube.com/2016/07/android-60-android-save-image-and.html

https://inthecheesefactory.com/blog/things-you-need-to-know-about-android-m-permission-developer-edition/en

但由於我complieSdk 才 21 而非23以上。

所以如果要修正這個問題,還需要另外研究。等研究完再分享吧。

-----------

後續,

要解決這樣的問題就是將 support 改為23

compile 'com.android.support:appcompat-v7:23.0.1'

compile sdk 改為23 及引用org.apache.http.legacy

android {
   compileSdkVersion 23
   useLibrary 'org.apache.http.legacy'
}

只剩下,

推播的

setLatestEventInfo

會失效。

這又是另一個問題

待續。

-------------------

幸好網路有針對版本9到23之間的所有程式有一個推播程式解

http://ranterle.de/blog/2015-09-01-Android-Notifications-9-through-23.html
https://gist.github.com/ranterle/1fe0629c2ddddd8eb250#file-notificationutil-java

把產生推播的

Notification

獨立出來處理了。

真是感謝網路大大們的幫忙。

未結束……

--------還有權限要玩---------

在參考了網路文章,撰寫了權限判斷後,還是發生錯誤,

使用 

ActivityCompat.checkSelfPermission(mPubAct, PERMISSION_READ_STORAGE)

得到的永遠會是 

 PackageManager.PERMISSION_GRANTED

因為…我的targetSdkVersion = 17 ,這會導致這個語法永遠無效。

所以得將targetSdkVersion 改為 23 才可以。

終於解決問題了,但……也發生了其它問題,要一個一個修正過去的未授權的地方