相机目录
说一下
我学习Android 也有很长的时间了,现在回想起来一直就是在学习或者是在学习的道路上。Java->Android->kotlin->dart->flutter->c->html->…
这个大概是我的学习的方向,但是忽然之间迷茫了,所以还是向自己的本质出发,研究自己的工作内容。
相机简介
想说的话:大家都知道,在Android手机中有一个相机的应用。但是相机是如何实现的呢?我也不知道。不过大致的流程也猜测出来了。使用摄像头采集要拍摄的数据,在手机屏幕上使用 SurfaceView 展示内容。但是如何调用呢?如何对于相机进行扩展呢?这就需要好好学习一下了。
拍照
步骤
- 在AndroidManifest 设置所需要的 permission 和 feature
- 判断当前手机的版本号
- 判断手机是否有使用相机的权限
- 打开相机进行拍照
在AndroidManifest 设置所需要的 permission 和 feature
<uses-permission android:name="android.permission.CAMERA"/>
<!-- 使用相机 -->
<uses-feature android:name="android.hardware.Camera" android:required="true"
/>
这里解释一下子,Android 的开发文档中说了。
如果您的应用使用相机,但不需要相机也可以正常运作,则将 android:required 设为 false。这样,Google Play 便会允许没有摄像头的设备下载您的应用。因此,您必须负责通过调用 hasSystemFeature(PackageManager.FEATURE_CAMERA_ANY) 检查相机在运行时的可用性。如果相机不可用,则您应停用相机功能
判断当前手机的版本号
if (Build.VERSION_CODES.M <= SDK_INT){
// Android 版本6.0 或者之上,需要动态权限申请相机
}else{
// Android 版本 6.0 之下,在清单文件中声明相机的权限就可以了
}
判断手机是否有使用相机的权限
if (ContextCompat.checkSelfPermission(
this@SplashActivity,
android.Manifest.permission.CAMERA
) != PackageManager.PERMISSION_GRANTED
) {
ActivityCompat.requestPermissions(
this,
arrayOf(android.Manifest.permission.CAMERA),
0
)
// 没有权限
} else {
// 有权限,可以在这里直接执行打开相机的操作
}
这里说一下,我使用的是Android 原生的判断权限的方法。如果使用,那么必须要重写 onRequestPermissionsResult 这个方法 ,并且判断请求码 requestCode
打开相机进行拍照
val intents = Intent(MediaStore.ACTION_IMAGE_CAPTURE)
if (intents.resolveActivity(packageManager) != null) {
startActivityForResult(intents, REQUEST_IMAGE_CAPTURE)
}
代码解释:
第一步:创建 intent 对象,并且给它设置上值 MediaStore.ACTION_IMAGE_CAPTURE ,这是个可以打开相机的意图,这个意图还可以获取返回的图像(之后再说)。
第二步:这是对于第三行代码 startActivityForResult(intents, REQUEST_IMAGE_CAPTURE) 的一个保护,因为 如果不对其做限制,那么应用程序就会崩溃。
第三步: 跳转页面,当然我们可以从 startActivityForResult 看出这个方法可以获取到拍下的照片。
拍照,并且返回拍下的图片
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
if (REQUEST_IMAGE_CAPTURE == requestCode && RESULT_OK == resultCode) {
// 获取返回的缩略图
val extras = data?.extras
val bitmap = extras?.get("data") as Bitmap
mBinding?.ivSplashImage?.setImageBitmap(bitmap)
}
}
- 在 onActivityResult 的重写方法中判断请求码和响应码。
- 从 intent 对象中获取额外的数据
- 从额外数据中获取到 Bitmap 对象。
- 设置图片