2011-12-21 76 views
4

我有一個非常簡單的APP,它目前拍攝一張照片然後保存圖像。目前的問題是,出於某種原因,我無法找到圖像保存在手機上的位置。Android相機 - 將圖像保存到SD卡中的新文件夾中

完成的結果與我想要做的是當一張圖片被拍攝的圖像然後被保存到一個新的文件夾,已在SD卡上創建,但如果該文件夾不存在,它將不得不在圖像可以保存之前進行(自動)。

我曾嘗試使用了答案in this question但似乎無法incoporate它沒有得到錯誤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卡上創建的新文件夾中。

+0

什麼是「形象」在'烏里uriSavedImage = Uri.fromFile(圖像);' – VikramV 2014-03-18 14:30:57

回答

2

您可以保存多個圖像。您每次捕捉照片時都會犯一個錯誤,該文件夾一次又一次地重新創建。

所以你必須檢查文件夾是否已經存在。你必須只添加一行代碼

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

我純粹是GUESSING您忘記了鏈接到問題部分的必要代碼。

問題已經在最高層下面一行:

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

如果你只是從答案複製代碼,那麼你將有一個錯誤,因爲在回答代碼不包含的實例imageIntent

讓我知道你是否需要更多的東西,或者我完全錯了。

UPDATE(關於圖像被覆蓋):

您正在用"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 

上面的代碼 - 雖然沒有親自測試 - 應該可以工作。

+0

感謝指出了這一點愚蠢的錯誤)。我剛剛更新了這個問題,如果你可以看看,現在每次換新的時候都會覆蓋這張圖片。 – Matt 2011-12-21 11:51:40

+0

更新,添加int imageNum = 0;現在一切正常。 – Matt 2011-12-22 10:58:33

+0

是的。我上面發佈的代碼應該替換當前正在用'File image = new File(imagesFolder,「image_001.jpg」);'創建文件的方式。在你的類體中(比如任何方法之外),你必須把'int imageNum = 0;',然後我上面發佈的代碼應該工作。如果這不能解決它,你會得到什麼錯誤? – Jakar 2011-12-22 11:01:50

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()); 


    } 
    } 
+0

感謝您的答案,但我已經更新了我的問題,我設法讓它保存到SD卡上的新文件夾 – Matt 2011-12-21 11:58:59

+0

這不適用於Android 4.4。 onActivityForResult的意圖爲空。 Android有什麼變化嗎? – user798719 2015-06-19 08:14:16