图像未保存在我的相机应用程序中

Images are not being saved in my camera app

我正在尝试制作一款可检测运动并在检测到运动时拍照的应用。当我不尝试将图片保存在目录(文件夹)中时,它正在保存图片。但是当我尝试使用目录时,即使成功创建了目录,也没有保存图片。 我应该对以下代码进行哪些更改才能使其正常工作:

 private void createDirectoryAndSaveFile(String name, Bitmap bitmap) {

        File folder = new File(Environment.getExternalStorageDirectory() +
            File.separator + "XYX APP");
             boolean success = true;
    if (!folder.exists()) {
        success = folder.mkdirs();
    }
        if (success) {
        // Do something on success

    } else {
        // Do something else on failure
    }

        File photo = new File(new File(Environment.getExternalStorageDirectory()+"XYZ APP/"), name+ ".jpg");
        if (photo.exists()) {
            photo.delete();
        }
        try {
            FileOutputStream out = new FileOutputStream(photo.getPath());
            bitmap.compress(Bitmap.CompressFormat.JPEG, 100, out);
            out.flush();
            out.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

注:文件名在以下指令中生成:

 String name = "MotDet_"+String.valueOf(System.currentTimeMillis());
            if (bitmap != null) createDirectoryAndSaveFile(name, bitmap);

更新 它适用于以下代码,但不适用于上面的代码:

    private void save(String name, Bitmap bitmap) {
        File photo = new File(Environment.getExternalStorageDirectory(), name + ".jpg");
        if (photo.exists()) photo.delete();

        try {
            FileOutputStream fos = new FileOutputStream(photo.getPath());
            bitmap.compress(Bitmap.CompressFormat.JPEG, 100, fos);
            fos.close();
        } catch (java.io.IOException e) {
            Log.e("PictureDemo", "Exception in photoCallback", e);
        }
    }

试试这个代码:

String partFilename = currentDateFormat();
storeCameraPhotoInSDCard(bp, partFilename);

private String currentDateFormat(){
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd_HH_mm_ss");
        String  currentTimeStamp = dateFormat.format(new Date());
        return currentTimeStamp;
    }

private void storeCameraPhotoInSDCard(Bitmap bitmap, String currentDate){
        File outputFile = new File(Environment.getExternalStorageDirectory(), "photo_" + currentDate + ".jpg");
        try {
            FileOutputStream fileOutputStream = new FileOutputStream(outputFile);
            bitmap.compress(Bitmap.CompressFormat.JPEG, 100, fileOutputStream);
            fileOutputStream.flush();
            fileOutputStream.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

这段代码适合我。将图像保存到目录。

您必须在 android 6.0 及以上的 运行 时间获得 permission 的外部存储才能写入 SDCard

阅读Run time Permission

加入manifest.xml

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

用下面的函数替换你的函数

private void createDirectoryAndSaveFile(String name, Bitmap bitmap) {

    File folder = new File(Environment.getExternalStorageDirectory() +
            File.separator + "XYZ APP");//here you have created different name
    boolean success = true;
    if (!folder.exists()) {
        success = folder.mkdirs();
    }
    if (success) {
        // Do something on success

    } else {
        // Do something else on failure
    }

    File photo = new File(folder.getAbsolutePath(), name+ ".jpg"); //use path of above created folder
    if (photo.exists()) {
        photo.delete();
    }
    try {
        FileOutputStream out = new FileOutputStream(photo.getPath());
        bitmap.compress(Bitmap.CompressFormat.JPEG, 100, out);
        out.flush();
        out.close();
    } catch (Exception e) {
        e.printStackTrace();
    }
}

首先你错过了 xyz 之前的 FileSeperator

 File photo = new File(folder.getAbsolutePath()+"/XYZ APP/"+ name+ ".jpg");

你的函数变成了

private void createDirectoryAndSaveFile(String name, Bitmap bitmap) {

File folder = new File(Environment.getExternalStorageDirectory() +
        File.separator + "XYZ APP");//here you have created different name
boolean success = true;
if (!folder.exists()) {
    success = folder.mkdirs();
}
if (success) {
    // Do something on success

} else {
    // Do something else on failure
}

File photo = new File(folder.getAbsolutePath(), name+ ".jpg"); 
if (photo.exists()) {
    photo.delete();
}
try {
    FileOutputStream out = new FileOutputStream(photo.getPath());
    bitmap.compress(Bitmap.CompressFormat.JPEG, 100, out);
    out.flush();
    out.close();
} catch (Exception e) {
    e.printStackTrace();
}

}

Marshmello 带有 RuntimePermissions 以便您将文件保存在外部目录中,您需要先请求权限,如下面的代码

public  boolean isStoragePermissionGranted() {
if (Build.VERSION.SDK_INT >= 23) {
    if (checkSelfPermission(android.Manifest.permission.WRITE_EXTERNAL_STORAGE)
            == PackageManager.PERMISSION_GRANTED) {
        Log.v(TAG,"Permission is granted");
        return true;
    } else {

        Log.v(TAG,"Permission is revoked");
        ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1);
        return false;
    }
}
else { //permission is automatically granted on sdk<23 upon installation
    Log.v(TAG,"Permission is granted");
    return true;
}

}

权限结果回调

@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
      super.onRequestPermissionsResult(requestCode, permissions, grantResults);
       if(grantResults[0]== PackageManager.PERMISSION_GRANTED){
          Log.v(TAG,"Permission: "+permissions[0]+ "was "+grantResults[0]);
          //resume tasks needing this permission
      }
   }

保存前调用 isStoragePermissionsGranted() 如果它 returns true 继续保存文件。