33

我遇到了捕獲圖像並將其從本機相機應用程序存儲的問題。這裏是我的一些代碼的示例。如何捕捉圖像並將其與本機Android相機進行存儲

_path = Environment.getExternalStorageDirectory() + "make_machine_example.jpg"; 
File file = new File(_path); 
Uri outputFileUri = Uri.fromFile(file); 

Intent intent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE); 
intent.putExtra(MediaStore.EXTRA_OUTPUT, outputFileUri); 

startActivityForResult(intent, 0); 

圖片已採取,我返回到我原來的活動,當我瀏覽到使用Android DDMS我的SD卡文件管理器的圖片是不存在了。任何人都知道爲什麼這不被保存?

+0

大家好,我想了Android的原生相機捕捉圖像並儲存起來..所以把我所造的賞金becoz它 – 2010-08-16 05:17:59

+0

困擾帕雷什捕捉圖像有什麼問題?這個問題中顯示的方法不適合你嗎? – Janusz 2010-08-16 07:36:46

+0

@Janusz我必須把一個文本視圖(活動名稱),一個按鈕(在底部)和屏幕中間,相機預覽是在那裏,並在按鈕點擊事件,照片應點擊和照片應顯示在另一個ImageView活動 – 2010-08-16 09:00:08

回答

20

您是否檢查過Environment.getExternalStorageDirectory()的輸出是什麼,因爲如果它不包含尾隨文件分隔符(/),那麼您的映像將最終位於不在SD卡中的目錄中,例如:

/mnt/sdcardmake_machine_example.jpg 

當你真正想要的是:

/mnt/sdcard/make_machine_example.jpg 

試試這個代碼,而不是:

_path = Environment.getExternalStorageDirectory() + File.separator + "make_machine_example.jpg"; 
+2

是的,我可以確認您需要添加文件分隔符 – 2010-08-17 10:13:49

14

1。只需使用

new File(Environment.getExternalStorageDirectory(), "make_machine_example.jpg"); 

並不打擾分隔符。

2。面臨同樣的問題。 SenseUI手機有一個不創建文件的自定義相機應用程序。你使用什麼設備?它可能已經在最新的設備中被修復,但它也可能是一個問題。所以這裏有一個完整的示例如何克服它Problems saving a photo to a file

25

這是任何人的情況下最終產品仍然是訪問的主題:

public class CameraCapture extends Activity { 

    protected boolean _taken = true; 
    File sdImageMainDirectory; 

    protected static final String PHOTO_TAKEN = "photo_taken"; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 

     try { 

      super.onCreate(savedInstanceState);   
        File root = new File(Environment 
          .getExternalStorageDirectory() 
          + File.separator + "myDir" + File.separator); 
        root.mkdirs(); 
        sdImageMainDirectory = new File(root, "myPicName"); 


       startCameraActivity(); 
      } 
     } catch (Exception e) { 
      finish(); 
      Toast.makeText(this, "Error occured. Please try again later.", 
        Toast.LENGTH_SHORT).show(); 
     } 

    } 

    protected void startCameraActivity() { 

     Uri outputFileUri = Uri.fromFile(sdImageMainDirectory); 

     Intent intent = new Intent("android.media.action.IMAGE_CAPTURE"); 
     intent.putExtra(MediaStore.EXTRA_OUTPUT, outputFileUri); 

     startActivityForResult(intent, 0); 
    } 

    @Override 
    protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
     switch (resultCode) { 
     case 0: 
      finish(); 
      break; 

     case -1: 

      try { 
       StoreImage(this, Uri.parse(data.toURI()), 
         sdImageMainDirectory); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 

      finish(); 
      startActivity(new Intent(CameraCapture.this, Home.class)); 

     } 

    } 

    @Override 
    protected void onRestoreInstanceState(Bundle savedInstanceState) { 
     if (savedInstanceState.getBoolean(CameraCapture.PHOTO_TAKEN)) { 
      _taken = true; 
     } 
    } 

    @Override 
    protected void onSaveInstanceState(Bundle outState) { 
     outState.putBoolean(CameraCapture.PHOTO_TAKEN, _taken); 
    } 

     public static void StoreImage(Context mContext, Uri imageLoc, File imageDir) { 
     Bitmap bm = null; 
     try { 
      bm = Media.getBitmap(mContext.getContentResolver(), imageLoc); 
      FileOutputStream out = new FileOutputStream(imageDir); 
      bm.compress(Bitmap.CompressFormat.JPEG, 100, out); 
      bm.recycle(); 
     } catch (FileNotFoundException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 

    } 

} 
+1

您是否需要在清單中設置額外的權限?我不能給我自己的名字保存到sd – Vincent 2011-04-14 07:19:10

+0

是的圖像文件是... <使用權限android:name =「android.permission.CAMERA」/> \t <使用權限android:name =「android。 permission.WRITE_EXTERNAL_STORAGE「/> – ninjasense 2011-04-14 15:19:43

+0

嗨忍者!!我可以知道,什麼是「Home.class」?其說創建一個類/枚舉等我是新的android編程。 – iankits 2011-10-22 00:44:39

-5

加入這一行到AndroidManifest.xml文件並刪除擴展make_machine_example:

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

它將開始捕捉照片並存儲到SD卡中。

+0

它不會存儲捕獲的圖像。 – 2015-02-09 10:53:13

1

你應該保存圖像後進行媒體掃描

sendBroadcast(new Intent(
      Intent.ACTION_MEDIA_MOUNTED, 
      Uri.parse("file://" + Environment.getExternalStorageDirectory()))); 
相關問題