1. AndroidManifest.xml添加权限

<uses-permission android:name="android.permission.CAMERA"/>

2.申请权限

private fun requestPermission() {
    if (ContextCompat.checkSelfPermission(baseContext, Manifest.permission.CAMERA)
        != PackageManager.PERMISSION_GRANTED
    ) {
        if (shouldShowRequestPermissionRationale(Manifest.permission.CAMERA)) {
        } else {
            requestPermissions(
                arrayOf(Manifest.permission.CAMERA),
                MY_PERMISSIONS_REQUEST_CALL_CAMERA
            )
        }
    } else {
        openCamera()
    }
}

3.打开相机

private var photoFile: File? = null
private var photoURI: Uri? = null
private var myPhotoFile: File? = null
private fun openCamera() {
        val takePictureIntent = Intent(MediaStore.ACTION_IMAGE_CAPTURE)
     if (takePictureIntent.resolveActivity(packageManager) != null) {
          photoFile = try {
             createImageFile()
         } catch (ex: IOException) {
             // 错误处理
             null
         }

         // 继续只有在photoFile不为null的情况下
         photoFile?.let {
              photoURI = FileProvider.getUriForFile(
                 baseContext,
                 "com.qqqa.kdfdj.fileprovider",
                 it
             )
             takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, photoURI)
             startActivityForResult(takePictureIntent, MY_PERMISSIONS_REQUEST_CALL_CAMERA)
         }
     }
 }
private fun createImageFile(): File {
    // 创建一个存储图片的Image文件
    val timeStamp: String = SimpleDateFormat("yyyyMMdd_HHmmss").format(Date())
    val imageFileName: String = "JPEG_" + timeStamp + "_"
    val storageDir: File? = getExternalFilesDir(Environment.DIRECTORY_PICTURES)
    return File.createTempFile(
        imageFileName,  /* 前缀 */
        ".jpg",         /* 后缀 */
        storageDir      /* 文件夹 */
    ).apply {
        myPhotoFile = this
    }
}
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        super.onActivityResult(requestCode, resultCode, data)
     if (requestCode == MY_PERMISSIONS_REQUEST_CALL_CAMERA && resultCode == RESULT_OK) {
         myPhotoFile?.let {
             recognizeTextFromImage(this, it) { result ->
                 // 处理识别结果
                 runOnUiThread {
                     binding.etTitleDesc.text = result
                 }
             }
         }
     } else if (requestCode == REQUEST_IMAGE_PICK && resultCode == RESULT_OK && data != null && data.data != null) {
         val imageUri = data.data
         if (imageUri != null) {
             //recognizeTextFromImage(baseContext,imageUri)
         }
     }
 }

4.处理返回文字

 private fun recognizeTextFromImage(context: Context, imageUri: File, callback: (String) -> Unit) {
    val bitmap = BitmapFactory.decodeFile(imageUri.toString())
    val image = InputImage.fromBitmap(bitmap, 0)
    val recognizer = TextRecognition.getClient(ChineseTextRecognizerOptions.Builder().build())
    recognizer.process(image)
        .addOnSuccessListener { visionText ->
            val text = visionText.text
            callback(text)
        }
        .addOnFailureListener { e ->
            callback("Error: $e")
        }
//        recognizer.close()
}
Logo

技术共进,成长同行——讯飞AI开发者社区

更多推荐