0

I am creating an android application that will use the OCR library which i got from here

When i am launching an application and after capturing the photo i am getting an error called

Failure delivering result ResultInfo{who=null, request=0, result=-1, data=null} to activity {reader.test.test.com.visitingcardreader/reader.test.test.com.visitingcardreader.MainActivity}: 
java.lang.NullPointerException: Attempt to invoke virtual method 'android.graphics.Bitmap android.graphics.Bitmap.copy(android.graphics.Bitmap$Config, boolean)' on a null object reference

What is that ? and can any one explain me how to solve this.

This my code

public class MainActivity extends Activity {
        public static final String PACKAGE_NAME = "com.datumdroid.android.ocr.simple";
        public static final String DATA_PATH = Environment
                .getExternalStorageDirectory().toString() + "/SimpleAndroidOCR/";
        private static final int CAMERA_REQUEST = 1888;

        // You should have the trained data file in assets folder
        // You can get them at:
        // http://code.google.com/p/tesseract-ocr/downloads/list
        public static final String lang = "eng";

        private static final String TAG = "SimpleAndroidOCR.java";

        protected Button _button;
        // protected ImageView _image;
        protected EditText _field;
        protected String _path;
        protected boolean _taken;
        public Intent data;

        protected static final String PHOTO_TAKEN = "photo_taken";

        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);

            String[] paths = new String[] { DATA_PATH, DATA_PATH + "tessdata/" };

            for (String path : paths) {
                File dir = new File(path);
                if (!dir.exists()) {
                    if (!dir.mkdirs()) {
                        Log.v(TAG, "ERROR: Creation of directory " + path + " on sdcard failed");
                        return;
                    } else {
                        Log.v(TAG, "Created directory " + path + " on sdcard");
                    }
                }

            }

            // lang.traineddata file with the app (in assets folder)
            // You can get them at:
            // http://code.google.com/p/tesseract-ocr/downloads/list
            // This area needs work and optimization
            if (!(new File(DATA_PATH + "tessdata/" + lang + ".traineddata")).exists()) {
                try {

                    AssetManager assetManager = getAssets();
                    InputStream in = assetManager.open("tessdata/" + lang + ".traineddata");
                    //GZIPInputStream gin = new GZIPInputStream(in);
                    OutputStream out = new FileOutputStream(DATA_PATH
                            + "tessdata/" + lang + ".traineddata");

                    // Transfer bytes from in to out
                    byte[] buf = new byte[1024];
                    int len;
                    //while ((lenf = gin.read(buff)) > 0) {
                    while ((len = in.read(buf)) > 0) {
                        out.write(buf, 0, len);
                    }
                    in.close();
                    //gin.close();
                    out.close();

                    Log.v(TAG, "Copied " + lang + " traineddata");
                } catch (IOException e) {
                    Log.e(TAG, "Was unable to copy " + lang + " traineddata " + e.toString());
                }
            }



            // _image = (ImageView) findViewById(R.id.image);
            _field = (EditText) findViewById(R.id.field);
            _button = (Button) findViewById(R.id.button);
            _button.setOnClickListener(new ButtonClickHandler());

            _path = DATA_PATH + "/ocr.jpg";
        }

        public class ButtonClickHandler implements View.OnClickListener {
            public void onClick(View view) {
                Log.v(TAG, "Starting Camera app");
                startCameraActivity();
            }
        }

        // Simple android photo capture:
        // http://labs.makemachine.net/2010/03/simple-android-photo-capture/

        protected void startCameraActivity() {
            File file = new File(_path);
            Uri outputFileUri = Uri.fromFile(file);

            final Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
            intent.putExtra(MediaStore.EXTRA_OUTPUT, outputFileUri);

            startActivityForResult(intent, CAMERA_REQUEST);
        }

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

            Log.i(TAG, "resultCode: " + resultCode);

            if (requestCode ==CAMERA_REQUEST) {
                onPhotoTaken(data);
            } else {
                Log.v(TAG, "User cancelled");
            }
        }

        @Override
        protected void onSaveInstanceState(Bundle outState) {
            outState.putBoolean(MainActivity.PHOTO_TAKEN, _taken);
        }

        @Override
        protected void onRestoreInstanceState(Bundle savedInstanceState) {
            Log.i(TAG, "onRestoreInstanceState()");
            if (savedInstanceState.getBoolean(MainActivity.PHOTO_TAKEN)) {
                onPhotoTaken(data);
            }
        }

        protected void  onPhotoTaken(Intent data) {
            _taken = true;

            BitmapFactory.Options options = new BitmapFactory.Options();
            options.inSampleSize = 4;

            Bitmap bitmap = BitmapFactory.decodeFile(_path, options);

            try {
                ExifInterface exif = new ExifInterface(_path);
                int exifOrientation = exif.getAttributeInt(
                        ExifInterface.TAG_ORIENTATION,
                        ExifInterface.ORIENTATION_NORMAL);

                Log.v(TAG, "Orient: " + exifOrientation);

                int rotate = 0;

                switch (exifOrientation) {
                    case ExifInterface.ORIENTATION_ROTATE_90:
                        rotate = 90;
                        break;
                    case ExifInterface.ORIENTATION_ROTATE_180:
                        rotate = 180;
                        break;
                    case ExifInterface.ORIENTATION_ROTATE_270:
                        rotate = 270;
                        break;
                }

                Log.v(TAG, "Rotation: " + rotate);

                if (rotate != 0) {

                    // Getting width & height of the given image.
                    int w = bitmap.getWidth();
                    int h = bitmap.getHeight();

                    // Setting pre rotate
                    Matrix mtx = new Matrix();
                    mtx.preRotate(rotate);

                    // Rotating Bitmap
                    bitmap = Bitmap.createBitmap(bitmap, 0, 0, w, h, mtx, false);
                }

                // Convert to ARGB_8888, required by tess
                    bitmap = bitmap.copy(Bitmap.Config.ARGB_8888, true);

            } catch (IOException e) {
                Log.e(TAG, "Couldn't correct orientation: " + e.toString());
            }

            // _image.setImageBitmap( bitmap );

            Log.v(TAG, "Before baseApi");

            TessBaseAPI baseApi = new TessBaseAPI();
            baseApi.setDebug(true);
            baseApi.init(DATA_PATH, lang);
            baseApi.setImage(bitmap);

            String recognizedText = baseApi.getUTF8Text();

            baseApi.end();

            // You now have the text in recognizedText var, you can do anything with it.
            // We will display a stripped out trimmed alpha-numeric version of it (if lang is eng)
            // so that garbage doesn't make it to the display.

            Log.v(TAG, "OCRED TEXT: " + recognizedText);

            if ( lang.equalsIgnoreCase("eng") ) {
                recognizedText = recognizedText.replaceAll("[^a-zA-Z0-9]+", " ");
            }

            recognizedText = recognizedText.trim();

            if ( recognizedText.length() != 0 ) {
                _field.setText(_field.getText().toString().length() == 0 ? recognizedText : _field.getText() + " " + recognizedText);
                _field.setSelection(_field.getText().toString().length());
            }

            // Cycle done.
        }


    }

This is my XML

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <Button
        android:id="@+id/button"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="@string/button_text" />

     <EditText
        android:id="@+id/field"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="@string/text_hint" />

</LinearLayout>

This is my logcat

Process: reader.test.test.com.visitingcardreader, PID: 24739
java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=0, result=-1, data=null} to activity {reader.visitingcard.lotus.com.visitingcardreader/reader.visitingcard.lotus.com.visitingcardreader.MainActivity}: 
java.lang.NullPointerException: Attempt to invoke virtual method 'android.graphics.Bitmap android.graphics.Bitmap.copy(android.graphics.Bitmap$Config, boolean)' on a null object reference
at android.app.ActivityThread.deliverResults(ActivityThread.java:3948)
at android.app.ActivityThread.handleSendResult(ActivityThread.java:3991)
at android.app.ActivityThread.-wrap16(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1542)
at android.os.Handler.dispatchMessage(Handler.java:111)
at android.os.Looper.loop(Looper.java:207)
at android.app.ActivityThread.main(ActivityThread.java:5769)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:789)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:679)
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'android.graphics.Bitmap android.graphics.Bitmap.copy(android.graphics.Bitmap$Config, boolean)' on a null object reference
at reader.visitingcard.lotus.com.visitingcardreader.MainActivity.onPhotoTaken(MainActivity.java:199)
at reader.visitingcard.lotus.com.visitingcardreader.MainActivity.onActivityResult(MainActivity.java:133)
at android.app.Activity.dispatchActivityResult(Activity.java:6845)
at android.app.ActivityThread.deliverResults(ActivityThread.java:3944)
at android.app.ActivityThread.handleSendResult(ActivityThread.java:3991) 
at android.app.ActivityThread.-wrap16(ActivityThread.java) 
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1542) 
at android.os.Handler.dispatchMessage(Handler.java:111) 
at android.os.Looper.loop(Looper.java:207) 
at android.app.ActivityThread.main(ActivityThread.java:5769) 
at java.lang.reflect.Method.invoke(Native Method) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:789) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:679)
V-rund Puro-hit
  • 5,518
  • 9
  • 31
  • 50
lakshmansundeep
  • 73
  • 2
  • 12

0 Answers0