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

2024-06-03 23:20

本文主要是介绍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。在实际开发中,可以结合使用这些功能,为用户提供更丰富的图片获取方式。

这篇关于Android多媒体之调用摄像头和相册的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1028399

相关文章

Java中调用数据库存储过程的示例代码

《Java中调用数据库存储过程的示例代码》本文介绍Java通过JDBC调用数据库存储过程的方法,涵盖参数类型、执行步骤及数据库差异,需注意异常处理与资源管理,以优化性能并实现复杂业务逻辑,感兴趣的朋友... 目录一、存储过程概述二、Java调用存储过程的基本javascript步骤三、Java调用存储过程示

Python中Tensorflow无法调用GPU问题的解决方法

《Python中Tensorflow无法调用GPU问题的解决方法》文章详解如何解决TensorFlow在Windows无法识别GPU的问题,需降级至2.10版本,安装匹配CUDA11.2和cuDNN... 当用以下代码查看GPU数量时,gpuspython返回的是一个空列表,说明tensorflow没有找到

python如何调用java的jar包

《python如何调用java的jar包》这篇文章主要为大家详细介绍了python如何调用java的jar包,文中的示例代码简洁易懂,具有一定的借鉴价值,有需要的小伙伴可以参考一下... 目录一、安装包二、使用步骤三、代码演示四、自己写一个jar包五、打包步骤六、方法补充一、安装包pip3 install

Python如何将OpenCV摄像头视频流通过浏览器播放

《Python如何将OpenCV摄像头视频流通过浏览器播放》:本文主要介绍Python如何将OpenCV摄像头视频流通过浏览器播放的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完... 目录方法1:使用Flask + MJPEG流实现代码使用方法优点缺点方法2:使用WebSocket传输视

Android DataBinding 与 MVVM使用详解

《AndroidDataBinding与MVVM使用详解》本文介绍AndroidDataBinding库,其通过绑定UI组件与数据源实现自动更新,支持双向绑定和逻辑运算,减少模板代码,结合MV... 目录一、DataBinding 核心概念二、配置与基础使用1. 启用 DataBinding 2. 基础布局

Android ViewBinding使用流程

《AndroidViewBinding使用流程》AndroidViewBinding是Jetpack组件,替代findViewById,提供类型安全、空安全和编译时检查,代码简洁且性能优化,相比Da... 目录一、核心概念二、ViewBinding优点三、使用流程1. 启用 ViewBinding (模块级

java对接海康摄像头的完整步骤记录

《java对接海康摄像头的完整步骤记录》在Java中调用海康威视摄像头通常需要使用海康威视提供的SDK,下面这篇文章主要给大家介绍了关于java对接海康摄像头的完整步骤,文中通过代码介绍的非常详细,需... 目录一、开发环境准备二、实现Java调用设备接口(一)加载动态链接库(二)结构体、接口重定义1.类型

Java调用C#动态库的三种方法详解

《Java调用C#动态库的三种方法详解》在这个多语言编程的时代,Java和C#就像两位才华横溢的舞者,各自在不同的舞台上展现着独特的魅力,然而,当它们携手合作时,又会碰撞出怎样绚丽的火花呢?今天,我们... 目录方法1:C++/CLI搭建桥梁——Java ↔ C# 的“翻译官”步骤1:创建C#类库(.NET

Android学习总结之Java和kotlin区别超详细分析

《Android学习总结之Java和kotlin区别超详细分析》Java和Kotlin都是用于Android开发的编程语言,它们各自具有独特的特点和优势,:本文主要介绍Android学习总结之Ja... 目录一、空安全机制真题 1:Kotlin 如何解决 Java 的 NullPointerExceptio

C/C++和OpenCV实现调用摄像头

《C/C++和OpenCV实现调用摄像头》本文主要介绍了C/C++和OpenCV实现调用摄像头,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录准备工作1. 打开摄像头2. 读取视频帧3. 显示视频帧4. 释放资源5. 获取和设置摄像头属性