文件保存问题到公共存储目录

时间:2018-04-20 15:05:07

标签: java android file save

我正在努力解决文件保存问题。

我有2个功能:

  1. 拍摄照片并保存图片
  2. 将图片添加到图库
  3. 对于第一部分(文件保存),我使用

         ByteArrayOutputStream stream = new ByteArrayOutputStream();
        bitmap.compress(Bitmap.CompressFormat.JPEG, 90, stream);
        byte[] byteArray = stream.toByteArray();
        final File file = new File(getAlbumStorageDir(context, Settings.ALBUM),
                Settings.FILENAME_PREFIX + id +  + ".jpg");
        return saveDataToFile(byteArray , file);//writes bytes to file
    
        public static File getAlbumStorageDir(Context context, String albumName) {
        // Get the directory for the app's private pictures directory.
        File file = new File(context.getExternalFilesDir(
                Environment.DIRECTORY_PICTURES), albumName);
        if (!file.mkdirs()) {
            Log.e("LOG_TAG", "Directory not created");
        }
        return file;
    }
    

    对于第二部分,我正在将文件从1复制到公共存储目录并使其在库中可用

    File storageDir = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES), Settings.CAMERA_IMAGES_DIR + "/");
        if (!storageDir.exists())
            storageDir.mkdir();
        File copyFile = new File(storageDir, fileToCopy.getName());
        try {
            copyFile.createNewFile();
            copy(fileToCopy, copyFile);// writes bytes from one file to another
            Uri finalUri = Uri.fromFile(copyFile);
            galleryAddPic(finalUri, context);
        } catch (java.io.IOException e) {
            Crashlytics.logException(e);
    
        }
    
    
    public static void galleryAddPic(Uri contentUri, Context context) {
        Intent mediaScanIntent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, contentUri);
        context.sendBroadcast(mediaScanIntent);
    }
    

    在我的情况下和大多数其他情况下,这样可以正常工作 但是有些用户收到以下错误:

    Caused by java.io.IOException: open failed: ENOENT (No such file or directory)
       at java.io.File.createNewFile(File.java:942)
       at com.testapp.utils.Utils.copyImageFile(Utils.java:311)
       at com.testapp.utils.Utils.savePhoto(Utils.java:420)
       at com.testapp.fragments.PictureListFragment$3$4.onAction(PictureListFragment.java:297)
       at com.testapp.views.PictureOverlayView$5.onClick(PictureOverlayView.java:145)
       at android.view.View.performClick(View.java:5721)
       at android.view.View$PerformClick.run(View.java:22620)
       at android.os.Handler.handleCallback(Handler.java:739)
       at android.os.Handler.dispatchMessage(Handler.java:95)
       at android.os.Looper.loop(Looper.java:148)
       at android.app.ActivityThread.main(ActivityThread.java:7406)
       at java.lang.reflect.Method.invoke(Method.java)
       at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230)
       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120)
    

    我检查过,这些用户已经写了外部许可 在这些情况下,StorageDir看起来像/ storage / emulated / 0 / Pictures / album。 storageDir.mkdir()返回false,该目录不存在。 问题出现在此步骤中:

    copyFile.createNewFile();
    

    我会感激任何帮助和建议。

1 个答案:

答案 0 :(得分:0)

从您的代码中,您尝试将文件存储在外部存储中。看来经验丰富的用户没有SD卡。