Android中调用拍照的工具类
引言
在Android应用开发中,我们经常需要使用拍照功能来获取照片。通常情况下,我们会在多个地方使用这个功能,为了避免重复编写相同的代码,我们可以将其封装成一个工具类。本文将介绍如何将Android中调用拍照的功能封装成一个工具类,并给出相应的代码示例。
设计思路
为了更好地理解如何将拍照功能封装成一个工具类,我们先来分析一下这个功能的流程:
- 打开相机应用
- 拍摄照片
- 返回照片数据
- 处理照片数据
根据上述流程,我们可以将拍照功能封装成一个工具类,提供一个公共方法供外部调用。在这个方法中,我们会打开相机应用,监听相机应用返回的结果,并将照片数据传递给外部进行处理。
工具类的设计
根据上述设计思路,我们可以创建一个名为CameraUtils
的工具类,具体的代码如下所示:
public class CameraUtils {
private static final int REQUEST_CODE_CAMERA = 1001;
private Activity mActivity;
private Uri mImageUri;
private OnPhotoCaptureListener mListener;
public CameraUtils(Activity activity) {
mActivity = activity;
}
public void takePhoto(OnPhotoCaptureListener listener) {
mListener = listener;
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
if (intent.resolveActivity(mActivity.getPackageManager()) != null) {
File photoFile = createImageFile();
if (photoFile != null) {
mImageUri = FileProvider.getUriForFile(mActivity,
mActivity.getPackageName() + ".fileprovider", photoFile);
intent.putExtra(MediaStore.EXTRA_OUTPUT, mImageUri);
mActivity.startActivityForResult(intent, REQUEST_CODE_CAMERA);
}
}
}
private File createImageFile() {
File storageDir = mActivity.getExternalFilesDir(Environment.DIRECTORY_PICTURES);
String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss", Locale.getDefault()).format(new Date());
String imageFileName = "JPEG_" + timeStamp + "_";
try {
return File.createTempFile(imageFileName, ".jpg", storageDir);
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
public void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == REQUEST_CODE_CAMERA && resultCode == Activity.RESULT_OK) {
if (mListener != null) {
mListener.onPhotoCaptured(mImageUri);
}
}
}
public interface OnPhotoCaptureListener {
void onPhotoCaptured(Uri imageUri);
}
}
在上述代码中,我们定义了一个名为CameraUtils
的类,并提供了一个名为takePhoto
的公共方法。该方法接受一个实现了OnPhotoCaptureListener
接口的监听器作为参数,用于接收拍照后的照片数据。
在takePhoto
方法中,我们创建了一个ACTION_IMAGE_CAPTURE
的Intent
,并调用startActivityForResult
方法启动相机应用。同时,我们还创建了一个临时文件来保存拍摄的照片,并通过FileProvider
获取该文件的Uri
。最后,我们通过startActivityForResult
方法启动相机应用,并传递了该Uri
作为参数。
在onActivityResult
方法中,我们通过判断返回的请求码和结果码,来确定是否成功拍摄了照片。如果成功拍摄了照片,我们就通过之前定义的监听器将照片的Uri
传递给外部。
使用工具类
使用我们封装好的工具类很简单,只需要在需要调用拍照的地方创建一个CameraUtils
的实例,并调用其takePhoto
方法即可。同时,我们还需要实现OnPhotoCaptureListener
接口,用于处理拍照后的照片数据。
下面是一个使用示例:
public class MainActivity extends AppCompatActivity implements CameraUtils.OnPhotoCaptureListener {
private ImageView mImageView;
private CameraUtils mCameraUtils;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mImageView = findViewById(R.id.image_view);
mCameraUtils = new CameraUtils(this);
Button takePhotoButton = findViewById(R.id.take_photo_button);
takePhoto