package com.future.driver.ui.main
|
|
import android.Manifest
|
import android.graphics.*
|
import android.hardware.Camera
|
import android.os.Environment
|
import android.os.Handler
|
import com.future.driver.R
|
import com.future.driver.base.BaseEvent
|
import com.future.driver.base.MyBaseActivity
|
import com.future.driver.netUtls.Api
|
import com.future.driver.netUtls.callNet
|
import com.future.driver.netUtls.getMapByAny
|
import com.future.driver.utils.Cache.CacheKey
|
import com.future.driver.utils.OSSUtil
|
import com.future.driver.utils.view.CameraPreview
|
import com.tbruyelle.rxpermissions2.RxPermissions
|
import kotlinx.android.synthetic.main.activity_face.*
|
import org.greenrobot.eventbus.EventBus
|
import org.jetbrains.anko.startActivity
|
import org.jetbrains.anko.toast
|
import java.io.*
|
|
class FaceActivity:MyBaseActivity() {
|
override fun setContentView() {
|
setContentView(R.layout.activity_face)
|
}
|
|
|
private var faceUrl = ""
|
private var mCamera: Camera? = null
|
|
//获取照片中的接口回调
|
var mPictureCallback = Camera.PictureCallback { data, camera ->
|
|
val bmp = BitmapFactory.decodeByteArray(data, 0, data.size)
|
val m = Matrix()
|
m.setRotate(270f)
|
val transformed: Bitmap? = mirror(
|
Bitmap.createBitmap(
|
bmp,
|
0,
|
0,
|
bmp.width,
|
bmp.height,
|
m,
|
true
|
)
|
) //得到旋转后的照片
|
val bitmap: Bitmap? = compressScale(transformed!!)
|
transformed.recycle()
|
bmp.recycle()
|
showDialog()
|
upFile(bitmap)
|
bitmap?.recycle()
|
}
|
|
override fun initView() {
|
showTitle(false)
|
}
|
|
override fun setOnclick() {
|
}
|
|
override fun onBackPressed() {
|
}
|
|
/**
|
* 照片镜像处理
|
*/
|
private fun mirror(rawBitmap: Bitmap): Bitmap? {
|
val matrix = Matrix()
|
matrix.postScale(-1f, 1f)
|
return Bitmap.createBitmap(
|
rawBitmap,
|
0,
|
0,
|
rawBitmap.width,
|
rawBitmap.height,
|
matrix,
|
true
|
)
|
}
|
|
fun compressScale(image: Bitmap): Bitmap? {
|
val baos = ByteArrayOutputStream()
|
image.compress(Bitmap.CompressFormat.JPEG, 100, baos)
|
// 判断如果图片大于1M,进行压缩避免在生成图片(BitmapFactory.decodeStream)时溢出
|
if (baos.toByteArray().size / 1024 > 1024) {
|
baos.reset() // 重置baos即清空baos
|
image.compress(Bitmap.CompressFormat.JPEG, 80, baos) // 这里压缩50%,把压缩后的数据存放到baos中
|
}
|
var isBm = ByteArrayInputStream(baos.toByteArray())
|
val newOpts = BitmapFactory.Options()
|
// 开始读入图片,此时把options.inJustDecodeBounds 设回true了
|
newOpts.inJustDecodeBounds = true
|
var bitmap = BitmapFactory.decodeStream(isBm, null, newOpts)
|
newOpts.inJustDecodeBounds = false
|
val w = newOpts.outWidth
|
val h = newOpts.outHeight
|
// 现在主流手机比较多是800*480分辨率,所以高和宽我们设置为
|
// float hh = 800f;// 这里设置高度为800f
|
// float ww = 480f;// 这里设置宽度为480f
|
val hh = 1024f
|
val ww = 1024f
|
// 缩放比。由于是固定比例缩放,只用高或者宽其中一个数据进行计算即可
|
var be = 1 // be=1表示不缩放
|
if (w > h && w > ww) { // 如果宽度大的话根据宽度固定大小缩放
|
be = (newOpts.outWidth / ww).toInt()
|
} else if (w < h && h > hh) { // 如果高度高的话根据高度固定大小缩放
|
be = (newOpts.outHeight / hh).toInt()
|
}
|
if (be <= 0) be = 1
|
newOpts.inSampleSize = be // 设置缩放比例
|
// newOpts.inPreferredConfig = Config.RGB_565;//降低图片从ARGB888到RGB565
|
// 重新读入图片,注意此时已经把options.inJustDecodeBounds 设回false了
|
isBm = ByteArrayInputStream(baos.toByteArray())
|
bitmap = BitmapFactory.decodeStream(isBm, null, newOpts)
|
return bitmap
|
}
|
|
private fun upFile(bitmap :Bitmap?){
|
try {
|
val path = (Environment.getExternalStorageDirectory().toString() + "/driverSign${CacheKey.getUserId()}.png")
|
val fos = FileOutputStream(path)
|
bitmap?.compress(Bitmap.CompressFormat.PNG, 100, fos)
|
try {
|
fos.flush()
|
} catch (e: IOException) {
|
e.printStackTrace()
|
}
|
try {
|
fos.close()
|
} catch (e: IOException) {
|
e.printStackTrace()
|
}
|
|
Thread {
|
val ossUtil = OSSUtil(this)
|
ossUtil.uploadSingle(path, object : OSSUtil.OSSUploadCallBack() {
|
override fun onFinish(url: String?) {
|
super.onFinish(url)
|
Handler(mainLooper).post {
|
releaseCamera()
|
faceUrl = url?:""
|
val mapByAny = getMapByAny()
|
mapByAny["url"] = faceUrl
|
callNet(Api.face,mapByAny,{
|
EventBus.getDefault().post(BaseEvent(BaseEvent.FACE_SUC))
|
startActivity<FaceSucActivity>("isSuc" to true)
|
finish()
|
}){
|
if (it?.contains("主页") == true){
|
startActivity<MainActivity>()
|
}else{
|
startActivity<FaceSucActivity>()
|
}
|
EventBus.getDefault().post(BaseEvent(BaseEvent.FACE_FAILED))
|
finish()
|
}
|
dismissDialog()
|
}
|
}
|
|
override fun onFial(message: String?) {
|
super.onFial(message)
|
Handler(mainLooper).post {
|
dismissDialog()
|
toast("人脸采集失败,请重试")
|
EventBus.getDefault().post(BaseEvent(BaseEvent.FACE_FAILED))
|
finish()
|
}
|
}
|
})
|
}.start()
|
} catch (e: FileNotFoundException) {
|
e.printStackTrace()
|
}
|
}
|
|
private fun initCamera() {
|
releaseCamera()
|
val numberOfCameras = Camera.getNumberOfCameras() // 获取摄像头个数
|
//遍历摄像头信息
|
for (cameraId in 0 until numberOfCameras) {
|
val cameraInfo = Camera.CameraInfo()
|
Camera.getCameraInfo(cameraId, cameraInfo)
|
if (cameraInfo.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) { //前置摄像头
|
mCamera = Camera.open(cameraId) //打开摄像头
|
}
|
}
|
val mPreview = CameraPreview(this, mCamera)
|
camera_preview.addView(mPreview)
|
tv_login.setOnClickListener {
|
tv_login.isEnabled = false
|
//得到照相机的参数
|
val parameters = mCamera!!.parameters
|
//图片的格式
|
parameters.pictureFormat = ImageFormat.JPEG
|
//预览的大小是多少
|
parameters.setPreviewSize(1000, 1000)
|
//设置对焦模式,自动对焦
|
parameters.focusMode = Camera.Parameters.FOCUS_MODE_AUTO
|
//对焦成功后,自动拍照
|
mCamera!!.autoFocus { success, camera ->
|
if (success) {
|
//获取照片
|
mCamera!!.takePicture(null, null, mPictureCallback)
|
}
|
}
|
}
|
}
|
|
private fun checkPermission() {
|
val subscribe = RxPermissions(this).request(
|
Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_EXTERNAL_STORAGE,
|
Manifest.permission.CAMERA
|
).subscribe {
|
if (it) {
|
initCamera()
|
} else {
|
toast("请开启权限后重试")
|
}
|
}
|
}
|
|
private fun releaseCamera() {
|
if (mCamera != null) {
|
mCamera!!.stopPreview()
|
mCamera!!.setPreviewCallback(null)
|
mCamera!!.release()
|
mCamera = null
|
}
|
}
|
|
override fun onResume() {
|
super.onResume()
|
checkPermission()
|
}
|
|
override fun onPause() {
|
super.onPause()
|
releaseCamera()
|
}
|
}
|