Android 电子词典拍照翻译功能设计思路及流程图

设计思路:

  1. 引入相机权限和相机调用功能,使用Android自带的相机应用进行拍照。
  2. 在拍照后将图片进行处理,使用OCR技术将图片中的文字识别出来。
  3. 将识别出来的文字展示在页面上,用户可以对其进行编辑或直接保存。
  4. 在保存时,用户可以选择将其保存到已有的单词夹中或新建一个单词夹并保存。
  5. 如果选择将其保存到已有的单词夹中,需要先展示所有已有单词夹供用户选择。
  6. 如果选择新建单词夹并保存,需要先创建一个新的单词夹,然后将识别出来的单词保存到该单词夹中。
  7. 保存成功后,提示用户保存成功。

设计流程图:

  1. 用户点击'拍照翻译'功能。
  2. 系统调用相机应用进行拍照。
  3. 系统将拍摄的照片进行处理,使用OCR技术将图片中的文字识别出来。
  4. 系统将识别出来的文字展示在页面上。
  5. 用户可以对识别出来的文字进行编辑或直接保存。
  6. 如果用户选择将其保存到已有的单词夹中,系统展示所有已有单词夹供用户选择。
  7. 如果用户选择新建单词夹并保存,系统先创建一个新的单词夹,然后将识别出来的单词保存到该单词夹中。
  8. 保存成功后,系统提示用户保存成功。

代码示例:

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();
    }

}
Android 电子词典拍照翻译功能设计思路及流程图

原文地址: https://www.cveoy.top/t/topic/jT7o 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录