Android10以上版本调用相机拍照

这篇具有很好参考价值的文章主要介绍了Android10以上版本调用相机拍照。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1、拍照功能

界面

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >
    <Button
        android:id="@+id/takePhotoBtn"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Take Photo" />
    <ImageView
        android:id="@+id/imageView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal"
        android:contentDescription="图片" />
</LinearLayout>

逻辑处理

package com.jpc.cameraalbumtest

import android.app.Activity
import android.content.Intent
import android.graphics.Bitmap
import android.graphics.BitmapFactory
import android.graphics.Matrix
import android.media.ExifInterface
import android.net.Uri
import android.os.Build
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.provider.MediaStore
import android.widget.Button
import android.widget.ImageView
import androidx.core.content.FileProvider
import java.io.File

/**
 * 首先这里创建了一个File对象,用于存放摄像头拍下的图片,这里我们把图片命名为
 * output_image.jpg,并存放在手机SD卡的应用关联缓存目录下。什么叫作应用关联缓存目录
 * 呢?就是指SD卡中专门用于存放当前应用缓存数据的位置,调用getExternalCacheDir()
 * 方法可以得到这个目录,具体的路径是/sdcard/Android/data/<package name>/cache。
 * 那么为什么要使用应用关联缓存目录来存放图片呢?因为从Android 6.0系统开始,读写SD卡
 * 被列为了危险权限,如果将图片存放在SD卡的任何其他目录,都要进行运行时权限处理才行,
 * 而使用应用关联目录则可以跳过这一步。另外,从Android 10.0系统开始,公有的SD卡目录已
 * 经不再允许被应用程序直接访问了,而是要使用作用域存储才行
 */
class MainActivity : AppCompatActivity() {
    private val takePhoto = 1
    private lateinit var imageUri: Uri
    //private lateinit var outputImage: File
    // 为了解决outputImage为空的问题,这里将outputImage声明为可空类型
    private var outputImage: File ?= null
    private lateinit var imageView: ImageView
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val btnTakePhoto = findViewById<Button>(R.id.takePhotoBtn)
        imageView = findViewById(R.id.imageView)
        btnTakePhoto.setOnClickListener{
            // 创建File对象,用于存储拍照后的图片
            val outputImage = File(externalCacheDir, "output_image.jpg")
            if(outputImage.exists()){
                outputImage.delete()
            }
            outputImage.createNewFile()
            // 一般要检查一下版本
            imageUri = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
                    FileProvider.getUriForFile(this, "com.jpc.cameraalbumtest.fileprovider", outputImage)
                }else{
                    Uri.fromFile(outputImage)
                }
            // 启动相机程序
            val intent = Intent("android.media.action.IMAGE_CAPTURE")
            intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri)
            startActivityForResult(intent, takePhoto)
        }
    }

    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        super.onActivityResult(requestCode, resultCode, data)
        when(requestCode) {
            takePhoto -> {
                if(resultCode == Activity.RESULT_OK){
                    // 将拍摄的照片显示出来
                    val bitmap =
                        BitmapFactory.decodeStream(contentResolver.openInputStream(imageUri))
                    imageView.setImageBitmap(rotateIfRequired(bitmap))
                }
            }
        }
    }

    /**
     * 调用照相机程序去拍照有可能会在一些手机上发生照片旋转的情况。这是因为
     * 这些手机认为打开摄像头进行拍摄时手机就应该是横屏的,因此回到竖屏的情况下就会发生90
     * 度的旋转。为此,这里我们又加上了判断图片方向的代码,如果发现图片需要进行旋转,那么
     * 就先将图片旋转相应的角度,然后再显示到界面上
     */
    private fun rotateIfRequired(bitmap: Bitmap): Bitmap {
        // 这里使用let函数,如果outputImage不为空,就执行let函数中的代码
        val exif = outputImage?.let { ExifInterface(it.path) }
        val orientation = exif?.getAttributeInt(ExifInterface.TAG_ORIENTATION,
            ExifInterface.ORIENTATION_NORMAL)
        return when (orientation) {
            ExifInterface.ORIENTATION_ROTATE_90 -> rotateBitmap(bitmap, 90)
            ExifInterface.ORIENTATION_ROTATE_180 -> rotateBitmap(bitmap, 180)
            ExifInterface.ORIENTATION_ROTATE_270 -> rotateBitmap(bitmap, 270)
            else -> bitmap
        }
    }
    private fun rotateBitmap(bitmap: Bitmap, degree: Int): Bitmap {
        val matrix = Matrix()
        matrix.postRotate(degree.toFloat())
        val rotatedBitmap = Bitmap.createBitmap(bitmap, 0, 0, bitmap.width, bitmap.height,
            matrix, true)
        bitmap.recycle() // 将不再需要的Bitmap对象回收
        return rotatedBitmap
    }
}
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools">

<!-- 声明权限-->
    <uses-feature
        android:name="android.hardware.camera"
        android:required="false" />
    <uses-permission android:name="android.permission.CAMERA" />

    <application
        android:allowBackup="true"
        android:dataExtractionRules="@xml/data_extraction_rules"
        android:fullBackupContent="@xml/backup_rules"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/Theme.CameraAlbumTest"
        tools:targetApi="31">
        <activity
            android:name=".MainActivity"
            android:exported="true">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <provider
            android:name="androidx.core.content.FileProvider"
            android:authorities="com.jpc.cameraalbumtest.fileprovider"
            android:exported="false"
            android:grantUriPermissions="true">
            <meta-data
                android:name="android.support.FILE_PROVIDER_PATHS"
                android:resource="@xml/file_paths" />
        </provider>
    </application>

</manifest>

存放路径

<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
    <external-path name="my_images" path="/" />
</paths>

2、从相册中选择图片的功能

在上面基本代码的基础之上添加文章来源地址https://www.toymoban.com/news/detail-845983.html

val fromAlbumBtn = findViewById<Button>(R.id.fromAlbumBtn)
        fromAlbumBtn.setOnClickListener{
            // 打开文件选择器
            val intent = Intent(Intent.ACTION_OPEN_DOCUMENT)
            intent.addCategory(Intent.CATEGORY_OPENABLE)
            // 指定只显示图片
            intent.type = "image/*"
            startActivityForResult(intent, fromAlbum)
        }
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        super.onActivityResult(requestCode, resultCode, data)
        when(requestCode) {
            takePhoto -> {
                if(resultCode == Activity.RESULT_OK){
                    // 将拍摄的照片显示出来
                    val bitmap =
                        BitmapFactory.decodeStream(contentResolver.openInputStream(imageUri))
                    imageView.setImageBitmap(rotateIfRequired(bitmap))
                }
            }
            fromAlbum -> {
                if(resultCode == Activity.RESULT_OK && data != null){
                    data.data?.let { uri ->
                        // 将选择的图片显示
                        val bitmap = getBitmapFromUri(uri)
                        imageView.setImageBitmap(bitmap)
                    }
                }
            }
        }
    }

到了这里,关于Android10以上版本调用相机拍照的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • OpenHarmony相机和媒体库-如何在ArkTS中调用相机拍照和录像。

    此Demo展示如何在ArkTS中调用相机拍照和录像,以及如何使用媒体库接口进行媒体文件的增、删、改、查操作。 本示例用到了权限管理能力@ohos.abilityAccessCtrl 相机模块能力接口@ohos.multimedia.camera 图片处理接口@ohos.multimedia.image 音视频相关媒体业务能力接口@ohos.multimedia.media 媒体

    2024年04月28日
    浏览(39)
  • 鸿蒙实战开发-相机和媒体库、如何在eTS中调用相机拍照和录像

    此Demo展示如何在eTS中调用相机拍照和录像,以及使用媒体库接口将图片和视频保存的操作。实现效果如下: 使用说明 1.启动应用,在权限弹窗中授权后返回应用,进入相机界面。 2.相机界面默认是拍照模式,点击底部拍照按钮可以拍照,拍照完成会在底部左侧显示照片预览

    2024年04月09日
    浏览(62)
  • Android 13 骁龙相机点击拍照流程分析(二)——点击拍照到存入相册

            本篇是在Android 13 骁龙相机点击拍照流程分析(一)——点击拍照到更新到左下角缩略图文章的基础上进行延申的,前面的预览、点击拍照的过程参考第一篇:Android 13 骁龙相机点击拍照流程分析(一)——点击拍照到更新到左下角缩略图-CSDN博客         从第一篇的

    2024年02月06日
    浏览(51)
  • Android相册选择图片、相机拍照上传功能实现(上)

    先上效果图 下面就来说一下相册选择图片和相机拍照的实现 相册选择图片很简单,只需要通过 Intent 设置拉起就可以了 Intent 拉起相册 /** 打开相册 @param type 打开类型区分码(type是我用来区分回调的) / private void openGallery(int type) { Intent gallery = new Intent(Intent.ACTION_PICK); galler

    2024年04月16日
    浏览(54)
  • 十分钟实现 Android Camera2 相机拍照

    因为工作中要使用 Android Camera2 API ,但因为 Camera2 比较复杂,网上资料也比较乱,有一定入门门槛,所以花了几天时间系统研究了下,并在 CSDN 上记录了下,希望能帮助到更多的小伙伴。 上篇文章 我们使用 Camera2 实现了相机预览的功能,这篇文章我们接着上文,来实现 Cam

    2024年02月11日
    浏览(67)
  • Android 使用Camera1实现相机预览、拍照、录像

    本文介绍如何从零开始,在 Android 中实现 Camera1 的接入,并在文末提供 Camera1Manager 工具类,可以用于快速接入 Camera1 。 Android Camera1 API 虽然已经被 Google 废弃,但有些场景下不得不使用。 并且 Camera1 返回的帧数据是 NV21 ,不像 Camera2 、 CameraX 那样,需要自己再转一层,才能得

    2024年02月08日
    浏览(51)
  • Android11 相机拍照权限,以及解决resolveActivity返回null

    一、配置拍照和读写权限 二、手动申请权限         implementation \\\'com.permissionx.guolindev:permissionx:1.4.0\\\'         1、手动申请读写,拍照权限         2、手动申请文件管理权限 三、Manifest中配置queries(解决resolveActivity为null) 四、Manifest中配置provider 五、配置file_paths文件

    2024年02月15日
    浏览(51)
  • Android 13 骁龙相机点击拍照流程分析(一)——点击拍照到更新到左下角缩略图

    由于最近客户定制需要将文件挂载类型修改为sdcardfs,由于修改了文件挂载类型,导致了骁龙相机拍照后不能点击进入相册,故对骁龙相机从点击事件开始进行问题的排查,此处不介绍最终的sdcardfs挂载后的问题解决方案 拍照的流程大概分为几个阶段:打开相机进行预览、点

    2024年02月04日
    浏览(52)
  • Android——调用摄像头拍照

    首先修改activity_main.xml 如下: 添加一个按钮和图片。 我们的逻辑功能是: 点击按钮后打开相机 相机拍照后图片返回到图片里 由于代码比较长切复杂,我会一步步讲解以便于我的理解。(没错就是我的) 首先我们需要为Button注册点击事件 我们要创建一个文件存放我们拍照的

    2024年02月14日
    浏览(44)
  • uniapp无法唤起相机的避坑之旅(安卓10以上,以及鸿蒙手机

    相机权限:都获取到了。 原因可能是安卓的原生问题,应该在安卓的manifest里添加provider provider android:name=“io.dcloud.common.util.DCloud_FileProvider” android:authorities=“${apk.applicationId}.dc.fileprovider” android:exported=“false” android:grantUriPermissions=“true” meta-data android:name=“android.support.

    2024年04月13日
    浏览(80)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包