首页 > 解决方案 > 字符串不是在 Android Studio 中的第一个按钮单击时构建的

问题描述

我正在制作一个文本识别应用程序,一个非常基本的应用程序。用户目前可以从他们的图库中抓取照片,它会出现在应用程序中,并带有将文本从图像转换为 pdf 格式的选项。问题是,我必须调用该函数两次才能让我的 String 变量正确获取它应该具有的信息,特别是文本识别结果。第一次,我可以看到正在使用正确的位图,并且在构建正在构建的字符串的方法中。我已经为这些情况制作了日志,以尝试追踪问题以及第一次没有正确制作的地方,但是经过数小时的搜索后我找不到任何东西。有人请指教。

    private String processTextRecognitionToPDF(Text texts){
        
        blocks = texts.getTextBlocks();
        if (blocks.size() == 0) {
            stringBuilder.append("There was no text found");
            return null;
        }
        //resultText = texts.getText();
        for (Text.TextBlock block : texts.getTextBlocks()) {
            blockText += block.getText()+" ";
            Log.e(TAG, "processTextRecognitionToPDF: checking blockText result "+blockText );
        }
        return blockText;
        
    }

我尝试在上面显示的 for 循环内部、外部、其他方法中使用 stringBuilder。奇怪的是,在这里,我放置了一个日志,blockText 被视为具有我想要在其中包含的信息。

返回 blockText 是仅将其设置为等于某个值的替代方法,我认为可能在 for 循环内部会导致 blockText 被遗忘。

退出此方法后,日志显示 blockText 恢复为我为其设置的默认值。是的,我尝试使用 stringBuilder 在 for 循环中追加,因为无论如何这都是可取的。第一次没有任何工作。

然后,在我第二次点击按钮生成 PDF 时,blockText 神奇地拾取了正确的信息并按照我的需要将其加载到 PDF 中。

另一个重要的信息。当我遇到这个问题后选择一张新照片时,该新照片的第一个按钮单击将是上一张照片的文本结果。我已经尝试一直跟踪到源头,但我找不到发生这种情况的位置或原因。

更多可能相关的代码:

mGeneratePDF.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                // calling method to
                // generate our PDF file.
                new Handler().post(new Runnable() {
                    @Override
                    public void run() {
                        generatePDF();
                    }
                });

            }
        });

~~~~~~~~

 private void generatePDF() {
        
        PdfDocument pdfDocument = null;

        if(mSelectedImage != null){
            if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.KITKAT) {
                generatePDFFileName();
                pdfDocument = new PdfDocument();
                
                Paint paint = new Paint();
                Paint title = new Paint();
              
                PdfDocument.PageInfo mypageInfo = new PdfDocument.PageInfo.Builder(pagewidth, pageHeight, 1).create();

                
                PdfDocument.Page myPage = pdfDocument.startPage(mypageInfo);

                
                Canvas canvas = myPage.getCanvas();

                title.setTypeface(Typeface.create(Typeface.DEFAULT, Typeface.NORMAL));
         
                title.setTextSize(10);
               
                title.setColor(ContextCompat.getColor(this, R.color.purple_200));
                               
                title.setTextAlign(Paint.Align.CENTER);
                title.setSubpixelText(true);
                runTextRecogToPDF(canvas,title);
                
                int length = stringBuilder.length();
                // even though stringBuilder should be complete now, it is still empty at this point on first click
                Log.e(TAG, "generatePDF: checking stringbuilder "+ stringBuilder.toString() );

                if (length == defaultTextLength){
                    Log.e(TAG, "generatePDF: checking blocktext "+ blockText );
                    stringBuilder.append(blockText);
                }
                canvas.drawText(stringBuilder.toString(), 400, 400, title);
                Log.e(TAG, "generatePDF: checking mSelectedImage is valid "+ mSelectedImage );
                stringBuilder.delete(0, stringBuilder.length());
                stringBuilder.append(defaultText);
                
                pdfDocument.finishPage(myPage);
              
                FileOutputStream os = null;
                File file = new File(Environment.getExternalStorageDirectory(), fileName);
                if (file.exists()){
                    generatePDFFileName();
                    file = new File(Environment.getExternalStorageDirectory(), fileName);
                }

                try {
                   
                    os = new FileOutputStream(file);
                    pdfDocument.writeTo(os);
        
                    Toast.makeText(MainActivity.this, "PDF file generated succesfully.", Toast.LENGTH_SHORT).show();
                } catch (IOException e) {
                    // below line is used
                    // to handle error
                    e.printStackTrace();
                } finally {
                    pdfDocument.close();
                    try {
                        os.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
        }
        else{
            showToast("No image selected for PDF generation");
        }
    }

标签: javaandroid-studiopdfstringbuilder

解决方案


推荐阅读