2011-12-10

在 Android 裡呼叫相機

呼叫相機的 Intent action為 MediaStore.ACTION_IMAGE_CAPTURE,預設的照片存放位置為相機的預設位置,可以另外加上 MediaStore.EXTRA_OUTPUT 設定自訂的位置。

但是 API 裡卻說使用預設的位置只會產生小圖,自訂位置才能產生大圖,我發現回傳給 activity 的都是小圖(透過 Intent 取得的 Bitmap),可能是根據螢幕尺寸縮小的,但是去找原始的圖檔卻都是大圖,不知道是 API 有改,或者我預設的位置是在 SD 卡裡的關係。

main.xml
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent" >

    <ImageView
        android:id="@+id/iv"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent" />

    <Button
        android:id="@+id/btn"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:onClick="startCamera"
        android:text="開啟相機" />

</FrameLayout>
TakePhotoIntentActivity
public class TakePhotoIntentActivity extends Activity {

    private static final String TAG = "TakePhotoIntentActivity";
    private static final int REQ_CODE = 1;
    private ImageView iv;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        this.iv = (ImageView) this.findViewById(R.id.iv);
    }

    public void startCamera(View v) {
        Intent it = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
        // 自訂照片位置
        it.putExtra(MediaStore.EXTRA_OUTPUT, this.customizedFilePath());
        this.startActivityForResult(it, TakePhotoIntentActivity.REQ_CODE);
    }

    private Uri customizedFilePath() {
        String fileName = System.currentTimeMillis() + ".jpg";
        File sdDir = Environment.getExternalStorageDirectory();
        File theDir = new File(sdDir, "cw1210");
        if (!theDir.exists()) {
            theDir.mkdir();
        }
        File picFile = new File(theDir, fileName);
        Uri uri = Uri.fromFile(picFile);
        Log.d(TAG, "指定照片位置:" + uri.getPath());
        return uri;
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode != REQ_CODE) {
            Log.d(TAG, "不是拍照");
            return;
        }
        if (resultCode != RESULT_OK) {
            Log.e(TAG, "拍照失敗");
            return;
        }
        Bitmap bm = (Bitmap) data.getExtras().get("data");
        // 尺寸永遠是小號的 320:240
        // 但是存在相機或記憶卡裡的尺寸卻是大號的 2592:1944
        Log.d(TAG, "照片尺寸:" + bm.getWidth() + "/" + bm.getHeight());
        // this.iv.setImageBitmap(bm);
        Uri uri = data.getData();
        Log.d(TAG, "照片:" + uri.getPath());
        this.iv.setImageURI(uri);
    }
}

相關文章

沒有留言:

張貼留言