顯示選項對話框
private static final int REQUEST_CAMERA = 100;
private static final int REQUEST_GALLERY = 101;
private void showImageSourceDialog() {
String[] options = {"拍照", "從相簿選擇"};
new AlertDialog.Builder(this)
.setTitle("選擇圖片來源")
.setItems(options, (dialog, which) -> {
if (which == 0) launchCamera();
else launchGallery();
})
.show();
}
啟動相機
private void launchCamera() {
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
File photoFile = createImageFile(); // 建立暫存檔
if (photoFile != null) {
Uri photoUri = FileProvider.getUriForFile(this, getPackageName() + ".fileprovider", photoFile);
intent.putExtra(MediaStore.EXTRA_OUTPUT, photoUri);
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
startActivityForResult(intent, REQUEST_CAMERA);
}
}
private File createImageFile() throws IOException {
String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss", Locale.getDefault()).format(new Date());
File storageDir = getExternalFilesDir(Environment.DIRECTORY_PICTURES);
return File.createTempFile("IMG_" + timeStamp + "_", ".jpg", storageDir);
}
啟動相簿
private void launchGallery() {
Intent intent = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
intent.setType("image/*");
startActivityForResult(intent, REQUEST_GALLERY);
}
接收結果
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode != RESULT_OK) return;
Uri imageUri;
if (requestCode == REQUEST_CAMERA) {
imageUri = photoFileUri; // 需保存為成員變數
} else if (requestCode == REQUEST_GALLERY) {
imageUri = data.getData();
} else return;
// 使用 imageUri 載入圖片、上傳等
imageView.setImageURI(imageUri);
}
權限提醒
- Android 10+ (API 29) 讀取外部儲存無需權限(MediaStore)。
- 相機需
<uses-feature android:name="android.hardware.camera" android:required="true"/> 與執行時權限 CAMERA。