文件选择器未选择文件时应用程序崩溃

时间:2018-04-28 06:04:53

标签: android

我正在尝试使用Google的API构建OCR应用。现在,此活动允许用户使用文件选择器选择图像文件,从中提取文本。如果用户选择图像文件,但是如果您打开文件选择器而不选择文件,那么应用程序会崩溃。 假设您单击了浏览按钮并且文件选择器打开但您没有选择任何文件并按下后退按钮然后该案例应用程序崩溃,但如果您将选择一个文件,那么它工作正常。 我在这里附上代码。

package com.example.rahulranjan.synthesize;

import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.os.Environment;
import android.provider.MediaStore;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.text.method.ScrollingMovementMethod;
import android.util.Log;
import android.util.SparseArray;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;

import com.google.android.gms.vision.Frame;
import com.google.android.gms.vision.text.Text;
import com.google.android.gms.vision.text.TextBlock;
import com.google.android.gms.vision.text.TextRecognizer;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.UUID;

public class ocr extends AppCompatActivity {
    Button b, convert;
    EditText t;
    Uri uri;
    InputStream inputStream = null;
    String str = "";
    StringBuffer buf = new StringBuffer();
    String text;
    Bitmap bitmap;
    private String imagePath = "";
    TextView txtView;
   StringBuilder strBuilder2 = new StringBuilder();


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_ocr);



        b = (Button) findViewById(R.id.button);
        convert = (Button) findViewById(R.id.button2);
        t = (EditText) findViewById(R.id.editText);
        txtView = (TextView) findViewById(R.id.textView5);
        txtView.setMovementMethod(new ScrollingMovementMethod());

        b.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

                Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
                intent.setType(" */* ");
                startActivityForResult(intent, 7);

            }
        });

        File imagesFolder = new File(Environment.getExternalStorageDirectory(), "Syntesize Text");
        imagesFolder.mkdirs();

    }


    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {


        String fileSelected = data.getStringExtra("fileSelected");
        Bundle result = data.getExtras();
        if (resultCode == RESULT_OK) {
            if (data != null) {
                // Get the URI of the selected file

                Uri uri = data.getData();

                t.setText(uri.getPath().toString());


                try {
                    inputStream = getContentResolver().openInputStream(uri);
                } catch (FileNotFoundException e) {
                    e.printStackTrace();
                }

                try {
                    bitmap = MediaStore.Images.Media.getBitmap(this.getContentResolver(), uri);
                } catch (IOException e) {
                    e.printStackTrace();
                }

                TextRecognizer txtRecognizer = new TextRecognizer.Builder(getApplicationContext()).build();
                if (!txtRecognizer.isOperational()) {
                    // Shows if your Google Play services is not up to date or OCR is not supported for the device
                    //   txtView.setText("Detector dependencies are not yet available");
                    Toast toast = Toast.makeText(getApplicationContext(), "Detector dependencies are not yet available", Toast.LENGTH_LONG);
                    toast.show();
                } else {
                    // Set the bitmap taken to the frame to perform OCR Operations.
                    Frame frame = new Frame.Builder().setBitmap(bitmap).build();
                    SparseArray items = txtRecognizer.detect(frame);
                   StringBuilder strBuilder = new StringBuilder();


                        // The following Process is used to show how to use lines & elements as well
                        for (int i = 0; i < items.size(); i++) {
                            TextBlock item = (TextBlock) items.valueAt(i);
                            strBuilder.append(item.getValue());
                            strBuilder.append(".");
                            for (Text line : item.getComponents()) {
                                //extract scanned text lines here
                                Log.v("lines", line.getValue());
                                for (Text element : line.getComponents()) {
                                    //extract scanned text words here
                                    Log.v("element", element.getValue());
                                }
                            }
                        }
                    strBuilder2 = strBuilder;
                }

                    txtView.setText(strBuilder2.toString());
                }

            }

            super.onActivityResult(requestCode, resultCode, data);

        }




    public void clear(View view)
    {
        txtView.setText("");
    }


    public void convert(View view)
    {
      String data = strBuilder2.toString();


             File gpxfile = new File(Environment.getExternalStorageDirectory().toString()+"/Syntesize Text"+"/"+ UUID.randomUUID().toString()+".txt");
        try (FileWriter writer = new FileWriter(gpxfile)) {
            try {
                writer.append(data);
            } catch (IOException e1) {
                e1.printStackTrace();
            }
            try {
                writer.flush();
            } catch (IOException e1) {
                e1.printStackTrace();
            }
            writer.close();
        } catch (IOException e1) {
            e1.printStackTrace();
        }
        Toast.makeText(getApplicationContext(), "Saved", Toast.LENGTH_SHORT).show();
        }

    }

1 个答案:

答案 0 :(得分:1)

可能是NPE移动这两行

user

里面

    String fileSelected = data.getStringExtra("fileSelected");
    Bundle result = data.getExtras();

最终结果

 if (data != null) {

也可以更好地检查 @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (resultCode == RESULT_OK) { if (data != null) { // Get the URI of the selected file String fileSelected = data.getStringExtra("fileSelected"); Bundle result = data.getExtras(); Uri uri = data.getData(); t.setText(uri.getPath().toString()); try { inputStream = getContentResolver().openInputStream(uri); } catch (FileNotFoundException e) { e.printStackTrace(); } try { bitmap = MediaStore.Images.Media.getBitmap(this.getContentResolver(), uri); } catch (IOException e) { e.printStackTrace(); } TextRecognizer txtRecognizer = new TextRecognizer.Builder(getApplicationContext()).build(); if (!txtRecognizer.isOperational()) { // Shows if your Google Play services is not up to date or OCR is not supported for the device // txtView.setText("Detector dependencies are not yet available"); Toast toast = Toast.makeText(getApplicationContext(), "Detector dependencies are not yet available", Toast.LENGTH_LONG); toast.show(); } else { // Set the bitmap taken to the frame to perform OCR Operations. Frame frame = new Frame.Builder().setBitmap(bitmap).build(); SparseArray items = txtRecognizer.detect(frame); StringBuilder strBuilder = new StringBuilder(); // The following Process is used to show how to use lines & elements as well for (int i = 0; i < items.size(); i++) { TextBlock item = (TextBlock) items.valueAt(i); strBuilder.append(item.getValue()); strBuilder.append("."); for (Text line : item.getComponents()) { //extract scanned text lines here Log.v("lines", line.getValue()); for (Text element : line.getComponents()) { //extract scanned text words here Log.v("element", element.getValue()); } } } strBuilder2 = strBuilder; } txtView.setText(strBuilder2.toString()); } } super.onActivityResult(requestCode, resultCode, data); }

条件应该是

requestCode
相关问题