在開發Android相機應用時,處理照片檔案是必經的過程,首先要面對的相片儲存的位置,依應用程式的需求,可將照片儲存至外部的SDCard裡,或是內部的記憶體(內存)中,這兩種儲存位置的做法不太相同,分別介紹兩種方法。
儲存至內部記憶體(內存):
以下程式碼是將照片以.JPG檔的形式儲存至內部記憶體中。
PictureCallback camJpegCallback = new PictureCallback() {
public void onPictureTaken(byte[] data, Camera camera) {
// 用來接收壓縮成jpeg格式的影像資料
FileOutputStream outStream = null;
try {
//儲存在內部記憶體
Bitmap bm =BitmapFactory.decodeByteArray(data, 0, data.length);
outStream = openFileOutput("photo.jpg", Context.MODE_PRIVATE);
bm.compress(CompressFormat.JPEG, 80, outStream);
outStream.flush();
outStream.close();
Toast.makeText(PKActivity.this, "存檔完成!", Toast.LENGTH_SHORT)
.show();
Intent intent=new Intent();
intent.setClass(PKActivity.this, PK_ResultActivity.class);
startActivity(intent);
PKActivity.this.finish();
} catch (IOException e) {
Toast.makeText(PKActivity.this, "影像檔儲存錯誤!", Toast.LENGTH_SHORT)
.show();
}
程式說明:
Bitmap bm =BitmapFactory.decodeByteArray(data, 0, data.length);
將char[] 轉換成Bitmap 的形式。
FileOutputStream outStream = openFileOutput("FileName",MODE_WORLD_READABLE);
使用openFileOutput來建立FileOutputStream 。
FileName只要檔名即可,不用完整路徑。
Context.MODE_PRIVATE:代表該檔是私有資料,只能被APP本身存取。如果檔案已存在,會覆蓋原檔。 Context.MODE_APPEND:會檢查檔案是否存在,檔案存在會將內容新增檔案內;如檔案不存在就建立新檔。 Context.MODE_WORLD_READABLE:其它應用程式也可以讀取。如果要在APP中使用 intent.ACTION_SEND,要使用此模式。
Context.MODE_WORLD_WRITEABLE:其它應用程式也可以寫入此檔。 Context.MODE_PRIVATE:代表該檔是私有資料,只能被APP本身存取。如果檔案已存在,會覆蓋原檔。
Context.MODE_APPEND:會檢查檔案是否存在,檔案存在會將內容新增檔案內;如檔案不存在就建立新檔。 Context.MODE_WORLD_READABLE:其它應用程式也可以讀取。如果要在APP中使用 intent.ACTION_SEND,要使用此模式。
Context.MODE_WORLD_WRITEABLE:其它應用程式也可以寫入此檔。
Context.MODE_APPEND:會檢查檔案是否存在,檔案存在會將內容新增檔案內;如檔案不存在就建立新檔。 Context.MODE_WORLD_READABLE:其它應用程式也可以讀取。如果要在APP中使用 intent.ACTION_SEND,要使用此模式。
Context.MODE_WORLD_WRITEABLE:其它應用程式也可以寫入此檔。 Context.MODE_WORLD_READABLE:其它應用程式也可以讀取。如果要在APP中使用 intent.ACTION_SEND,要使用此模式。
Context.MODE_WORLD_WRITEABLE:其它應用程式也可以寫入此檔。 Context.MODE_WORLD_WRITEABLE:其它應用程式也可以寫入此檔。
bm.compress(CompressFormat.JPEG, 80, outStream);
將Bitnap以80%的壓縮存成JPG檔,用FileOutputStream 方式存入。
儲存至SD卡
PictureCallback camJpegCallback = new PictureCallback() {
public void onPictureTaken(byte[] data, Camera camera) {
// 用來接收壓縮成jpeg格式的影像資料
FileOutputStream outStream = null;
try {
//儲存在外部SD
outStream = new FileOutputStream("/sdcard/photo.jpg");
outStream.write(data);
outStream.close();
Toast.makeText(PKActivity.this, "存檔完成!", Toast.LENGTH_SHORT)
.show();
Intent intent=new Intent();
intent.setClass(PKActivity.this, PK_ResultActivity.class);
startActivity(intent);
PKActivity.this.finish();
} catch (IOException e) {
Toast.makeText(PKActivity.this, "影像檔儲存錯誤!", Toast.LENGTH_SHORT)
.show();
}