Hướng dẫn này trình bày cách mở ứng dụng Camera mặc định để chụp ảnh và nhận lại bitmap kết quả trong ứng dụng Android. Cách này dùng Intent ACTION_IMAGE_CAPTURE - đơn giản, không cần quản lý Camera API phức tạp.
Các bước thực hiện
Bước 1: Tạo dự án mới
Mở Android Studio, chọn File → New Project và điền thông tin cần thiết.
Bước 2: Layout (res/layout/activity_main.xml)
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="https://schemas.android.com/apk/res/android"
xmlns:tools="https://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
tools:context=".MainActivity">
<Button
android:id="@+id/button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textStyle="bold"
android:textSize="24sp"
android:text="Chụp ảnh"
android:layout_centerHorizontal="true"
android:layout_marginTop="25sp"/>
<ImageView
android:id="@+id/imageView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:scaleType="centerCrop"
android:layout_below="@id/button" />
</RelativeLayout>
Bước 3: Code MainActivity (src/MainActivity.java)
import android.Manifest;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.graphics.Bitmap;
import android.support.v4.app.ActivityCompat;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity {
Button btnTakePhoto;
ImageView imageView;
public static final int REQUEST_PERMISSION_CODE = 1;
public static final int REQUEST_IMAGE_CAPTURE = 7;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btnTakePhoto = findViewById(R.id.button);
imageView = findViewById(R.id.imageView);
enableRuntimePermission();
btnTakePhoto.setOnClickListener(v -> {
Intent intent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
// Kiểm tra có app xử lý intent không
if (intent.resolveActivity(getPackageManager()) != null) {
startActivityForResult(intent, REQUEST_IMAGE_CAPTURE);
} else {
Toast.makeText(this, "Không tìm thấy ứng dụng Camera", Toast.LENGTH_SHORT).show();
}
});
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == REQUEST_IMAGE_CAPTURE && resultCode == RESULT_OK) {
// Nhận bitmap thumbnail (độ phân giải thấp)
Bitmap bitmap = (Bitmap) data.getExtras().get("data");
imageView.setImageBitmap(bitmap);
}
}
private void enableRuntimePermission() {
if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.CAMERA)) {
Toast.makeText(this, "Quyền CAMERA cần thiết để chụp ảnh", Toast.LENGTH_LONG).show();
} else {
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CAMERA}, REQUEST_PERMISSION_CODE);
}
}
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (requestCode == REQUEST_PERMISSION_CODE) {
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
Toast.makeText(this, "Đã cấp quyền Camera", Toast.LENGTH_LONG).show();
} else {
Toast.makeText(this, "Quyền Camera bị từ chối", Toast.LENGTH_LONG).show();
}
}
}
}
Bước 4: Cấu hình Manifest (AndroidManifest.xml)
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="https://schemas.android.com/apk/res/android"
package="app.com.sample">
<uses-permission android:name="android.permission.CAMERA"/>
<!-- Khai báo feature camera (tùy chọn, để lọc thiết bị không có camera trên Play Store) -->
<uses-feature android:name="android.hardware.camera" android:required="true" />
<uses-feature android:name="android.hardware.camera.autofocus" android:required="false" />
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
Chạy ứng dụng
Kết nối thiết bị, nhấn Run. Nhấn nút "Chụp ảnh", cấp quyền Camera nếu yêu cầu, chụp ảnh - thumbnail sẽ hiển thị trong ImageView.

Lưu ý quan trọng và mở rộng
1. Chỉ nhận được Thumbnail (ảnh nhỏ)
Cách trên chỉ trả về bitmap nhỏ (thường ~160x120 hoặc tùy thiết bị) trong data.getExtras().get("data"). Để lấy ảnh độ phân giải đầy đủ:
- Tạo file tạm:
File photoFile = File.createTempFile("IMG_", ".jpg", getExternalFilesDir(Environment.DIRECTORY_PICTURES)) - Dùng
FileProviderđể lấy URI an toàn (bắt buộc từ Android 7.0+ / API 24+) - Truyền
intent.putExtra(MediaStore.EXTRA_OUTPUT, photoUri) - Sau khi chụp xong, load bitmap từ file đó
2. CameraX (Khuyến nghị cho dự án mới)
CameraX là thư viện Jetpack hiện đại, thống nhất hành vi trên mọi thiết bị, hỗ trợ:
- Use cases: Preview, ImageCapture, ImageAnalysis, VideoCapture
- Lifecycle-aware
- Extensions: HDR, Night, Bokeh, Face Retouch
// CameraX ImageCapture cơ bản
ImageCapture imageCapture = new ImageCapture.Builder()
.setTargetRotation(view.display.rotation)
.build();
imageCapture.takePicture(outputFileOptions, executor, callback);
3. Runtime Permission (Android 6.0+ / API 23+)
Code mẫu đã xử lý request permission tại runtime. Từ Android 10+, quyền CAMERA vẫn cần request nhưng không còn trong nhóm dangerous permissions (tuy vẫn cần thiết để dùng Camera).