Android 电子词典拍照翻译功能设计思路及流程图
Android 电子词典拍照翻译功能设计思路及流程图
设计思路:
- 引入相机权限和相机调用功能,使用Android自带的相机应用进行拍照。
- 在拍照后将图片进行处理,使用OCR技术将图片中的文字识别出来。
- 将识别出来的文字展示在页面上,用户可以对其进行编辑或直接保存。
- 在保存时,用户可以选择将其保存到已有的单词夹中或新建一个单词夹并保存。
- 如果选择将其保存到已有的单词夹中,需要先展示所有已有单词夹供用户选择。
- 如果选择新建单词夹并保存,需要先创建一个新的单词夹,然后将识别出来的单词保存到该单词夹中。
- 保存成功后,提示用户保存成功。
设计流程图:
- 用户点击'拍照翻译'功能。
- 系统调用相机应用进行拍照。
- 系统将拍摄的照片进行处理,使用OCR技术将图片中的文字识别出来。
- 系统将识别出来的文字展示在页面上。
- 用户可以对识别出来的文字进行编辑或直接保存。
- 如果用户选择将其保存到已有的单词夹中,系统展示所有已有单词夹供用户选择。
- 如果用户选择新建单词夹并保存,系统先创建一个新的单词夹,然后将识别出来的单词保存到该单词夹中。
- 保存成功后,系统提示用户保存成功。
代码示例:
public class OCRActivity extends BaseActivity {
private EditText editText;
private TextView textStart;
private ImageView imgInto;
private static final String TAG = "OCRActivity";
private final String[] choices = {"选择已有单词夹", "自动存入新建单词夹"};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_ocr);
init();
StringBuilder stringBuilder = new StringBuilder();
if (!WordController.needLearnWords.isEmpty()) {
for (Integer integer : WordController.needLearnWords) {
List<Word> words = LitePal.where("wordId = ?", integer + "").select("word").find(Word.class);
stringBuilder.append(words.get(0).getWord() + "\n");
}
editText.setText(stringBuilder.toString());
}
textStart.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String[] result = editText.getText().toString().toLowerCase().split("\n");
if (result.length >= 1) {
WordController.needLearnWords.clear();
HashMap<Integer, Integer> map = new HashMap<>();
for (int i = 0; i < result.length; ++i) {
Log.d(TAG, i + result[i]);
List<Word> words = LitePal.where("word = ?", result[i]).select("wordId", "word").find(Word.class);
if (!words.isEmpty()) {
Log.d(TAG, i + "我找到了" + words.get(0).getWord());
if (!map.containsValue(words.get(0).getWordId())) {
map.put(i, words.get(0).getWordId());
Log.d(TAG, "我已添加" + words.get(0).getWord());
}
}
}
for (int ii : map.keySet()) {
WordController.needLearnWords.add(map.get(ii));
}
Log.d(TAG, "长度:" + WordController.needLearnWords.size());
WordController.justLearnedWords.clear();
WordController.needReviewWords.clear();
LearnWordActivity.lastWordMean = "";
LearnWordActivity.lastWord = "";
if (WordController.needLearnWords.size() != 0) {
Intent intent = new Intent(OCRActivity.this, LearnWordActivity.class);
intent.putExtra(LearnWordActivity.MODE_NAME, LearnWordActivity.MODE_ONCE);
startActivity(intent);
Toast.makeText(OCRActivity.this, "开始背单词", Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(OCRActivity.this, "请输入合法单词", Toast.LENGTH_SHORT).show();
}
}
}
});
imgInto.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
AlertDialog.Builder builder = new AlertDialog.Builder(OCRActivity.this);
builder.setSingleChoiceItems(choices, -1, new DialogInterface.OnClickListener() {
@Override
public void onClick(final DialogInterface dialog, final int which) {
// 延迟500毫秒取消对话框
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
dialog.dismiss();
if (which == 0) {
final List<WordFolder> wordFolders = LitePal.findAll(WordFolder.class);
if (!wordFolders.isEmpty()){
String[] folderNames = new String[wordFolders.size()];
for (int i = 0; i < wordFolders.size(); ++i) {
folderNames[i] = wordFolders.get(i).getName();
}
AlertDialog.Builder builder2 = new AlertDialog.Builder(OCRActivity.this);
builder2.setSingleChoiceItems(folderNames, -1, new DialogInterface.OnClickListener() {
@Override
public void onClick(final DialogInterface dialog, final int which) {
// 延迟500毫秒取消对话框
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
dialog.dismiss();
String[] result = editText.getText().toString().toLowerCase().split("\n");
if (result.length >= 1) {
HashMap<Integer, Integer> map = new HashMap<>();
for (int i = 0; i < result.length; ++i) {
Log.d(TAG, i + result[i]);
List<Word> words = LitePal.where("word = ?", result[i]).select("wordId", "word").find(Word.class);
if (!words.isEmpty()) {
Log.d(TAG, i + "我找到了" + words.get(0).getWord());
if (!map.containsValue(words.get(0).getWordId())) {
map.put(i, words.get(0).getWordId());
Log.d(TAG, "我已添加" + words.get(0).getWord());
}
}
}
for (int ii : map.keySet()) {
List<FolderLinkWord> folderLinkWords = LitePal.where("wordId = ? and folderId = ?", map.get(ii) + "", wordFolders.get(which).getId() + "").find(FolderLinkWord.class);
if (folderLinkWords.isEmpty()) {
FolderLinkWord folderLinkWord = new FolderLinkWord();
folderLinkWord.setFolderId(wordFolders.get(which).getId());
folderLinkWord.setWordId(map.get(ii));
folderLinkWord.save();
}
}
Toast.makeText(OCRActivity.this, "保存成功!", Toast.LENGTH_SHORT).show();
}
}
}, 200);
}
}).show();
} else {
Toast.makeText(OCRActivity.this, "当前暂无单词夹", Toast.LENGTH_SHORT).show();
}
} else {
String[] result = editText.getText().toString().toLowerCase().split("\n");
if (result.length >= 1) {
HashMap<Integer, Integer> map = new HashMap<>();
for (int i = 0; i < result.length; ++i) {
Log.d(TAG, i + result[i]);
List<Word> words = LitePal.where("word = ?", result[i]).select("wordId", "word").find(Word.class);
if (!words.isEmpty()) {
if (!map.containsValue(words.get(0).getWordId())) {
map.put(i, words.get(0).getWordId());
}
}
}
long currentTime = TimeController.getCurrentTimeStamp();
WordFolder wordFolder = new WordFolder();
wordFolder.setName("拍照取词");
wordFolder.setRemark("自动创建于:" + TimeController.getStringDateDetail(currentTime));
wordFolder.setCreateTime(currentTime + "");
if (wordFolder.save()) {
List<WordFolder> wordFolders = LitePal.where("createTime = ? and name = ?", currentTime + "", "拍照取词").find(WordFolder.class);
if (!wordFolders.isEmpty()) {
for (int ii : map.keySet()) {
List<FolderLinkWord> folderLinkWords = LitePal.where("wordId = ? and folderId = ?", map.get(ii) + "", wordFolders.get(0).getId() + "").find(FolderLinkWord.class);
if (folderLinkWords.isEmpty()) {
FolderLinkWord folderLinkWord = new FolderLinkWord();
folderLinkWord.setFolderId(wordFolders.get(0).getId());
folderLinkWord.setWordId(map.get(ii));
folderLinkWord.save();
}
}
}
Toast.makeText(OCRActivity.this, "保存成功!", Toast.LENGTH_SHORT).show();
}
}
}
}
}, 200);
}
}).show();
}
});
}
private void init() {
editText = findViewById(R.id.edit_ocr_result);
textStart = findViewById(R.id.text_ocr_start);
imgInto = findViewById(R.id.img_ocr_into);
}
@Override
public void onBackPressed() {
super.onBackPressed();
finish();
}
@Override
protected void onDestroy() {
super.onDestroy();
WordController.needLearnWords.clear();
}
}
原文地址: https://www.cveoy.top/t/topic/jT7o 著作权归作者所有。请勿转载和采集!