2013-07-08 59 views
0

我得到这个错误,每当我尝试我的设备上运行的代码,请告诉我,我要去哪里错了:Android的logcat的显示错误

07-08 19:32:46.159: E/AndroidRuntime(21554): FATAL EXCEPTION: main 
07-08 19:32:46.159: E/AndroidRuntime(21554): java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=0, result=-1, data=null} to activity {com.datumdroid.android.ocr.simple/com.datumdroid.android.ocr.simple.SimpleAndroidOCRActivity}: java.lang.NullPointerException 
07-08 19:32:46.159: E/AndroidRuntime(21554): at android.app.ActivityThread.deliverResults(ActivityThread.java:3182) 
07-08 19:32:46.159: E/AndroidRuntime(21554): at android.app.ActivityThread.handleSendResult(ActivityThread.java:3225) 
07-08 19:32:46.159: E/AndroidRuntime(21554): at android.app.ActivityThread.access$1100(ActivityThread.java:140) 
07-08 19:32:46.159: E/AndroidRuntime(21554): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1275) 
07-08 19:32:46.159: E/AndroidRuntime(21554): at android.os.Handler.dispatchMessage(Handler.java:99) 
07-08 19:32:46.159: E/AndroidRuntime(21554): at android.os.Looper.loop(Looper.java:137) 
07-08 19:32:46.159: E/AndroidRuntime(21554): at android.app.ActivityThread.main(ActivityThread.java:4898) 
07-08 19:32:46.159: E/AndroidRuntime(21554): at java.lang.reflect.Method.invokeNative(Native Method) 
07-08 19:32:46.159: E/AndroidRuntime(21554): at java.lang.reflect.Method.invoke(Method.java:511) 
07-08 19:32:46.159: E/AndroidRuntime(21554): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1008) 
07-08 19:32:46.159: E/AndroidRuntime(21554): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:775) 
07-08 19:32:46.159: E/AndroidRuntime(21554): at dalvik.system.NativeStart.main(Native Method) 
07-08 19:32:46.159: E/AndroidRuntime(21554): Caused by: java.lang.NullPointerException 
07-08 19:32:46.159: E/AndroidRuntime(21554): at com.datumdroid.android.ocr.simple.SimpleAndroidOCRActivity.speakWords(SimpleAndroidOCRActivity.java:239) 
07-08 19:32:46.159: E/AndroidRuntime(21554): at com.datumdroid.android.ocr.simple.SimpleAndroidOCRActivity.onPhotoTaken(SimpleAndroidOCRActivity.java:207) 
07-08 19:32:46.159: E/AndroidRuntime(21554): at com.datumdroid.android.ocr.simple.SimpleAndroidOCRActivity.onActivityResult(SimpleAndroidOCRActivity.java:123) 
07-08 19:32:46.159: E/AndroidRuntime(21554): at android.app.Activity.dispatchActivityResult(Activity.java:5390) 
07-08 19:32:46.159: E/AndroidRuntime(21554): at android.app.ActivityThread.deliverResults(ActivityThread.java:3178) 
07-08 19:32:46.159: E/AndroidRuntime(21554): ... 11 more 

而且代码

package com.datumdroid.android.ocr.simple; 

import java.io.File; 
import java.io.FileOutputStream; 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.OutputStream; 
import android.app.Activity; 
import android.content.Intent; 
import android.content.res.AssetManager; 
import android.graphics.Bitmap; 
import android.graphics.BitmapFactory; 
import android.graphics.Matrix; 
import android.media.ExifInterface; 
import android.net.Uri; 
import android.os.Bundle; 
import android.os.Environment; 
import android.provider.MediaStore; 
import android.util.Log; 
import android.view.View; 
import android.widget.Button; 
import android.widget.EditText; 
import android.speech.tts.TextToSpeech; 
import com.googlecode.tesseract.android.TessBaseAPI; 

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


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; 
private TextToSpeech myTTS; 

private int MY_DATA_CHECK_CODE = 0; 

protected static final String PHOTO_TAKEN = "photo_taken"; 

@Override 
public void onCreate(Bundle savedInstanceState) { 

    Intent checkTTSIntent = new Intent(); 
     checkTTSIntent.setAction(TextToSpeech.Engine.ACTION_CHECK_TTS_DATA); 
     startActivityForResult(checkTTSIntent, MY_DATA_CHECK_CODE); 


    // 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/eng.traineddata"); 
      //GZIPInputStream gin = new GZIPInputStream(in); 
      OutputStream out = new FileOutputStream(DATA_PATH 
        + "tessdata/eng.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()); 
     } 
    } 

    super.onCreate(savedInstanceState); 

    setContentView(R.layout.main); 

    // _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, 0); 
} 

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

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

    if (resultCode == -1) { 
     onPhotoTaken(); 
    } else { 
     Log.v(TAG, "User cancelled"); 
    } 
} 

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

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

protected void onPhotoTaken() { 
    _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(); 
    speakWords(recognizedText); 
    // 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. 

} 

private void speakWords(String speech) { 

    //speak straight away 
    myTTS.speak(speech, TextToSpeech.QUEUE_FLUSH, null); 
} 


} 
+0

myTTS为空,因为您没有初始化它。 – njzk2

+0

可以请你给我推荐一段代码来初始化它吗?我有点困惑。 – Akshay

回答

2

的问题出现在以下行中

myTTS.speak(speech, TextToSpeech.QUEUE_FLUSH, null); 

您正在使用myTTS而未初始化它。调用任何对象的任何成员方法之前,你需要初始化它首先

了解文字转语音API的详情,请参阅该文档here

0

为什么初始化活动这么晚?不应该只是你的创作的前两行?

super.onCreate(savedInstanceState); 
setContentView(R.layout.main); 

它不喜欢你正在更新savedInstanceState或布局文件?

+0

这根本不是问题。只要你不想尝试初始化'layout'里面的任何'View',就可以调用'setContentView'。 – codeMagic

+0

某处handleSendResult正在被调用,我猜这个活动在显示UI之前就返回了一些值。所以我猜测。让我们等一会儿再看一些评论。我会删除答案,别担心。 – Siddharth