Android调用摄像头拍照的使用
- 权限申请:
- 在AndroidManifest.xml文件中添加摄像头使用权限:
<uses-permission android:name="android.permission.CAMERA"/> - 如果需要存储图片,还需要添加文件读写权限:
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> - 注意:在Android 6.0及以上版本,需要动态申请权限。
- 在AndroidManifest.xml文件中添加摄像头使用权限:
- 打开摄像头:
- 通过设置Intent来实现,指定Action为
MediaStore.ACTION_IMAGE_CAPTURE。 - 如果需要处理拍照后的数据,可以使用
startActivityForResult()方法启动相机。
- 通过设置Intent来实现,指定Action为
- 拍照后传回数据处理:
- 在
onActivityResult()方法中处理返回的Intent,从中获取拍照后的图片数据。 - 可以使用
data.getData()方法获取图片的Uri,然后使用图片加载库(如Glide)加载并显示图片。
- 在
- 存储图片:
- 在Android 7.0(API级别24)及以上版本,由于安全性的考虑,不再允许直接使用
file://URI。因此,需要使用FileProvider来共享文件。 - 在AndroidManifest.xml中定义
FileProvider,并配置相应的<meta-data>标签。 - 创建一个File对象来存储拍照后的图片,并使用
FileProvider.getUriForFile()方法获取该文件的Uri。
- 在Android 7.0(API级别24)及以上版本,由于安全性的考虑,不再允许直接使用
- 代码实现:
首先,确保在
AndroidManifest.xml中添加了必要的权限:<uses-permission android:name="android.permission.CAMERA" /><uses-feature android:name="android.hardware.camera" /><uses-feature android:name="android.hardware.camera.autofocus" /><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /><uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />在
Activity中:import android.Manifest;import android.content.ContentValues;import android.content.Intent;import android.content.pm.PackageManager;import android.graphics.Bitmap;import android.net.Uri;import android.os.Build;import android.os.Bundle;import android.os.Environment;import android.provider.MediaStore;import androidx.annotation.NonNull;import androidx.annotation.Nullable;import androidx.appcompat.app.AppCompatActivity;import androidx.core.app.ActivityCompat;import androidx.core.content.ContextCompat;import java.io.File;import java.io.IOException;public class CameraActivity extends AppCompatActivity {private static final int REQUEST_CAMERA_PERMISSION = 1;private static final int REQUEST_IMAGE_CAPTURE = 2;@Overrideprotected void onCreate(@Nullable Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_camera);if (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA)!= PackageManager.PERMISSION_GRANTED) {ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CAMERA},REQUEST_CAMERA_PERMISSION);} else {dispatchTakePictureIntent();}}@Overridepublic void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions,@NonNull int[] grantResults) {if (requestCode == REQUEST_CAMERA_PERMISSION) {if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {dispatchTakePictureIntent();}}}private void dispatchTakePictureIntent() {Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);// Ensure that there's a camera activity to handle the intentif (takePictureIntent.resolveActivity(getPackageManager()) != null) {// Create the File where the photo should goFile photoFile = null;try {photoFile = createImageFile();} catch (IOException ex) {// Error occurred while creating the File}// Continue only if the File was successfully createdif (photoFile != null) {Uri photoURI = FileProvider.getUriForFile(this,"com.example.android.fileprovider",photoFile);takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, photoURI);startActivityForResult(takePictureIntent, REQUEST_IMAGE_CAPTURE);}}}private File createImageFile() throws IOException {// Create an image file nameString timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());String imageFileName = "JPEG_" + timeStamp + "_";File storageDir = getExternalFilesDir(Environment.DIRECTORY_PICTURES);File image = File.createTempFile(imageFileName, /* prefix */".jpg", /* suffix */storageDir /* directory */);// Save a file: path for use with ACTION_VIEW intentsCurrentPhotoPath = image.getAbsolutePath();return image;}@Overrideprotected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {if (requestCode == REQUEST_IMAGE_CAPTURE && resultCode == RESULT_OK) {// Handle the image here (e.g., display it in an ImageView)// You can access the image file at CurrentPhotoPath}}// Other necessary methods and variables
从相册中选择图片的使用
- 权限申请:
- 与调用摄像头拍照相同,需要添加文件读写权限。
- 打开相册:
- 通过设置Intent来实现,指定Action为
Intent.ACTION_PICK,并使用setDataAndType()方法设置数据类型为图片。 - 同样,使用
startActivityForResult()方法启动相册。
- 通过设置Intent来实现,指定Action为
- 选择图片后处理:
- 在
onActivityResult()方法中处理返回的Intent,从中获取用户选择的图片Uri。 - 使用图片加载库加载并显示图片。
- 在
- 代码实现
要在Android应用中实现从相册中选择图片的功能,你需要使用
Intent.ACTION_GET_CONTENT。以下是如何实现这一功能的代码示例:import android.content.Intent;import android.database.Cursor;import android.graphics.Bitmap;import android.net.Uri;import android.os.Bundle;import android.provider.MediaStore;import androidx.annotation.Nullable;import androidx.appcompat.app.AppCompatActivity;import androidx.core.content.FileProvider;public class AlbumActivity extends AppCompatActivity {private static final int REQUEST_SELECT_IMAGE = 3;@Overrideprotected void onCreate(@Nullable Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_album);// 启动相册选择图片Intent intent = new Intent(Intent.ACTION_GET_CONTENT);intent.setType("image/*");if (intent.resolveActivity(getPackageManager()) != null) {startActivityForResult(intent, REQUEST_SELECT_IMAGE);}}@Overrideprotected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {super.onActivityResult(requestCode, resultCode, data);if (requestCode == REQUEST_SELECT_IMAGE && resultCode == RESULT_OK) {if (data != null) {Uri selectedImageUri = data.getData();// 这里可以根据Uri进行图片处理,比如加载到ImageView中// 注意:对于Android 10 (API 级别 29) 及更高版本,你可能需要处理Scoped Storage// 如果你需要获取Bitmap对象,可以这样做(但请注意,这可能会消耗大量内存)try {Bitmap bitmap = MediaStore.Images.Media.getBitmap(getContentResolver(), selectedImageUri);// 使用Bitmap对象} catch (IOException e) {e.printStackTrace();}}}}}
总结:
调用摄像头拍照和从相册中选择图片在Android中都是常见的功能。它们都需要申请相应的权限,并通过设置Intent来启动相应的Activity。对于拍照功能,还需要考虑图片的存储和Uri的获取;对于从相册选择图片,主要是处理用户选择的图片Uri。在实际开发中,可以结合使用这些功能,为用户提供更丰富的图片获取方式。