Android百度文字识别全攻略:集成步骤与源码解析
2025.09.19 15:38浏览量:0简介:本文详细介绍如何在Android项目中集成百度OCR文字识别功能,涵盖环境准备、权限配置、API调用及源码实现,助力开发者快速实现图像文字提取。
Android百度文字识别全攻略:集成步骤与源码解析
在移动端开发中,文字识别(OCR)是常见的功能需求,如身份证识别、票据扫描、文档提取等。百度OCR作为国内领先的文字识别服务,提供了高精度、多场景的API支持。本文将详细介绍如何在Android项目中集成百度OCR文字识别功能,包括环境准备、权限配置、API调用及完整源码实现。
一、环境准备与依赖集成
1.1 注册百度AI开放平台账号
首先需在百度AI开放平台注册账号,并创建文字识别应用。进入“文字识别”服务页面,获取以下关键信息:
- API Key:用于身份验证的密钥
- Secret Key:用于生成访问令牌的密钥
- Access Token:通过API Key和Secret Key动态获取的临时授权凭证
1.2 添加项目依赖
在Android项目的build.gradle
文件中添加百度OCR SDK依赖:
dependencies {
implementation 'com.baidu.aip:java-sdk:4.16.11' // 核心SDK
implementation 'com.squareup.okhttp3:okhttp:4.9.0' // 网络请求库
}
同步项目后,SDK将自动下载。
二、权限配置与初始化
2.1 添加Android权限
在AndroidManifest.xml
中声明必要权限:
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.CAMERA" />
对于Android 10及以上版本,需动态申请READ_EXTERNAL_STORAGE
权限。
2.2 初始化OCR客户端
创建AipOcr
实例并配置参数:
public class OCRManager {
private static final String APP_ID = "你的AppID";
private static final String API_KEY = "你的API Key";
private static final String SECRET_KEY = "你的Secret Key";
private AipOcr client;
public OCRManager() {
// 初始化客户端
client = new AipOcr(APP_ID, API_KEY, SECRET_KEY);
// 可选:设置网络请求超时时间
client.setConnectionTimeoutInMillis(2000);
client.setSocketTimeoutInMillis(60000);
}
public AipOcr getClient() {
return client;
}
}
三、核心功能实现
3.1 获取Access Token
百度OCR API需通过Access Token进行身份验证。可通过以下方式获取:
public class TokenUtil {
private static final String TOKEN_URL = "https://aip.baidubce.com/oauth/2.0/token";
public static String getAccessToken(String apiKey, String secretKey) {
OkHttpClient client = new OkHttpClient();
HttpUrl.Builder urlBuilder = HttpUrl.parse(TOKEN_URL).newBuilder();
urlBuilder.addQueryParameter("grant_type", "client_credentials");
urlBuilder.addQueryParameter("client_id", apiKey);
urlBuilder.addQueryParameter("client_secret", secretKey);
String url = urlBuilder.build().toString();
Request request = new Request.Builder()
.url(url)
.build();
try (Response response = client.newCall(request).execute()) {
String responseBody = response.body().string();
JSONObject jsonObject = new JSONObject(responseBody);
return jsonObject.getString("access_token");
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
}
注意:Access Token有效期为30天,建议缓存并定期刷新。
3.2 通用文字识别(高精度版)
调用basicGeneral
接口实现图片文字识别:
public class OCRService {
private AipOcr client;
public OCRService(AipOcr client) {
this.client = client;
}
public void recognizeText(Bitmap bitmap, OCRCallback callback) {
// 图片转Base64
ByteArrayOutputStream baos = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, baos);
byte[] bytes = baos.toByteArray();
String imageBase64 = Base64.encodeToString(bytes, Base64.DEFAULT);
// 异步调用OCR接口
client.basicGeneralAsync(imageBase64, new OnResultListener<OCRResult>() {
@Override
public void onResult(OCRResult result) {
if (result != null) {
List<OCRResult.WordsResult> wordsList = result.getWordsResult();
StringBuilder sb = new StringBuilder();
for (OCRResult.WordsResult item : wordsList) {
sb.append(item.getWords()).append("\n");
}
callback.onSuccess(sb.toString());
} else {
callback.onFailure("识别结果为空");
}
}
@Override
public void onError(AipError error) {
callback.onFailure("识别失败: " + error.toString());
}
});
}
public interface OCRCallback {
void onSuccess(String result);
void onFailure(String error);
}
}
3.3 身份证识别
调用idcard
接口实现身份证正反面识别:
public void recognizeIDCard(Bitmap bitmap, boolean isFront, OCRCallback callback) {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, baos);
byte[] bytes = baos.toByteArray();
String imageBase64 = Base64.encodeToString(bytes, Base64.DEFAULT);
HashMap<String, String> options = new HashMap<>();
options.put("id_card_side", isFront ? "front" : "back");
options.put("detect_direction", "true");
client.idcardAsync(imageBase64, options, new OnResultListener<IDCardResult>() {
@Override
public void onResult(IDCardResult result) {
if (result != null && result.getWordsResult() != null) {
IDCardResult.WordsResult words = result.getWordsResult();
StringBuilder sb = new StringBuilder();
if (isFront) {
sb.append("姓名: ").append(words.getName().getWords()).append("\n");
sb.append("性别: ").append(words.getGender().getWords()).append("\n");
sb.append("民族: ").append(words.getEthnic().getWords()).append("\n");
} else {
sb.append("签发机关: ").append(words.getAuthority().getWords()).append("\n");
sb.append("有效期: ").append(words.getValidDate().getWords()).append("\n");
}
callback.onSuccess(sb.toString());
} else {
callback.onFailure("识别结果为空");
}
}
@Override
public void onError(AipError error) {
callback.onFailure("身份证识别失败: " + error.toString());
}
});
}
四、完整源码示例
4.1 主Activity实现
public class MainActivity extends AppCompatActivity {
private OCRManager ocrManager;
private OCRService ocrService;
private Button btnRecognize;
private TextView tvResult;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 初始化OCR客户端
ocrManager = new OCRManager();
ocrService = new OCRService(ocrManager.getClient());
btnRecognize = findViewById(R.id.btn_recognize);
tvResult = findViewById(R.id.tv_result);
btnRecognize.setOnClickListener(v -> {
// 模拟从相册选择图片
Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.test_image);
recognizeImage(bitmap);
});
}
private void recognizeImage(Bitmap bitmap) {
ocrService.recognizeText(bitmap, new OCRService.OCRCallback() {
@Override
public void onSuccess(String result) {
runOnUiThread(() -> tvResult.setText(result));
}
@Override
public void onFailure(String error) {
runOnUiThread(() -> Toast.makeText(MainActivity.this, error, Toast.LENGTH_SHORT).show());
}
});
}
}
4.2 布局文件(activity_main.xml)
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:padding="16dp">
<Button
android:id="@+id/btn_recognize"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="识别图片文字" />
<ScrollView
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/tv_result"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textSize="16sp"
android:textColor="#000000" />
</ScrollView>
</LinearLayout>
五、优化与注意事项
图片预处理:
- 压缩图片以减少传输数据量
- 调整方向确保文字水平排列
- 增强对比度提升识别率
错误处理:
- 网络异常重试机制
- 识别结果空值检查
- 权限拒绝友好提示
性能优化:
- 异步调用避免UI阻塞
- 缓存Access Token
- 批量识别减少网络请求
安全考虑:
- 避免在客户端硬编码API Key
- 使用ProGuard混淆代码
- 敏感操作增加二次验证
六、扩展功能建议
多语言支持:
- 调用
basicGeneral
接口时设置language_type
参数(如ENG
英文)
- 调用
表格识别:
- 使用
form
接口识别表格结构并返回JSON格式数据
- 使用
银行卡识别:
- 调用
bankcard
接口快速提取卡号、有效期等信息
- 调用
自定义模板:
- 通过百度OCR控制台训练自定义识别模型
七、总结
本文详细介绍了Android平台集成百度OCR文字识别的完整流程,包括环境准备、权限配置、核心API调用及完整源码实现。通过本文,开发者可以快速实现:
- 通用文字识别(支持多场景)
- 身份证正反面识别
- 银行卡信息提取
- 表格结构化识别
实际开发中,建议结合项目需求选择合适的识别接口,并注意性能优化与安全防护。百度OCR提供的丰富API可满足大多数文字识别场景,助力开发者高效构建智能应用。
发表评论
登录后可评论,请前往 登录 或 注册