java,// 引入ML Kit依赖,implementation 'com.google.mlkit:text-recognition:17.0.3',// 核心代码示例,InputImage image = InputImage.fromBitmap(bitmap, 0);,TextRecognizer recognizer = TextRecognition.getClient();,recognizer.process(image).addOnSuccessListener(text -> { / 处理结果 / });,
“
在 app/build.gradle
中添加ML Kit依赖:
dependencies { implementation 'com.google.mlkit:text-recognition:17.0.4' }
同步Gradle后即可使用。
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:padding="16dp"> <Button android:id="@+id/btn_select_image" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="选择图片" /> <ImageView android:id="@+id/iv_selected_image" android:layout_width="match_parent" android:layout_height="200dp" android:scaleType="fitCenter" android:visibility="gone" /> <TextView android:id="@+id/tv_result" android:layout_width="match_parent" android:layout_height="wrap_content" android:textSize="16sp" android:textColor="#000" android:paddingTop="16dp" /> </LinearLayout>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
注意:Android 11及以上需动态申请权限。
import android.Manifest; import android.content.Intent; import android.content.pm.PackageManager; import android.graphics.Bitmap; import android.net.Uri; import android.os.Bundle; import android.provider.MediaStore; import android.view.View; import android.widget.Button; import android.widget.ImageView; import android.widget.TextView; import android.widget.Toast; import androidx.annotation.Nullable; import androidx.appcompat.app.AppCompatActivity; import androidx.core.app.ActivityCompat; import androidx.core.content.ContextCompat; import com.google.mlkit.vision.common.ModelDownloadConditions; import com.google.mlkit.vision.text.TextRecognition; import com.google.mlkit.vision.text.TextRecognizer; import com.google.mlkit.vision.text.latin.TextRecognizerOptions; import java.io.IOException; public class MainActivity extends AppCompatActivity { private static final int IMAGE_PICK_CODE = 100; private ImageView ivSelectedImage; private TextView tvResult; private TextRecognizer textRecognizer; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 初始化视图 ivSelectedImage = findViewById(R.id.iv_selected_image); tvResult = findViewById(R.id.tv_result); Button btnSelectImage = findViewById(R.id.btn_select_image); // 初始化OCR引擎(支持多语言可替换LanguageIdentifier) textRecognizer = TextRecognition.getClient(TextRecognizerOptions.DEFAULT_OPTIONS); // 检查存储权限 if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, 100); } // 绑定事件 btnSelectImage.setOnClickListener(v -> openImagePicker()); } // 打开系统相册选择图片 private void openImagePicker() { Intent intent = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI); startActivityForResult(intent, IMAGE_PICK_CODE); } // 处理图片选择结果 @Override protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == IMAGE_PICK_CODE && resultCode == RESULT_OK && data != null) { Uri imageUri = data.getData(); try { // 加载图片并显示 Bitmap bitmap = MediaStore.Images.Media.getBitmap(this.getContentResolver(), imageUri); ivSelectedImage.setImageBitmap(bitmap); ivSelectedImage.setVisibility(View.VISIBLE); // 执行文字识别 recognizeTextFromImage(bitmap); } catch (IOException e) { e.printStackTrace(); Toast.makeText(this, "图片加载失败", Toast.LENGTH_SHORT).show(); } } } // 使用ML Kit进行文字识别 private void recognizeTextFromImage(Bitmap bitmap) { textRecognizer.processImage(bitmap) .addOnSuccessListener(visionText -> { // 拼接识别结果 StringBuilder result = new StringBuilder(); for (com.google.mlkit.vision.text.Text.Element element : visionText.getTextBlocks()) { result.append(element.getText()).append(" "); } tvResult.setText(result.toString()); }) .addOnFailureListener(e -> { Toast.makeText(this, "识别失败: " + e.getMessage(), Toast.LENGTH_LONG).show(); }); } }
ImageView
中,下方 TextView
展示识别结果。问题 | 解决方案 |
---|---|
首次使用ML Kit需下载模型 | 自动完成,需保证网络畅通 |
Android 11+存储权限限制 | 使用 MediaStore 或 Storage Access Framework |
大分辨率图片可能导致内存溢出 | 对图片进行压缩处理 |
复杂背景或模糊文字识别率低 | 优化图片质量或预处理(如灰度化) |
解答:
TextRecognizerOptions
配置语言模型(如指定中文): TextRecognizerOptions options = new TextRecognizerOptions.Builder() .setLanguagePreference(TextRecognizerOptions.SUPPORTED_LANGUAGES[1]) // 中文为索引1 .build(); textRecognizer = TextRecognition.getClient(options);
解答:
CameraX
或 Intent
调用系统相机。 Bitmap
直接传入 recognizeTextFromImage()
。 // 启动相机Intent Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); startActivityForResult(takePictureIntent, CAMERA_REQUEST_CODE);