Android相机 - 将图像保存到SD卡中的新文件夹中

时间:2011-12-21 11:07:26

标签: android android-camera

我有一个非常简单的APP,此刻拍摄照片然后保存图像。目前的问题是,由于某种原因,我找不到图像保存在手机上的位置。

我想要做的最终结果是拍摄照片然后被保存到SD卡上创建的新文件夹中,但如果该文件夹尚未存在则必须是在保存图像之前(自动)制作。

我尝试使用答案in this question但似乎无法在没有收到错误imageIntent cannot be resolved

的情况下使用它

编辑:图片现在保存到SD卡并创建文件夹但覆盖了以前的图像我需要它来保存多个图像(如果有任何建议代码已更新)

这是我的代码片段:

PictureCallback myPictureCallback_JPG = new PictureCallback(){

    public void onPictureTaken(byte[] arg0, Camera arg1) {
        // TODO Auto-generated method stub
        /*Bitmap bitmapPicture 
            = BitmapFactory.decodeByteArray(arg0, 0, arg0.length);  */


        int imageNum = 0;
        Intent imageIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
        File imagesFolder = new File(Environment.getExternalStorageDirectory(), "Punch");
        imagesFolder.mkdirs(); // <----
        String fileName = "image_" + String.valueOf(imageNum) + ".jpg";
        File output = new File(imagesFolder, fileName);
        while (output.exists()){
            imageNum++;
            fileName = "image_" + String.valueOf(imageNum) + ".jpg";
            output = new File(imagesFolder, fileName);
        }
        Uri uriSavedImage = Uri.fromFile(image);
        imageIntent.putExtra(MediaStore.EXTRA_OUTPUT, uriSavedImage);


        OutputStream imageFileOS;
        try {
            imageFileOS = getContentResolver().openOutputStream(uriSavedImage);
            imageFileOS.write(arg0);
            imageFileOS.flush();
            imageFileOS.close();

            Toast.makeText(AndroidCamera.this, 
                    "Image saved: ", 
                    Toast.LENGTH_LONG).show();

        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        camera.startPreview();
    }};

修改

代码已更新,现在将多个图像保存在SD卡上创建的新文件夹中。

3 个答案:

答案 0 :(得分:4)

我纯粹 GUESSING 您忘记了链接到的问题部分的必要代码。

问题在最上面有以下几行:

Intent imageIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);

如果您刚刚从答案中复制了代码,那么您将遇到该错误,因为答案中的代码不包含imageIntent的实例化。

如果您需要更进一步或者我完全错了,请告诉我。

更新(关于图像被覆盖):

您当前正在使用"image_001.jpg"作为表示图像名称的字符串。 在班级int imageNum = 0;中设置变量 然后,您需要使用while循环并增加图像编号 - 或者您可以根据时间为图像创建不同的名称 - 这是另一种方法。

String fileName = "image_" + String.valueOf(imageNum) + ".jpg";
File output = new File(imagesFolder, fileName);
while (output.exists()){
    imageNum++;
    fileName = "image_" + String.valueOf(imageNum) + ".jpg";
    output = new File(imagesFolder, fileName);
}
//now save the file to the sdcard using output as the file

以上代码 - 虽然未经过个人测试 - 应该有效。

答案 1 :(得分:3)

try {

   super.onCreate(savedInstanceState);
   File root = new File(Environment.getExternalStorageDirectory()
     + File.separator + "Your Floder Name"+ File.separator);
   root.mkdirs();
   sdImageMainDirectory = new File(root, "myPicName.jpg");
    outputFileUri = Uri.fromFile(sdImageMainDirectory);
   startCameraActivity();
  } catch (Exception e) {

   Toast.makeText(this, "Error occured. Please try again later.",
     Toast.LENGTH_SHORT).show();
   finish();
  }

 }

 protected void startCameraActivity() {



  Intent cameraIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
  cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, outputFileUri);
  startActivityForResult(cameraIntent, 101);


 }

 @Override
 protected void onActivityResult(int requestCode, int resultCode, Intent data) {
  super.onActivityResult(requestCode, resultCode, data);

  if(requestCode==101 && resultCode==-1)
  {
   try
   {
    Uri outputFileUri= data.getData();
    selectedImagePath=getPath(outputFileUri);


   }
   catch(Exception ex)
   {
    Log.v("OnCameraCallBack",ex.getMessage());


   }
  }

答案 2 :(得分:2)

您可以保存多张图片。每次捕捉照片时,你都会犯一个错误,文件夹会一次又一次地重新创建。

所以你必须检查文件夹是否已经存在。你只需要添加一行代码

if (!imagesFolder.exists()) {
imagesFolder.mkdirs();
}
else { //do nothing}