调用系统相机拍照并将照片插入相册
2021-11-16 本文已影响0人
NewNiu
请求相机功能
如果您应用的基本功能是拍照,请将其在 Google Play 上的显示范围限制在装有相机的设备上。如需声明您的应用依赖于相机,请在清单文件中添加 <uses-feature>
代码:
<manifest ... >
<uses-feature android:name="android.hardware.camera"
android:required="true" />
...
</manifest>
如果您的应用使用相机,但不需要相机也可以正常运作,应将 android:required
设为 false
。这样,Google Play 便会允许未装有相机的设备下载您的应用。因此,您必须负责通过调用 hasSystemFeature(PackageManager.FEATURE_CAMERA_ANY)
检查相机在运行时的可用性。如果相机不可用,您应停用相机功能。
使用相机应用拍照
推荐一个比startActivityForResult更方便获取一个Activity的返回结果的方法:
@NonNull
@Override
public final <I, O> ActivityResultLauncher<I> registerForActivityResult(
@NonNull ActivityResultContract<I, O> contract,
@NonNull ActivityResultCallback<O> callback) {
return registerForActivityResult(contract, mActivityResultRegistry, callback);
}
val getImageResultBack =
registerForActivityResult(ActivityResultContracts.TakePicture()) {
// 相机拍照后返回
if (it) {
mPicUri?.let { uri ->
// dialog这里用于将返回图片结果展示出来
val dialog = ImageDialog()
dialog.setImage(uri)
dialog.show(supportFragmentManager, "1")
// Android版本小于Q的手机在获取到拍摄的照片后需要动态将其插入到相册,否则图片不在相册中显示
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.Q) {
val absolutePath = FileUtil.getRealFilePathByUri(this, uri)
MediaUtil.mediaInsertImage(this@MainActivity,absolutePath)
// 这是另一种过时的插入方法,目前依然可以使用
/*MediaStore.Images.Media.insertImage(
contentResolver,
absolutePath,
"IMG_${TimeUtil.getCurrentTime_yyyyMMdd_HHmmss()}",
"description"
)
sendBroadcast(
Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE),
"file://${Uri.parse(absolutePath)}"
)*/
}
}
}
}
// 调用相机 mPicUri最好在每次拍照前都把其值重新更新,以免发生新拍的照片将旧照片覆盖的情况 下面方法在按钮点击后调用
getImageResultBack?.launch(mPicUri)
另一种官方文档上提供的Intent方法:
以下都是官方提供的方法
Android 向其他应用委托操作的方法是调用一个 Intent
,用于描述您要执行的操作。此过程涉及三个部分:Intent
本身,用于启动外部 Activity
的调用,以及用于在焦点返回到 Activity 时处理图片数据的一些代码。
下面是一个调用 Intent 以拍摄照片的函数。
// 该方法比较常用,但所有返回结果都需要在OnActivityResult中返回结果处理
val REQUEST_IMAGE_CAPTURE = 1
private fun dispatchTakePictureIntent() {
Intent(MediaStore.ACTION_IMAGE_CAPTURE).also { takePictureIntent ->
takePictureIntent.resolveActivity(packageManager)?.also {
startActivityForResult(takePictureIntent, REQUEST_IMAGE_CAPTURE)
}
}
}
// 获取缩略图
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent) {
if (requestCode == REQUEST_IMAGE_CAPTURE && resultCode == RESULT_OK) {
val imageBitmap = data.extras.get("data") as Bitmap
imageView.setImageBitmap(imageBitmap)
}
}
// 相关方法不赘述,请参考[`官方文档`](https://developer.android.google.cn/training/camera/photobasics)