1. 程式人生 > >Android開發——Android 7.0以上出現儲存圖片失敗的問題

Android開發——Android 7.0以上出現儲存圖片失敗的問題

前言

在日常的Android開發當中,我們可能遇到儲存圖片的需求。這個功能是相對容易去實現的,但是今天我更新之前的專案的程式碼的時候出現了一個Android 7.0儲存圖片失敗的情況。因為不是本人開發的,我將程式碼從頭看起,看起來沒有程式碼寫的沒有錯誤呀!我就有點頭疼呀,到底是哪個環節沒有寫對呢?

上程式碼

private void saveImg() {
    if (TextUtils.isEmpty(bean.getData().getWeixinImgUrl())) {
        return;
    }
    if (!Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
        showToast("儲存失敗,沒有讀寫sd卡許可權");
    }
    String path = Environment.getExternalStorageDirectory().getAbsolutePath() 
    					+ "/" + getContext().getPackageName() + "/img/" + bean.getData().getWeixinName() + ".png";
    final File file = new File(path);
    executorService.execute(new Runnable() {
        @Override
        public void run() {
            try {
                OutputStream os = new FileOutputStream(file);

                URL url = new URL(bean.getData().getWeixinImgUrl());

                Bitmap bitmap = BitmapFactory.decodeStream(url.openStream());

                bitmap.compress(Bitmap.CompressFormat.PNG, 90, os);


                new Handler(Looper.getMainLooper()).post(new Runnable() {
                    @Override
                    public void run() {
                        Toast.makeText(getContext(), "圖片儲存到:" + file, Toast.LENGTH_LONG).show();
                        //傳送廣播給系統 告訴他多了張圖片  重新整理資料   這樣的話就能在相簿見到了
                        Uri uri = Uri.fromFile(file);
                        getContext().sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, uri));
                    }
                });
                os.flush();

                os.close();
            } catch (FileNotFoundException e) {
                Looper.prepare();
                showToast("儲存失敗");
                Looper.loop();
            } catch (MalformedURLException e) {
                Looper.prepare();
                showToast("儲存失敗");
                Looper.loop();
            } catch (IOException e) {
                Looper.prepare();
                showToast("儲存失敗");
                Looper.loop();
            }
        }
    });
}

解析問題以及解決方案

上面的程式碼看起來是沒有問題,但是在Android7.0以上的手機就是會儲存失敗。琢磨了很久,我終於發現了問題所在了:沒有用程式碼檢測儲存圖片的檔案是否存在,如果不存在的情況建立我們的儲存路徑的資料夾。加入這段程式碼就可以了

if (!file.getParentFile().exists()) {
    file.getParentFile().mkdirs();
}

完美解決問題。