package cn.flightfeather.thirdapp.module.common
|
|
import android.app.Activity
|
import android.content.Intent
|
import android.graphics.Bitmap
|
import android.graphics.BitmapFactory
|
import android.graphics.Matrix
|
import android.media.ExifInterface
|
import android.os.Bundle
|
import android.os.Environment.DIRECTORY_PICTURES
|
import android.view.View
|
import cn.flightfeather.thirdapp.R
|
import cn.flightfeather.thirdapp.module.base.BaseActivity
|
import cn.flightfeather.thirdapp.module.base.BaseTakePicActivity
|
import cn.flightfeather.thirdapp.util.DateFormatter
|
import cn.flightfeather.thirdapp.util.SystemServiceUtils
|
import cn.flightfeather.thirdapp.util.location.LocationUtil
|
import cn.flightfeather.thirdapp.util.photo.ExifHelper
|
import cn.flightfeather.thirdapp.util.photo.ImageMergeUtil
|
import com.otaliastudios.cameraview.CameraListener
|
import com.otaliastudios.cameraview.CameraOptions
|
import com.otaliastudios.cameraview.CameraUtils
|
import io.reactivex.Observable
|
import kotlinx.android.synthetic.main.activity_camera.*
|
import java.io.File
|
import java.io.FileOutputStream
|
import java.util.*
|
|
/**
|
*
|
*/
|
class CameraActivity : BaseActivity(), View.OnClickListener {
|
|
private lateinit var locationUtil: LocationUtil
|
|
private lateinit var imageMergeUtil: ImageMergeUtil
|
|
override fun getLayoutId(): Int =R.layout.activity_camera
|
|
override fun onCreate(savedInstanceState: Bundle?) {
|
super.onCreate(savedInstanceState)
|
initCamera()
|
initLocation()
|
}
|
|
override fun onResume() {
|
camera_view.start()
|
super.onResume()
|
}
|
|
override fun onPause() {
|
camera_view.stop()
|
super.onPause()
|
}
|
|
override fun onDestroy() {
|
locationUtil.onDestroy()
|
super.onDestroy()
|
}
|
|
private fun initCamera() {
|
imageMergeUtil = ImageMergeUtil(this)
|
camera_view.addCameraListener(object : CameraListener() {
|
override fun onCameraOpened(options: CameraOptions) {
|
super.onCameraOpened(options)
|
btn_shot.setOnClickListener(this@CameraActivity)
|
}
|
|
|
override fun onPictureTaken(jpeg: ByteArray?) {
|
super.onPictureTaken(jpeg)
|
val d = Observable.create<String> {
|
jpeg?.let {
|
var b = toBitmap(it)
|
val x = txt_location.x - camera_view.x
|
val y = txt_location.y - camera_view.y
|
b?.let {bitmap ->
|
b = imageMergeUtil.mergeText(bitmap, txt_location.text.toString(), Pair(x, y))
|
// todo: 2020/5/31 保存图片
|
// SystemServiceUtils.saveBitmap(0)
|
}
|
}
|
}
|
val pathList = arrayListOf<String>()
|
val intent = Intent()
|
intent.putStringArrayListExtra(BaseTakePicActivity.EXTRA_SELECT_IMAGES, pathList)
|
setResult(Activity.RESULT_OK, intent)
|
onBackPressed()
|
}
|
|
override fun onCameraClosed() {
|
super.onCameraClosed()
|
onBackPressed()
|
}
|
})
|
}
|
|
private fun initLocation() {
|
locationUtil = LocationUtil(this)
|
locationUtil.startLocation {
|
val date = Date()
|
val time = DateFormatter.dateTimeFormat3.format(date)
|
val locationInfo = "经度: ${it.longitude}" +
|
"\n纬度: ${it.latitude}" +
|
"\n地址: ${it.address}" +
|
"\n时间: $time"
|
runOnUiThread {
|
txt_location.text = locationInfo
|
}
|
}
|
}
|
|
override fun onClick(v: View?) {
|
camera_view.capturePicture()
|
}
|
|
private fun toBitmap(source: ByteArray): Bitmap? {
|
var orientation: Int
|
var flip: Boolean
|
var outputStream: FileOutputStream? = null
|
|
try {
|
val file = File(getExternalFilesDir(DIRECTORY_PICTURES), "IMG_${Date().time}.jpeg")
|
outputStream = FileOutputStream(file)
|
outputStream.write(source)
|
val exif = ExifInterface(file.absolutePath)
|
val exifOrientation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION,
|
ExifInterface.ORIENTATION_NORMAL)
|
orientation = ExifHelper.getOrientation(exifOrientation)
|
flip = exifOrientation == ExifInterface.ORIENTATION_FLIP_HORIZONTAL ||
|
exifOrientation == ExifInterface.ORIENTATION_FLIP_VERTICAL ||
|
exifOrientation == ExifInterface.ORIENTATION_TRANSPOSE ||
|
exifOrientation == ExifInterface.ORIENTATION_TRANSVERSE
|
} catch (e: Exception) {
|
e.printStackTrace()
|
orientation = 0
|
flip = false
|
} finally {
|
outputStream?.flush()
|
outputStream?.close()
|
}
|
|
var bitmap: Bitmap?
|
try {
|
bitmap = BitmapFactory.decodeByteArray(source, 0, source.size)
|
if (orientation != 0 || flip) {
|
val matrix = Matrix()
|
matrix.setRotate(orientation.toFloat())
|
val temp = bitmap
|
bitmap = Bitmap.createBitmap(bitmap!!, 0, 0, bitmap.width,
|
bitmap.height, matrix, true)
|
temp!!.recycle()
|
}
|
} catch (e: OutOfMemoryError) {
|
bitmap = null
|
}
|
return bitmap
|
}
|
}
|