Android——调用摄像头拍照

调用摄像头拍照

首先修改activity_main.xml
如下:

<?xml version="1.0" encoding="utf-8"?>  
<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:layout_width="match_parent"  
       android:layout_height="wrap_content"  
       android:id="@+id/takePhotoBtn"  
       android:text="Take Photo"/>  
    <ImageView  
        android:layout_width="wrap_content"  
        android:layout_height="wrap_content"  
        android:id="@+id/imageView"  
        android:layout_gravity="center_horizontal"/>  
  
</LinearLayout>

添加一个按钮和图片。
我们的逻辑功能是:

  • 点击按钮后打开相机
  • 相机拍照后图片返回到图片里
    由于代码比较长切复杂,我会一步步讲解以便于我的理解。(没错就是我的)
    首先我们需要为Button注册点击事件
takePhotoBtn.setOnClickListener {  
  ...
}

我们要创建一个文件存放我们拍照的图片,并且将图片(File对象)转换成Uri对象(表示这这张图片的本地真实路径)。
然后用非常熟悉的Intent启动相机程序

takePhotoBtn.setOnClickListener {  
//处理调用摄像头的逻辑  
outputImage = File(externalCacheDir,"output_image.jpg")//创建File对象,存放拍下图片  
//externalCacheDir叫做关联缓存目录,专门用于存放当前应用缓存数据的位置  
if (outputImage.exists()){  
    outputImage.delete()  
}  //如果已经存在就删除
outputImage.createNewFile()  
imageUri = if (Build.VERSION.SDK_INT>=Build.VERSION_CODES.N){  
    //将File对象转换成一个封装过的Uri对象  
    FileProvider.getUriForFile(this,"com.example.cameraalbumtest.fileprovider",outputImage)  
}else{  
    Uri.fromFile(outputImage)  
}  
//启动相机程序  
val intent = Intent("android.media.action.IMAGE_CAPTURE")  
intent.putExtra(MediaStore.EXTRA_OUTPUT,imageUri)//指定图片的输出地址
//使用registerForActivityResult启动
requestDataLauncher.launch(intent)
}

这里我们使用的是registerForActivityResult方法,用来替代startActivityForResult()方法(被废除)

private val requestDataLauncher=registerForActivityResult(ActivityResultContracts.StartActivityForResult())  
{result ->if (result.resultCode== RESULT_OK){  
    val bitmap = BitmapFactory.decodeStream(contentResolver.openInputStream(imageUri))  
    val imageView = findViewById<ImageView>(R.id.imageView)  
    imageView.setImageBitmap(rotateIfRequired(bitmap))  
}

接收到图片后,就可以调用BitmapFactory.decodeStream方法将图片转换成Bitmap对象,再将其设置到ImageView中展现出来。
最后的最后,提到了ContentProvider,自然要注册
再AndroidManifest中修改

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

这样就ok啦(其实还有很多细节,但是我不是很懂)。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值