百度OCR文字识别API使用心得 com.baidu.ocr.sdk.exception.SDKError[283604]

百度OCR文字识别API使用心得 com.baidu.ocr.sdk.exception.SDKError[283604]

本文转载自好基友upuptop:https://blog.csdn.net/pyfysf/article/details/77455330

效果图:

如下为文章正文:

最近有个小项目使用到了OCR技术,顺便到网上搜索了一下,大家都在使用百度的API,所以我就调用了百度的接口。
在使用的过程中也是遇到了各种各样的错误,比如 TOKEN ERROR 了等等。

一、注册登录百度云平台

首先注册登陆百度账号,点击这里跳转到百度API接口首页:
https://login.bce.baidu.com/?account=&redirect=http%3A%2F%2Fconsole.bce.baidu.com%2F

注册登陆之后在左侧的 "产品服务" 找到 “文字识别”

"文字识别" 建项目:

创建项目后,在应用类表获取项目的:API Key、Secret Key

粘贴到项目 Demo 中:

二、配置SDK,查看文档调用接口

文档地址:https://cloud.baidu.com/doc/OCR/OCR-Android-SDK.html#.E6.95.B0.E6.8D.AE.E6.8E.A5.E5.8F.A3

博主使用的是Android平台的SDK,根据步骤进行SDK工程配置。

配置完工程之后博主就很惊喜的去调用方法进行写代码了。

但是,logcat总是报错。说获取token失败,packname错误或者AK和SK错误。

这里我就很是纳闷,我根本没有设置项目的包名,并且我的AK和SK是正确的。大家有知道解决方法,求大神在评论区指教博主,博主在这里叩谢。

然后经过我查询资料,我选择请求API,从而不去调用百度封装的方法。

三、实现代码片段(不提供xml布局文件)

下面将贴一些代码片段。不想看代码片段的直接下滑到最后下载 Demo 源码。

博主是打开相机拍一张照片进行扫描实现OCR识别文字,百度的API可以接受本地图片的路径,或者网络上的图片URL也可以进行OCR文字扫描。

我用到了百度提供的UI,在SDK里面导入到项目里面就可以了。

/**
 * 打开相机
 */

public void openCameraByBaidu() {
    Intent intent = new Intent(GuideActivity.this, CameraActivity.class);
    intent.putExtra(CameraActivity.KEY_OUTPUT_FILE_PATH,
            FileUtil.getSaveFile(getApplication()).getAbsolutePath());
    intent.putExtra(CameraActivity.KEY_CONTENT_TYPE,
            CameraActivity.CONTENT_TYPE_GENERAL);
    startActivityForResult(intent, OPEN_CAMERA_OK);

}

拍照之后获取照片的保存路径:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data
{
    ##判断请求码是否是请求打开相机的那个请求码
    if (requestCode == OPEN_CAMERA_OK && resultCode == RESULT_OK) {

        String photoPath = FileUtil.getSaveFile(this).getAbsolutePath();
        checkData(photoPath);
    }
}

核心代码在这里!!

请求百度文字识别API,进行图片OCR识别,我用的是 xUtils3.0 请求的网络。也可以使用HTTPConnection 发起 get 请求,如下是参考代码:

 /**
 * 请求百度API接口,进行获取数据
 *
 * @param filePath
 */

private void checkData(String filePath{

    try {

        ##把图片文件转换为字节数组
        byte[] imgData = FileUtil.readFileByBytes(filePath);

        ##对字节数组进行Base64编码
        String imgStr = Base64Util.encode(imgData);
        final String params = URLEncoder.encode("image""UTF-8") + "=" + URLEncoder.encode(imgStr, "UTF-8");

        RequestParams entiry = new RequestParams(ConstantValue.BAIDU_TOKEN_URL);

        x.http().get(entiry, new Callback.CommonCallback<String>() {
            @Override
            public void onSuccess(final String result
{
                Gson gson = new Gson();
                TokenInfo tokenInfo = gson.fromJson(result, TokenInfo.class);

                final String access_token = tokenInfo.getAccess_token();

                new Thread() {
                    public void run() {


                        public static final String BAIDU_TOKEN_URL
                                = "https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id=" + 你在百度控制台创建的AK+ "&client_secret=" +
                                你在百度控制台创建的SK;

                        String resultStr = HttpUtil.post(ConstantValue.BAIDU_INTER_URL, access_token, params);
                        Log.e("MainActivity""MainActivity onSuccess()" + resultStr);
                        Message msg = Message.obtain();
                        msg.obj = resultStr;
                        msg.what = PRESER_IMG_OK;
                        handler.sendMessage(msg);
                    }
                }.start();
            }
            @Override
            public void onError(Throwable ex, boolean isOnCallback
{

            }
            @Override
            public void onCancelled(CancelledException cex
{
            }
            @Override
            public void onFinished() 
{
            }
        });
    } catch (UnsupportedEncodingException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

解析数据,官方返回的是一个json串。所以我们进行解析数据

private static Handler handler = new Handler() {
    public void handleMessage(Message msg{
        switch (msg.what) {
            case PRESER_IMG_OK:
                String data = (String) msg.obj;
                preserData(data);

                break;
        }
    }
};

private static void preserData(String data{

    Gson gson = new Gson();
    WordInfo wordInfo = gson.fromJson(data, WordInfo.class);

    if(wordInfo.getError_code() != null) {
        if (wordInfo.getError_code() == 17 || wordInfo.getError_code() == 19 || wordInfo.getError_code() == 18) {
            Toast.makeText(MyApp.getContext(), "请求量超出限额", Toast.LENGTH_SHORT).show();
            return;
        }

    }

    if (wordInfo.getWords_result() == null || wordInfo.getWords_result_num() < 0 || wordInfo.getWords_result().size() == 0) {
        Toast.makeText(MyApp.getContext(), "文字扫描识别失败,请重试", Toast.LENGTH_SHORT).show();
        return;
    }

    wordInfo.getWords_result() ;//这里面就是扫描出来的数据

}

FileUtil

public static File getSaveFile(Context context{
        File file = new File(context.getFilesDir(), "pic.jpg");
        return file;
    }

    /**
     * 根据文件路径读取byte[] 数组
     */

    public static byte[] readFileByBytes(String filePath) throws IOException {
        File file = new File(filePath);
        if (!file.exists()) {
            throw new FileNotFoundException(filePath);
        } else {
            ByteArrayOutputStream bos = new ByteArrayOutputStream((int) file.length());
            BufferedInputStream in = null;

            try {
                in = new BufferedInputStream(new FileInputStream(file));
                short bufSize = 1024;
                byte[] buffer = new byte[bufSize];
                int len1;
                while (-1 != (len1 = in.read(buffer, 0, bufSize))) {
                    bos.write(buffer, 0, len1);
                }

                byte[] var7 = bos.toByteArray();
                return var7;
            } finally {
                try {
                    if (in != null) {
                        in.close();
                    }
                } catch (IOException var14) {
                    var14.printStackTrace();
                }

                bos.close();
            }
        }
    }
}

HttpUtils

/**
 * http 工具类
 */

public class HttpUtil {

    public static String post(String requestUrl, String accessToken, String params)  {
        try {
            String generalUrl = requestUrl + "?access_token=" + accessToken;
            URL url = new URL(generalUrl);
            // 打开和URL之间的连接
            HttpURLConnection connection = (HttpURLConnection) url.openConnection();
            connection.setRequestMethod("POST");
            // 设置通用的请求属性
            connection.setRequestProperty("Content-Type""application/x-www-form-urlencoded");
            connection.setRequestProperty("Connection""Keep-Alive");
            connection.setUseCaches(false);
            connection.setDoOutput(true);
            connection.setDoInput(true);

            // 得到请求的输出流对象
            DataOutputStream out = new DataOutputStream(connection.getOutputStream());
            out.writeBytes(params);
            out.flush();
            out.close();

            // 建立实际的连接
            connection.connect();
            // 获取所有响应头字段
            Map<String, List<String>> headers = connection.getHeaderFields();
            // 遍历所有的响应头字段
            for (String key : headers.keySet()) {
                System.out.println(key + "--->" + headers.get(key));
            }
            // 定义 BufferedReader输入流来读取URL的响应
            BufferedReader in = null;
            if (requestUrl.contains("nlp"))
                in = new BufferedReader(new InputStreamReader(connection.getInputStream(), "GBK"));
            else
                in = new BufferedReader(new InputStreamReader(connection.getInputStream(), "UTF-8"));
            String result = "";
            String getLine;
            while ((getLine = in.readLine()) != null) {
                result += getLine;
            }
            in.close();
            System.out.println("result:" + result);
            return result;
        }catch (Exception e){
            throw new RuntimeException(e);
        }
    }
}

Base64Util

/**
 * Base64 工具类
 */

public class Base64Util {
    private static final char last2byte = (char) Integer.parseInt("00000011"2);
    private static final char last4byte = (char) Integer.parseInt("00001111"2);
    private static final char last6byte = (char) Integer.parseInt("00111111"2);
    private static final char lead6byte = (char) Integer.parseInt("11111100"2);
    private static final char lead4byte = (char) Integer.parseInt("11110000"2);
    private static final char lead2byte = (char) Integer.parseInt("11000000"2);
    private static final char[] encodeTable = new char[]{'A''B''C''D''E''F''G''H''I''J''K''L''M''N''O''P''Q''R''S''T''U''V''W''X''Y''Z''a''b''c''d''e''f''g''h''i''j''k''l''m''n''o''p''q''r''s''t''u''v''w''x''y''z''0''1''2''3''4''5''6''7''8''9''+''/'};

    public Base64Util() {
    }

    public static String encode(byte[] from{
        StringBuilder to = new StringBuilder((int) ((doublefrom.length * 1.34D) + 3);
        int num = 0;
        char currentByte = 0;

        int i;
        for (i = 0; i < from.length; ++i) {
            for (num %= 8; num < 8; num += 6) {
                switch (num) {
                    case 0:
                        currentByte = (char) (from[i] & lead6byte);
                        currentByte = (char) (currentByte >>> 2);
                    case 1:
                    case 3:
                    case 5:
                    default:
                        break;
                    case 2:
                        currentByte = (char) (from[i] & last6byte);
                        break;
                    case 4:
                        currentByte = (char) (from[i] & last4byte);
                        currentByte = (char) (currentByte << 2);
                        if (i + 1 < from.length) {
                            currentByte = (char) (currentByte | (from[i + 1] & lead2byte) >>> 6);
                        }
                        break;
                    case 6:
                        currentByte = (char) (from[i] & last2byte);
                        currentByte = (char) (currentByte << 4);
                        if (i + 1 < from.length) {
                            currentByte = (char) (currentByte | (from[i + 1] & lead4byte) >>> 4);
                        }
                }

                to.append(encodeTable[currentByte]);
            }
        }

        if (to.length() % 4 != 0) {
            for (i = 4 - to.length() % 4; i > 0; --i) {
                to.append("=");
            }
        }

        return to.toString();
    }
}

这样就可以实现了。

本文的案例源码下载地址在这里哦!!!!

https://download.csdn.net/download/pyfysf/10406761

有问题可以加博主QQ哦。337081267

如果文章有错的地方欢迎指正,大家互相留言交流。习惯在微信看技术文章,想要获取更多的Java资源的同学,可以关注微信公众号:niceyoo

posted @ 2019-05-16 16:17 niceyoo 阅读(...) 评论(...) 编辑 收藏

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/414465.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Android studio ERROR: Software caused connection abort: recv failed 解决方法

使用Android studio打开kotlin项目时报错&#xff1a;ERROR: Software caused connection abort: recv failed 解决方法&#xff1a;修改三个文件即可 1、修改gradle-wrapper.properties 修改为当前Android studio的gradle版本 2、修改项目build.gradle 修改为当前Android st…

Android获取手机联系人或通讯录的基本信息(如姓名、电话)

1、添加权限 <uses-permission android:name"android.permission.READ_CONTACTS"/> <uses-permission android:name"android.permission.WRITE_EXTERNAL_STORAGE"/> <uses-permission android:name"android.permission.READ_EXTERNAL…

百度OCR文字识别-Android安全校验

百度OCR文字识别-Android安全校验 本文转载自好基友upuptop&#xff1a;https://blog.csdn.net/pyfysf/article/details/86438769 效果图&#xff1a; 如下为文章正文&#xff1a; 百度OCR接口使用总结&#xff1a;之前总结一下关于百度OCR文字识别接口的使用步骤&#xff08;…

Android vector矢量图应用实例

在drawable文件夹下创建vector.xml文件 <?xml version"1.0" encoding"utf-8"?> <vector xmlns:android"http://schemas.android.com/apk/res/android"android:height"64dp"android:width"64dp"android:viewpo…

Lint found fatal errors while assembling a release target

在打包APK时报错&#xff1a;Lint found fatal errors while assembling a release target Android在debug模式下应用没有问题&#xff0c;但是在打包release版本时出现一下问题&#xff1a; 解决方法&#xff1a; 1、打开app下build文件夹下reports文件夹下的lint-results-rel…

自定义注解-aop实现日志记录

关于注解&#xff0c;平时接触的可不少&#xff0c;像是 Controller、Service、Autowried 等等&#xff0c;不知道你是否有过这种疑惑&#xff0c;使用 Service 注解的类成为我们的业务类&#xff0c;使用 Controller 注解的类就成了请求的控制器&#xff0c;使用 Autowried 注…

JPA EnableJpaAuditing 审计功能

关于自动填充或更新实体中的 CreateDate、CreatedBy 等在之前有一篇 jeecg 默认为空的字段值是如何被填充的? 有提到通过拦截器的方式实现&#xff0c;但是今天带大家了解一下如果使用 JPA 的审计功能是如何简单实现该操作的。 JPA Audit 说明 在 Spring JPA 中&#xff0c;支…

前端学习(2789):改进导航栏并跳转

第一步:动态数据 第二步 页面渲染

Android 图片识别、图像识别

实现效果 基于百度智能云实现的图片识别 实现步骤 1、到百度智能云注册图像识别应用 https://console.bce.baidu.com/ai/?_1574674029784&fromai1#/ai/imagerecognition/overview/index 2、配置ID与key 3、实现demo&#xff1a;https://download.csdn.net/download/meix…

WebSocket 实现前后端通信的笔记

之前在做站内信时&#xff0c;用到了 WebSocket &#xff0c;整理了一些笔记分享如下。 本文基于 SpringBoot 2.1.5&#xff0c;本文不涉及环境搭建。 引入依赖 在 Spring 中要使用 WebSocket 功能&#xff0c;需要在pom中引入依赖&#xff1a; <dependency><groupI…

Android 地图搜索商家,检索关键字(高德地图,百度地图),地址搜索

1、高德地图 实现效果 打印数据 实现步骤&#xff1a; 1、首先去高德开放平台注册应用 高德开放平台&#xff1a;https://lbs.amap.com/ 2、点击 我的应用 ——>设置 注&#xff1a;SHA1获取方法&#xff1a;https://blog.…

全局异常捕获处理-@ControllerAdvice+@HandleException

涂涂影院管理系统这个demo中有个异常管理的标签&#xff0c;用于捕获 涂涂影院APP用户异常信息 &#xff0c;有小伙伴好奇&#xff0c;排除APP&#xff0c;后台端的是如何处理全局异常的&#xff0c;故项目中的实际应用已记之。 关于目前的异常处理 在使用全局异常处理之前&am…

前端学习(2791):实现上拉加载更多

判断页面是否有十条数据 没有 则消失

2019金球奖——梅西

在公元2019年12月3日&#xff0c;梅西加冕金球奖六冠王&#xff0c;今天我是梅西&#xff0c;今天属于梅西&#xff0c;祝贺梅西&#xff01; 王者气质 十全十美 实至名归 六金闪耀 蓦然回首&#xff0c;已是十年信仰

定时任务 Scheduled quartz

在项目应用中往往会用到任务定时器的功能&#xff0c;比如某某时间&#xff0c;或者多少多少秒然后执行某个骚操作等。 spring 支持多种定时任务的实现&#xff0c;其中不乏自身提供的定时器。 接下来介绍一下使用 spring 的定时器和使用 quartz 定时器。 前言 spring 自身提供…

前端学习(2792):下拉刷新

开启下拉刷新 延迟下拉刷新 解决下拉刷新 传递callback有就刷新 无就不刷新

Android 获取短信验证码,自动填充

1、申请权限 <uses-permission android:name"android.permission.RECEIVE_SMS" /> <uses-permission android:name"android.permission.READ_SMS" /> API>23动态申请权限 private static final String[] authBaseArr {//申请类型Manife…