调用摄像头拍照
首先修改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中修改文章来源:https://www.toymoban.com/news/detail-624639.html
<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啦(其实还有很多细节,但是我不是很懂)。文章来源地址https://www.toymoban.com/news/detail-624639.html
到了这里,关于Android——调用摄像头拍照的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!