Android拍照界面选择相册

引言

在现代的移动应用中,拍照功能是非常常见的需求之一。用户可以通过拍照来捕捉重要瞬间,并与其他人分享。同时,也有许多应用提供了选择相册中图片的功能,以便用户可以从相册中选择已有的照片进行操作。本文将介绍如何在Android应用中实现一个拍照界面,同时提供选择相册中照片的功能。

拍照功能的实现

Android提供了Camera类,可以用于实现拍照功能。下面是一个简单的示例代码,展示了如何在Android应用中打开相机,并拍摄照片。

public class MainActivity extends AppCompatActivity {
    private static final int REQUEST_IMAGE_CAPTURE = 1;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Button captureButton = findViewById(R.id.capture_button);
        captureButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                dispatchTakePictureIntent();
            }
        });
    }

    private void dispatchTakePictureIntent() {
        Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
        if (takePictureIntent.resolveActivity(getPackageManager()) != null) {
            startActivityForResult(takePictureIntent, REQUEST_IMAGE_CAPTURE);
        }
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode == REQUEST_IMAGE_CAPTURE && resultCode == RESULT_OK) {
            Bundle extras = data.getExtras();
            Bitmap imageBitmap = (Bitmap) extras.get("data");
            ImageView imageView = findViewById(R.id.image_view);
            imageView.setImageBitmap(imageBitmap);
        }
    }
}

上述代码中,我们首先在布局文件中添加了一个Button和一个ImageView,分别用于触发拍照功能和展示拍摄照片。在Activity的onCreate方法中,我们为Button设置了点击监听器。当用户点击Button时,我们调用dispatchTakePictureIntent方法打开相机应用。在该方法中,我们创建一个ACTION_IMAGE_CAPTURE的Intent,并通过startActivityForResult方法启动相机应用。这里的REQUEST_IMAGE_CAPTURE是一个自定义的请求码,用于标识拍照操作的返回结果。当相机应用返回结果时,我们在onActivityResult方法中获取拍摄的照片,并设置给ImageView展示出来。

选择相册中照片的功能实现

除了拍照功能,我们还希望用户能够在相册中选择已有的照片。Android提供了一个Intent.ACTION_PICK的Action,可以打开一个包含相册中照片的界面供用户选择。下面是一个示例代码,展示了如何在Android应用中打开相册并选择照片。

public class MainActivity extends AppCompatActivity {
    private static final int REQUEST_IMAGE_CAPTURE = 1;
    private static final int REQUEST_IMAGE_PICK = 2;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Button captureButton = findViewById(R.id.capture_button);
        Button pickButton = findViewById(R.id.pick_button);
        captureButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                dispatchTakePictureIntent();
            }
        });
        pickButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                dispatchPickPictureIntent();
            }
        });
    }

    private void dispatchTakePictureIntent() {
        Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
        if (takePictureIntent.resolveActivity(getPackageManager()) != null) {
            startActivityForResult(takePictureIntent, REQUEST_IMAGE_CAPTURE);
        }
    }

    private void dispatchPickPictureIntent() {
        Intent pickPictureIntent = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
        if (pickPictureIntent.resolveActivity(getPackageManager()) != null) {
            startActivityForResult(pickPictureIntent, REQUEST_IMAGE_PICK);
        }
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (resultCode == RESULT_OK) {
            if (requestCode == REQUEST_IMAGE_CAPTURE) {
                Bundle extras = data.getExtras();
                Bitmap imageBitmap = (Bitmap) extras.get("data");
                ImageView imageView = findViewById(R.id.image_view);
                imageView.setImageBitmap(imageBitmap);
            } else if (requestCode == REQUEST_IMAGE_PICK) {
                Uri selectedImageUri = data.getData();
                ImageView imageView = findViewById(R.id.image_view);
                imageView.setImageURI(selectedImageUri);
            }
        }