在开发时我调用,调起相机进行拍照。
Intent = Intent(MediaStore.ACTION_IMAGE_CAPTURE)
startActivityForResult(intent, REQUEST_TAKEPHOTO)
随后用onActivityResult接收所得到的照片。
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
if (resultCode==Activity.RESULT_OK){
if (requestCode==REQUEST_TAKEPHOTO){
val bundle: Bundle? =data?.extras
val bitmap: Bitmap = bundle?.get("data") as Bitmap
show(bitmap)
}
}
}
这上面的做法都没毛病,但是我发现得到的图片非常模糊,实锤座机拍出来的。
后来才知道用bundle?.get(“data”)得到的Bitmap是缩略图,所以照片看上去非常的模糊。
如何解决呢?
解决思路:我们需要将拍照得到的图片先存储在本地,取值的时候,我们调取本地存储的文件作为显示,这时所显示的照片则是清晰的。
具体解决方案:
1.调起拍照
需要区分Android7.0以上,以及Android7.0以下的拍照调用(如果你是7.0的手机,直接调用7.0以下的方式,会直接crash报错。错误我忘记记录了,有兴趣的可以自己动手试一下)
判断系统版本,随后区分调取方法
var mFilePath = "yourPath.jpg"
if (Build.VERSION.SDK_INT>=Build.VERSION_CODES.N){
takePhotoBiggerThan7(File(mFilePath).absolutePath)
}else{
takePhotoLow7()
}
1.1 对7.0及以上的处理:
/**
* 7.0对照片的处理
*/
private fun takePhotoBiggerThan7(absolutePath: String) {
val mCameraTempUri: Uri?
try {
val values = ContentValues(1)
values.put(MediaStore.Images.Media.MIME_TYPE, "image/jpg")
values.put(MediaStore.Images.Media.DATA, absolutePath)
mCameraTempUri = contentResolver.insert(
MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
values
)
val intent = Intent(MediaStore.ACTION_IMAGE_CAPTURE)
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION or Intent.FLAG_GRANT_WRITE_URI_PERMISSION)
if (mCameraTempUri != null) {
intent.putExtra(MediaStore.EXTRA_OUTPUT, mCameraTempUri)
intent.putExtra(MediaStore.EXTRA_VIDEO_QUALITY, 1)
}
startActivityForResult(intent, REQUEST_TAKEPHOTO)
} catch (e: Exception) {
e.printStackTrace()
}
}
1.2 对7.0以下的处理:
private fun takePhotoLow7(){
intent = Intent(MediaStore.ACTION_IMAGE_CAPTURE)
mFilePath = "yourPath.jpg" //YourPath.jpg是你自己所需要保存的文件的路径地址
val mUri = Uri.fromFile(File(mFilePath))
intent.putExtra(MediaStore.EXTRA_OUTPUT, mUri)
startActivityForResult(intent, REQUEST_TAKEPHOTO)
}
2.对onActivity的处理(很多手机拍照后会被旋转90度,需要另作处理):
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
if (resultCode==Activity.RESULT_OK){
if (requestCode==REQUEST_TAKEPHOTO){
//读取旋转照片的度数
val angle = PhotoUtil.readPictureDegree(mFilePath)
val bitmapori = BitmapFactory.decodeFile(mFilePath)
//修复照片的旋转
val bitmap = PhotoUtil.rotaingImageView(angle, bitmapori)
}
}
}
执行了如上的方法,很多手机已经能够顺利的调起相机,并且能够得到清晰的照片。巧了的是,我的手机是三星的,得到的bitmap被旋转了90度。一波还未平息,一波又起了。那怎么办?那接下来就是对部分品牌手机,照片自动旋转90度的问题做处理了。
得到的照片,旋转了90度?
解决如下:
1.读取该相片被旋转的度数
fun readPictureDegree(path: String?): Int {
var degree = 0
try {
val exifInterface = path?.let { ExifInterface(it) }
val orientation: Int = exifInterface!!.getAttributeInt(
ExifInterface.TAG_ORIENTATION,
ExifInterface.ORIENTATION_NORMAL
)
//Log.e("TAG", "原图被旋转角度: ========== $orientation")
when (orientation) {
ExifInterface.ORIENTATION_ROTATE_90 -> degree = 90
ExifInterface.ORIENTATION_ROTATE_180 -> degree = 180
ExifInterface.ORIENTATION_ROTATE_270 -> degree = 270
}
} catch (e: IOException) {
e.printStackTrace()
}
return degree
}
2.修复照片的旋转
得到的照片旋转了多少度,我们就把它给旋转回来,进行复位
/**
* 照片旋转角度修复
*/
fun rotaingImageView(angle: Int, bitmap: Bitmap): Bitmap? {
//Log.e("TAG", "angle===$angle")
var returnBm: Bitmap? = null
// 根据旋转角度,生成旋转矩阵
val matrix = Matrix()
matrix.postRotate(angle.toFloat())
try {
// 将原始图片按照旋转矩阵进行旋转,并得到新的图片
returnBm = Bitmap.createBitmap(bitmap, 0, 0, bitmap.width, bitmap.height, matrix, true)
} catch (e: OutOfMemoryError) {
}
if (returnBm == null) {
returnBm = bitmap
}
if (bitmap != returnBm) {
bitmap.recycle()
}
return returnBm
}
经过上面的两个操作后,我们会得到一个已经成功复位的照片,即Bitmap。
我所在项目是需要我将bitmap转化成一个File的Path,那么就还需要一个将Bitmap转化为File的操作,再用File得到path。
3.将Bitmap转为File,由File得到Path
fun saveBitmapFileToFile(bitmap: Bitmap):String{
var filemm= File("yourPath.jpg") //YourPath.jpg是你自己所需要保存的文件的路径地址
try {
var bos = BufferedOutputStream(FileOutputStream(filemm));
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, bos);
bos.flush();
bos.close();
} catch (e: IOException) {
e.printStackTrace();
}
return filemm.absolutePath
}
至此调起相机,区分7.0以上,以下的调取操作,将照片复位的操作也就完成了!