Android開發——Android 7.0以上出現儲存圖片失敗的問題
阿新 • • 發佈:2018-11-09
前言
在日常的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();
}
完美解決問題。