[Android] 從相機拿照片的方式

身為一個十分業餘的 android 開發者,這種秘技實在太多啦 :~~

這篇只是記錄一下自己實驗的結果,不太確定是不是最正規的作法。

如果你要設計一個功能,是讓使用者可以立刻去拍個照片再拿到相片內容,這時候就要利用 Intent 來作:

[code lang="java"]...
// 將畫面換到 Camera 拍照模式
Intent takeIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(takeIntent, REQ_TAKE_PICTURE);

...
// 當拍完照後,按下 OK 返回原來的 activity
@Override
protected void onActivityForResult(int requestCode, int resultCode, Intent data) {
super.onActivityForResult(requestCode, resultCode, data);

if (resultCode == RESULT_OK) {
switch (requestCode) {
case REQ_TAKE_PICTURE:
Bitmap bitmap = (Bitmap) data.getExtras().getParcelable("data");
....
}
}
}
[/code]

這樣作就可以拿到剛拍好,且縮圖過的照片。如果你想要拿到大張的圖片,將上面的程式碼稍作修改一下:
[code lang="java"]
Uri outputFileUri;
// 將畫面換到 Camera 拍照模式
Intent takeIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
// 產生 tmp file,記得程式要有 android.permission.WRITE_EXTERNAL_STORAGE 的權限
File tmpFile = new File(
Environment.getExternalStorageDirectory(),
System.currentTimeMillis() + ".jpg");
outputFileUri = Uri.fromFile(tmpFile);
takeIntent.putExtra(MediaStore.EXTRA_OUTPUT, outputFileUri);
startActivityForResult(takeIntent, REQ_TAKE_PICTURE);

.....
// onActivityForResult
case REQ_TAKE_PICTURE:
if (data == null) {
String filePath = outputFileUri.getPath();
....
}
[/code]

這個方法要注意的是要找時機將 tmp file 給刪掉 XD

  • 真是讚! 網上找半天~ 就你這邊講的最清楚!

  • Amanda7227

    請問您:
    用Intent takeIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE)
    的方法,拍完照後都會有一個完成的選項給我選,請問有辦法不讓他出現嗎?謝謝!

  • Amanda7227

    不好意思,可以再請教一下…您有遇到使用以上方法會同時在DCIM中存檔嗎?謝謝!

  • Lin

    我测试运行到这里 String filePath = outputFileUri.getPath(); 就会出错, 提示:  java.lang.NullPointerException , 请问如何解决? 谢谢.