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

異常com.baidu.ocr.sdk.exception.SDKError[283604]App identifier unmatch.錯誤的packname或bundleId.logId::30309247html

 

本文的案例源碼下載地址在這裏哦!!!!java

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

最終實現的效果(識別的有些慢,是因爲個人網速緣由。-_-)數組

 

最近有個小項目使用到了OCR技術,順便到網上搜索了一下,你們都在使用百度的API。因此我就調用了百度的接口。在使用的過程當中也是遇到了各類各樣的錯誤。網絡

好比TOKEN ERROR了。等等。app

 

註冊登陸百度雲平臺

首先註冊百度帳號,點擊這裏跳轉到百度API接口首頁ide

點擊控制檯進行登陸註冊。工具

 

選擇服務,建立應用

 

 

 

 

選擇須要包名的朋友看過來 >>>>> https://blog.csdn.net/pyfysf/article/details/86438769佈局

 

這個AK和SK是須要在代碼中使用到的post

配置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

/**
 * 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);
        }
    }
}

 

 



這樣就能夠實現了。

 



本文的案例源碼下載地址在這裏哦!!!!

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

 

有問題能夠加博主QQ哦。337081267

 

 

 

本文的案例源碼下載地址在這裏哦!!!!

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

相關文章
相關標籤/搜索