Android Camera - Сохранить изображение в новую папку на SD-карте - PullRequest
4 голосов
/ 21 декабря 2011

У меня есть очень простое приложение, которое в данный момент делает снимок, а затем сохраняет изображение. На данный момент проблема в том, что по какой-то причине я не могу найти, куда изображение сохраняется в телефоне.

Окончательный результат того, что я пытаюсь сделать, - это когда снимок сделан, изображение затем сохраняется в новую папку, созданную на SD-карте, но если папка еще не существует, она должна быть сделано (автоматически) перед сохранением изображения.

Я пытался использовать ответ в этом вопросе , но, похоже, не могу его воплотить, не получив сообщение об ошибке 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();
    }};

EDIT

Код был обновлен для сохранения нескольких изображений в новой папке, созданной на SD-карте.

Ответы [ 3 ]

4 голосов
/ 21 декабря 2011

Я просто Угадаю Вы забыли необходимый код из части вопроса, на которую вы ссылались.

Вопрос имеет следующую строку в самом верху:

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

Приведенный выше код - хотя и не тестировался лично - должен работать.

3 голосов
/ 21 декабря 2011
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 голосов
/ 04 августа 2012

Вы можете сохранить несколько изображений. вы делали одну ошибку каждый раз, когда снимаете фотографию, папка воссоздается снова и снова.

, поэтому вы должны проверить, существует ли папка или нет. Вы должны добавить только одну строку кода

if (!imagesFolder.exists()) {
imagesFolder.mkdirs();
}
else { //do nothing}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...