無法讀取本地圖片的錯誤(運行時權限的添加)


E/BitmapFactory: Unable to decode stream: java.io.FileNotFoundException: /storage/emulated/0/Download/00.PNG (Permission denied) 今天被這個問題煩惱了一天,最后各種查資料才解決,特此記錄一下。
項目當中需要讀取本地的圖片顯示,把圖片的路徑保存到了數據庫中,但是取出來顯示的時候總是顯示不出來圖片,一直提示以上的錯誤,看到日志就知道是權限的問題,但是我在Mainfest文件中相應的權限也都加上了,而且為了驗證權限的正確性我都一個字母一個字母的檢查了,結果還是一直出不來圖片
if (cursor.getCount() == 0) {//如果數據庫中還沒有數據則只顯示添加的選項
            //測試時候用到
//            arrayList_im_id.add(BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher));
//            arrayList_name.add("11111");
            arrayList_im_id.add(BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher));
            arrayList_name.add("");
        } else {
            cursor.moveToFirst();
           do {
                File file = new File(cursor.getString(3));
               Log.i("---LK---",cursor.getString(3));
                if (file.exists()) {//如果有照片文件
                    Bitmap picb = BitmapFactory.decodeFile(cursor.getString(3));
                    arrayList_im_id.add(picb);
                    arrayList_name.add(cursor.getString(1));
                } else {//如果沒有照片文件
                    Log.i("---LK---","no file");
                    arrayList_im_id.add(BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher));
                    arrayList_name.add(cursor.getString(1));
                }

            } while (!cursor.isAfterLast() && cursor.getString(1) != null &&cursor.moveToNext());
            //在最后添加上添加選項的圖片
            arrayList_im_id.add(BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher));
            arrayList_name.add("");
        }

代碼也沒有任何問題,后來一直以為是圖片路徑保存有誤,但是反復查驗后感覺沒什么問題百度了很長時間也沒找出來想要的答案,最后果斷選擇谷歌,雖然英語不是太好,但是還是大概看懂了。
If it fails with this permission is present already, then you need to check your app's target SDK level. If it is targetSdkVersion => 23, then you need to request permissions at Run Time
意思是說android6.0之后不僅需要在Mainfest里面添加權限,還需要添加運行時權限。知道問題解決起來就容易了,外國網站上有個例子是
private static final int WRITE_PERMISSION = 0x01;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    requestWritePermission();
}

@Override
public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
    if(requestCode == WRITE_PERMISSION){
        if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
            Log.d(LOG_TAG, "Write Permission Failed");
            Toast.makeText(this, "You must allow permission write external storage to your mobile device.", Toast.LENGTH_SHORT).show();
            finish();
        }
    }
}

private void requestWritePermission(){
    if(checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE)!=PackageManager.PERMISSION_GRANTED){
        ActivityCompat.requestPermissions(this,new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},WRITE_PERMISSION);
    }
}

仿照他的例子我在代碼中添加了
if (ActivityCompat.checkSelfPermission(getActivity(), Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
            ActivityCompat.requestPermissions(getActivity(), new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},1);
        }

最終問題成功解決,運行的過程中會提示你是否運行此權限,看到這個就激動起來了,因為感覺會成功,果然不出所料。感謝google。


注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2021 ITdaan.com