1、這個問題和android在2017年2月間的信件問題相關,也就是說,遇到重要權限之前都要改程式(見教學)。
2、有幾種錯誤訊息,本例是在Camera照像時沒有產生圖片的情況,例如(FileNotFoundException):



首先,程式本身沒有問題,但要增加判斷,是因為6.0版本要增加判斷是否給予權限,不選的話就是無權限。在6.0版本的權限管控變得比較嚴格,以下會慢慢說明。
1、在存檔案、圖片前加上這段程式,若無權限會跳出詢問框
int permission = ActivityCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE);
            if (permission != PackageManager.PERMISSION_GRANTED) {
                ActivityCompat.requestPermissions(
                        this,
                        new String[] {
                                Manifest.permission.WRITE_EXTERNAL_STORAGE,
                                Manifest.permission.READ_EXTERNAL_STORAGE},
                        REQUEST_EXTERNAL_STORAGE
                );
            }else{
                //writeFile();
                //Toast.makeText(this, "有權限(test)" ,Toast.LENGTH_SHORT).show();
            }

2、要加上詢問框回傳函式
@Override
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
        switch(requestCode) {
            case REQUEST_EXTERNAL_STORAGE:
                if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                    //取得權限,進行檔案存取
                    //writeFile();

                } else {
                    //使用者拒絕權限,停用檔案存取功能

                }
                return;
        }
    }


3、在AndroidManifest.xml加上這二個項目
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
 

成功的結果如下:


至於原理是為何呢?可以參考以下的文章
https://litotom.com/2016/05/15/android-6-permission/
簡單地說是因為API 23開始細分為一般權限與危險權限,危險權限要用上述的程式段在執行中要求權限,所以程式要做些許改寫。
這邊整理資料將步驟簡化,附上問題圖片與解決圖片。


如果是位置存取資訊也會有上述問題,請看這篇

arrow
arrow
    創作者介紹
    創作者 貓羽 的頭像
    貓羽

    貓羽的文字日誌

    貓羽 發表在 痞客邦 留言(0) 人氣()