Android多媒体之调用摄像头和相册

Android调用摄像头拍照的使用

  1. 权限申请
    • 在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及以上版本,需要动态申请权限。
  2. 打开摄像头
    • 通过设置Intent来实现,指定Action为MediaStore.ACTION_IMAGE_CAPTURE
    • 如果需要处理拍照后的数据,可以使用startActivityForResult()方法启动相机。
  3. 拍照后传回数据处理
    • onActivityResult()方法中处理返回的Intent,从中获取拍照后的图片数据。
    • 可以使用data.getData()方法获取图片的Uri,然后使用图片加载库(如Glide)加载并显示图片。
  4. 存储图片
    • 在Android 7.0(API级别24)及以上版本,由于安全性的考虑,不再允许直接使用file://URI。因此,需要使用FileProvider来共享文件。
    • 在AndroidManifest.xml中定义FileProvider,并配置相应的<meta-data>标签。
    • 创建一个File对象来存储拍照后的图片,并使用FileProvider.getUriForFile()方法获取该文件的Uri。
  5. 代码实现:

    首先,确保在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;
    @Override
    protected 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();
    }
    }
    @Override
    public 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 intent
    if (takePictureIntent.resolveActivity(getPackageManager()) != null) {
    // Create the File where the photo should go
    File photoFile = null;
    try {
    photoFile = createImageFile();
    } catch (IOException ex) {
    // Error occurred while creating the File
    }
    // Continue only if the File was successfully created
    if (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 name
    String 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 intents
    CurrentPhotoPath = image.getAbsolutePath();
    return image;
    }
    @Override
    protected 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

从相册中选择图片的使用

  1. 权限申请
    • 与调用摄像头拍照相同,需要添加文件读写权限。
  2. 打开相册
    • 通过设置Intent来实现,指定Action为Intent.ACTION_PICK,并使用setDataAndType()方法设置数据类型为图片。
    • 同样,使用startActivityForResult()方法启动相册。
  3. 选择图片后处理
    • onActivityResult()方法中处理返回的Intent,从中获取用户选择的图片Uri。
    • 使用图片加载库加载并显示图片。
  4. 代码实现

    要在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;
    @Override
    protected 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);
    }
    }
    @Override
    protected 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。在实际开发中,可以结合使用这些功能,为用户提供更丰富的图片获取方式。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Android提供了方便的API来调用相册和摄像头。要调用相册,我们可以使用Intent来发送一个请求给系统,打开相册应用。我们可以指定MIME类型为"image/*"来限制用户只能选择图片文件。然后,我们可以在回调中处理用户选择的图片。这样,我们就可以在我们的应用中使用用户选择的图片了。 要调用摄像头,我们也可以使用Intent来发送一个请求给系统,打开相机应用。我们可以指定MIME类型为"image/*"来限制用户只能拍摄图片。然后,我们可以在回调中处理用户拍摄的图片。这样,我们就可以在我们的应用中使用用户拍摄的照片了。 调用相册和摄像头的代码示例如下: 调用相册: ```java Intent intent = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI); intent.setType("image/*"); startActivityForResult(intent, PICK_IMAGE_REQUEST_CODE); ``` 处理相册回调: ```java @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == PICK_IMAGE_REQUEST_CODE && resultCode == RESULT_OK && data != null) { Uri selectedImage = data.getData(); // 在这里处理用户选择的图片 } } ``` 调用摄像头: ```java Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); startActivityForResult(intent, CAPTURE_IMAGE_REQUEST_CODE); ``` 处理摄像头回调: ```java @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == CAPTURE_IMAGE_REQUEST_CODE && resultCode == RESULT_OK && data != null) { Bitmap photo = (Bitmap) data.getExtras().get("data"); // 在这里处理用户拍摄的照片 } } ``` 通过以上代码,我们可以很方便地调用相册和摄像头,并在我们的应用中使用用户选择的图片或拍摄的照片。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值