专栏首页upuptop的专栏【原创】com.baidu.ocr.sdk.exception.SDKError[283604]
原创

【原创】com.baidu.ocr.sdk.exception.SDKError[283604]

异常com.baidu.ocr.sdk.exception.SDKError[283604]App identifier unmatch.错误的packname或bundleId.logId::30309247

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

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

最终实现的效果(识别的有些慢,是由于我的网速原因。-_-)

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

比如TOKEN ERROR了。等等。

注册登录百度云平台

首先注册百度账号,点击这里跳转到百度API接口首页

点击控制台进行登录注册。

选择服务,创建应用

选择需要包名的朋友看过来 >>>>> https://blog.csdn.net/pyfysf/article/details/86438769

这个AK和SK是需要在代码中使用到的

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

点击这里进入API文档

博主使用的是Android平台的SDK。

根据步骤进行SDK工程配置。

配置完工程之后博主就很惊喜的去调用方法进行写代码了。但是,logcat总是报错。说获取token失败,packname错误或者AK和SK错误。

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

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

查阅API文档。

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

下面将贴一些代码片段。

博主是打开相机拍一张照片进行扫描实现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和HttpUtils

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();
            }
        }
    }
}
/**
 * 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) ((double) from.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();
    }
}

这样就可以实现了。

关注【趣学程序】微信公众号,回复“百度OCR”即可获取

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

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

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

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

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

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 原创 | Springboot任务

    异步任务:其实就是一个很特别的方法,这个方法没有返回值(也可以有返回值,后面会说的),但是方法内部的逻辑会耗费很多时间!例如,用户请求每次到controller...

    润森
  • 跨域详解 【原创】

    跨域详解 Write By CS逍遥剑仙 我的主页: www.csxiaoyao.com GitHub: github.com/csxiaoy...

    CS逍遥剑仙
  • LESS 学习demo 【原创】

    LESS 学习demo Write By CS逍遥剑仙 我的主页: www.csxiaoyao.com GitHub: github.com/...

    CS逍遥剑仙
  • 原创本源之味

    腾讯ISUX
  • 原创Java版的Shell

    如果你接触过windows操作系统,你应该对windows中的cmd有一定的了解。

    Hongten
  • 原创 | Springboot整合RabbitMQ

    MQ全称为Message Queue, 消息队列(MQ)是一种应用程序对应用程序的通信方法。MQ是消费-生产者模型的一个典型的代表,一端往消息队列中不断写入消息...

    润森
  • (转载非原创)RPC原理详解

    只是觉得写的很好分享到腾讯云,推荐腾讯云服务器,除学生机外非常便宜的活动 腾讯云活动

    xlj
  • 原创哈希数据导出算法 原

    用户2836074
  • docker安装及原理 (转载非原创)

    转载来源:https://www.cnblogs.com/ITPower/p/15329057.html

    xlj
  • 原创?把知识连起来就是创意

    用户1756920
  • macos下golang配置 【原创】

    macos下golang配置 Write By CS逍遥剑仙 我的主页: www.csxiaoyao.com GitHub: github.c...

    CS逍遥剑仙
  • vim按键整理 【原创】

    vim按键整理 Write By CS逍遥剑仙 我的主页: www.csxiaoyao.com GitHub: github.com/csxi...

    CS逍遥剑仙
  • Gulp学习笔记 【原创】

    Gulp学习笔记 Write By CS逍遥剑仙 我的主页: www.csxiaoyao.com GitHub: github.com/csx...

    CS逍遥剑仙
  • Webpack学习总结 【原创】

    Webpack学习总结 Write By CS逍遥剑仙 我的主页: www.csxiaoyao.com GitHub: github.com/...

    CS逍遥剑仙
  • weex 踩坑笔记 【原创】

    weex 踩坑笔记 Write By CS逍遥剑仙 我的主页: www.csxiaoyao.com GitHub: github.com/cs...

    CS逍遥剑仙
  • (原创)python发送邮件

    七夜安全博客
  • Bash脚本编程(原创)

    Bash,Unix shell的一種,在1987年由布萊恩·福克斯為了GNU計劃而编写。1989年釋出第一個正式版本,原先是計劃用在GNU作業系統上,但能运行于...

    用户2645267
  • (原创)详解KMP算法

    KMP算法应该是每一本《数据结构》书都会讲的,算是知名度最高的算法之一了,但很可惜,我大二那年压根就没看懂过~~~ 之后也在很多地方也都经常看到讲解KMP算法的...

    marsggbo
  • MongoDB 学习笔记(原创)

    MongoDB 学习笔记 mongodb 数据库 nosql 一、数据库的基本概念及操作 SQL术语/概念MongoDB术语/概念解释/说明databaseda...

    marsggbo

扫码关注云+社区

领取腾讯云代金券