一、設定權限
<manifest ... >
<uses-feature android:name="android.hardware.camera" />
...
</manifest>
如果也要限制有相機的手機才能下載這個 App ,
則改寫成下面這樣:
<manifest ... >
<uses-feature android:name="android.hardware.camera"
android:required="true" />
...
</manifest>
二、照相
宣告一個全域變數private static final int REQUEST_IMAGE_CAPTURE = 1;
1. 將相片存放在預設的地方
加入下面的 functionprivate void dispatchTakePictureIntent() {
Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
if (takePictureIntent.resolveActivity(getPackageManager()) != null) {
startActivityForResult(takePictureIntent, REQUEST_IMAGE_CAPTURE);
}
}
第四行判斷有沒有照相機 App ,如果有才跳過去。
使用的時候呼叫:
dispatchTakePictureIntent();
2. 將相片存放至特定資料夾
要使用預設以外的空間,要再加上下面的權限<manifest ...>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"
android:maxSdkVersion="18" />
...
</manifest>
加入下面的 functions
private String mCurrentPhotoPath;
private File createImageFile() throws IOException {
// 設定相片名稱,在這裡是用「JPEG_」加上當下的時間
// 注意:要設定為不會重複的名稱
String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
String imageFileName = "JPEG_" + timeStamp + "_";
// 存放到 Picture 資料夾下屬於這個 App 的公開空間
File storageDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES);
File image = File.createTempFile(
imageFileName, /* 檔名 */
".jpg", /* 副檔名 */
storageDir /* 要存放的資料夾 */
);
// 把檔案路徑加上「file:」存下來,之後使用 ACTION_VIEW intents 時用
mCurrentPhotoPath = "file:" + image.getAbsolutePath();
return image;
}
private void dispatchTakePictureIntent() {
Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
// 判斷有沒有照相機 App
if (takePictureIntent.resolveActivity(getPackageManager()) != null) {
// 用上面那個 function 建立存放相片的檔案
File photoFile = null;
try {
photoFile = createImageFile();
} catch (IOException ex) {
// Error occurred while creating the File
...
}
// 判斷檔案有沒有新建成功
if (photoFile != null) {
takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(photoFile));
startActivityForResult(takePictureIntent, REQUEST_IMAGE_CAPTURE);
}
}
}
// 上面存完照片到自訂的資料夾,並不會在相簿中顯示
// 所以要做下面這個 function 讓相片顯示在相簿中
// 如果不需要顯示,則可以省略
private void galleryAddPic() {
Intent mediaScanIntent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
File f = new File(mCurrentPhotoPath);
Uri contentUri = Uri.fromFile(f);
mediaScanIntent.setData(contentUri);
this.sendBroadcast(mediaScanIntent);
}
使用的時候呼叫:
dispatchTakePictureIntent(); galleryAddPic();
三、顯示相片或將相片資料拿回處理
加入下面的 function@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == REQUEST_IMAGE_CAPTURE && resultCode == RESULT_OK) {
Bundle extras = data.getExtras();
Bitmap imageBitmap = (Bitmap) extras.get("data");
// 下面可以做任何要做的處理,這邊是顯示到一個 ImageView
mImageView.setImageBitmap(imageBitmap);
}
}
這邊的 mImageView 是在其他地方已經設置過的 view,
無論是
ImageView mImageView = (ImageView) findViewById(R.id.photo);或是
ImageView mImageView = new ImageView();皆可。
沒有留言:
張貼留言