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 才可以。
終於解決問題了,但……也發生了其它問題,要一個一個修正過去的未授權的地方