百度OCR文字识别使用及问题记录

1. 利用 registerForActivityResult 打开相机并且拍照,利用Uri获取图片本地真实路径,并且传到文字识别中解析OCR自带库中解析,使用请求代码示例Java版,并且下载好配套的解析类,里面有些内容要自己修改一下,下面会讲

class CharacterActivity : AppCompatActivity(){

    private val TAG = "CharacterActivity"

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_character)
        characterBack.setOnClickListener { finish() }
        
        //调用方法
        characterTake.setOnClickListener {
            onTakePicture()
        }

    }


    var imageSaveUri : Uri?= null
    //打开相机拍照
    fun onTakePicture(){
        imageSaveUri = if(Build.VERSION.SDK_INT>= Build.VERSION_CODES.Q){
            Log.d(TAG, "onTakePicture: ${"hello"}")
            val values = ContentValues()
            values.put(MediaStore.MediaColumns.DISPLAY_NAME,"图片名称.jpg")
            values.put(MediaStore.MediaColumns.RELATIVE_PATH, Environment.DIRECTORY_PICTURES)
            contentResolver.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,values)
        }else{
            FileProvider.getUriForFile(this,
                "${packageName}.fileprovider",
                File(externalCacheDir!!.absolutePath,"图片名称.jpg")
            )
        }
        myActivityResultLauncher.launch(imageSaveUri)
        Log.d(TAG, "onTakePicture1: ${imageSaveUri}")

    }

    //获取图片本地真实路径
    private fun getImagePath():String{
        var cursor: Cursor? = null;
        try {
            val proj = arrayOf(MediaStore.Images.Media.DATA)
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
                cursor = contentResolver.query(Uri.parse(imageSaveUri.toString()),proj,null,null,null)
                val column_index = cursor?.getColumnIndexOrThrow(MediaStore.Images.Media.DATA)
                cursor?.moveToFirst()
                return cursor?.getString(column_index!!)!!
            }
        }catch (e:Exception){
            e.printStackTrace()
        }finally {
            cursor?.close()
        }
        return null.toString()
    }

    //调用 registerForActivityResult 打开相机方法
    private val myActivityResultLauncher = registerForActivityResult(ActivityResultContracts.TakePicture()){ result : Boolean ->

        if (result) {
            Log.d(TAG, ": ${getImagePath()}")

            // 将本地路径放入 GeneralBasic.generalBasic 库中解析
            val data = GeneralBasic.generalBasic(getImagePath())
            Log.d(TAG, "${data}: ")
        }
    }

}

2. 调用 GeneralBasic.generalBasic(String imagePath),我改过,需要传入图片本地路径,和自己的Token,Token的获取官方文档和我的这篇文章中有说明Token的获取

public class GeneralBasic {

    public static String generalBasic(String imagePath) {
        // 请求url
        String url = "https://aip.baidubce.com/rest/2.0/ocr/v1/general_basic";
        try {
            // 本地文件路径
            String filePath = imagePath;
            byte[] imgData = FileUtil.readFileByBytes(filePath);
          
            String imgStr = Base64Util.encode(imgData);
     
            //这两行不需要
//            String imgParam = URLEncoder.encode(imgStr, "UTF-8");
//            String param = "image=" + imgStr;

            // 注意这里仅为了简化编码每一次请求都去获取access_token,线上环境access_token有过期时间, 客户端可自行缓存,过期后重新获取。
            String accessToken = "输入自己的Token";

            String result = HttpUtil.post(url, accessToken, imgStr);
            System.out.println(result);
            return result;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }


}

3. 调用 HttpUtil,避坑避坑,这里面的ConnectionHttp不能用我把他改成Okhttp进行网络请求,亲测有效。


/**
 * http 工具类
 */
public class HttpUtil {

    public static String post(String requestUrl, String accessToken, String params)
            throws Exception {
        String contentType = "application/x-www-form-urlencoded";
        return HttpUtil.post(requestUrl, accessToken, contentType, params);
    }

    public static String post(String requestUrl, String accessToken, String contentType, String params)
            throws Exception {
        String encoding = "UTF-8";
        if (requestUrl.contains("nlp")) {
            encoding = "GBK";
        }
        return HttpUtil.post(requestUrl, accessToken, contentType, params, encoding);
    }

    public static String post(String requestUrl, String accessToken, String contentType, String params, String encoding)
            throws Exception {
        String url = requestUrl + "?access_token=" + accessToken;
        return HttpUtil.postGeneralUrl(url, contentType, params, encoding);
    }

    public static String postGeneralUrl(String generalUrl, String contentType, String params, String encoding)
            throws Exception {
        URL url = new URL(generalUrl);
        OkHttpClient client = new OkHttpClient();

        // 加入参数
        RequestBody body = new FormBody.Builder()
                .add("image",params)
                .build();

        Request request = new Request.Builder()
                .url(url)
                //假如请求头
                .addHeader("Content-Type",contentType)
                .post(body)
                .build();
        client.newCall(request).enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {
            }

            @Override
            public void onResponse(Call call, Response response) throws IOException {
                Log.d("hello", response.body().string());

            }
        });
        return null;
    }
}

4. 获取数据成功

在这里插入图片描述

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小蒋的学习笔记

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值