在現在的手機都有高畫質的攝錄鏡頭的設備,所以,使用者也會常常拍照。因此,了解如何開發拍照並且儲存檔案的程式也是很重要的。
目前開發App,主要都是直接啟動系統的相機元件來執行拍照的工作。它的系統Action名稱變數是「android.media.action.IMAGE_CAPTURE」,使用這個Action名稱建立好的Intent物件,可以呼叫putExtra方法加入照片檔案儲存位置的設定資料,來儲存檔案。資料變數為「MediaStore.EXTRA_OUTPUT」,都可以來範例中看到如何用年月日時分秒的字串,來儲存成檔案名稱。
請在Android Studio 3.x版,新建一個專案。增加一個Empty Activity。再拉一個ImageView、一個TextView、一個Button等元件,順序來排列出來。如下圖所示:
在完成拉好畫面後,首先,要先加儲存到外部設備及使用照像機的權限,打開manifests目錄下的AndroidManifest.xml,加入下述網路權限,如下圖所示:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.CAMERA" />
設定好權限後,在程式的部份,主要就是先建立好的Intent物件,呼叫手機的照像機的元件,再設定要儲存檔案的地方,最後,再成功儲存成功後,就顯示出檔案的路徑及照出來的照片。完整的程式碼如下:
public class MainActivity extends AppCompatActivity {
public static final int CROP_PHOTO = 2;
private ImageView showImage;
//圖片路徑
private Uri imageUri;
//圖片名稱
private String filename;
private TextView lbl_imgpath;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
showImage = (ImageView) findViewById(R.id.imgpic);
lbl_imgpath = (TextView)findViewById(R.id.lblimgpath);
}
public void prc_camera(View v)
{
//圖片名稱,用時間格式(年月日時分秒)來命名,這樣的命名,就不會重覆的情況。
SimpleDateFormat format = new SimpleDateFormat("yyyyMMddHHmmss");
Date date = new Date(System.currentTimeMillis());
filename = format.format(date);
//建立File 對象用予存儲拍照的圖片SD卡根目錄,存儲至DCIM文件夾。
File path = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM);
File outputImage = new File(path,filename+".jpg");
try {
if(outputImage.exists()) {
outputImage.delete();
}
outputImage.createNewFile();
} catch(IOException e) {
e.printStackTrace();
}
//將File對像轉換為Uri並啟動照相程序
imageUri = Uri.fromFile(outputImage);
//啟動照相功能
Intent intent = new Intent("android.media.action.IMAGE_CAPTURE");
//指定圖片輸出地方。
intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
//拍完照startActivityForResult() 結果返回onActivityResult() 函數
startActivityForResult(intent,CROP_PHOTO);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode != RESULT_OK) {
Toast.makeText(MainActivity.this, "ActivityResult resultCode error", Toast.LENGTH_SHORT).show();
return;
}
switch(requestCode) {
case CROP_PHOTO:
try {
//圖片解析成Bitmap
Bitmap bitmap = BitmapFactory.decodeStream(
getContentResolver().openInputStream(imageUri));
//刷新DCIM文件夾,儲存檔案至DCIM文件夾。
Intent intentBcc = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
intentBcc.setData(imageUri);
this.sendBroadcast(intentBcc);
lbl_imgpath.setText(imageUri.toString());
//將照片顯示出來
showImage.setImageBitmap(bitmap);
} catch(FileNotFoundException e) {
e.printStackTrace();
}
break;
default:
break;
}
}
}
完成好程式,因為手機的模擬器,無法模擬照像機。所以,要佈置到實體的手機上,來測試。