2015-11-02 49 views
0

我開發一個OCR文本語音應用程序爲Android。我被中間擊中了。當我運行應用程序時,它檢測到文件併發出相機快門聲,並顯示「意外的應用程序已停止」 請有人幫我解決這個問題。 圖像捕捉,保存到存儲和保存的文本文件進行編碼兩個波紋管類Android應用程序自動不創建一個目錄來保存我的應用程序捕獲的圖像

HelloOpenCvActivity.java

import java.text.SimpleDateFormat; 
import java.util.ArrayList; 
import java.util.Date; 
import java.util.List; 
import java.util.Timer; 
import java.util.TimerTask; 
import org.opencv.android.BaseLoaderCallback; 
import org.opencv.android.CameraBridgeViewBase.CvCameraViewFrame; 
import org.opencv.android.CameraBridgeViewBase.CvCameraViewListener2; 
import org.opencv.android.LoaderCallbackInterface; 
import org.opencv.android.OpenCVLoader; 
import org.opencv.core.Mat; 
import org.opencv.core.MatOfPoint; 
import org.opencv.core.Scalar; 
import org.opencv.imgproc.Imgproc; 
import android.annotation.SuppressLint; 
import android.app.Activity; 
import android.content.Context; 
import android.content.Intent; 
import android.content.pm.PackageManager; 
import android.hardware.Camera.Size; 
import android.media.Ringtone; 
import android.media.RingtoneManager; 
import android.net.Uri; 
import android.os.Bundle; 
import android.os.Environment; 
import android.speech.tts.TextToSpeech; 
import android.util.Log; 
import android.view.Menu; 
import android.view.MenuItem; 
import android.view.SurfaceView; 
import android.view.WindowManager; 
import android.widget.Toast; 

public class HelloOpenCvActivity extends Activity implements 
CvCameraViewListener2, TextToSpeech.OnInitListener { 

public static TextToSpeech mTts; 
private static final int MY_DATA_CHECK_CODE = 1234; 
private HelloViewer mOpenCvCameraView; 
private boolean killed = false; 
private Uri notification; 
private Ringtone ringTone; 
private Timer timer = new Timer(); 
private MenuItem mItemLanguage = null; 
private boolean mIsJavaCamera = true; 
public static String lang = "eng"; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); 
    setContentView(R.layout.opencv_layout); 

    // setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR_PORTRAIT); 
    mOpenCvCameraView = (HelloViewer) findViewById(R.id.HelloOpenCvView); 
    mOpenCvCameraView.setVisibility(SurfaceView.VISIBLE); 
    mOpenCvCameraView.setCvCameraViewListener(this); 


    notification = RingtoneManager 
      .getDefaultUri(RingtoneManager.TYPE_NOTIFICATION); 
    ringTone = RingtoneManager.getRingtone(getApplicationContext(), 
      notification); 


    // Fire off an intent to check if a TTS engine is installed 
    Intent checkIntent = new Intent(); 
    checkIntent.setAction(TextToSpeech.Engine.ACTION_CHECK_TTS_DATA); 
    startActivityForResult(checkIntent, MY_DATA_CHECK_CODE); 
} 

@Override 
public void onPause() { 
    super.onPause(); 
    //shutdownCamera(); 
} 

@Override 
public void onDestroy() { 
    super.onDestroy(); 
    shutdownCamera(); 

    if (mTts != null) { 
     mTts.stop(); 
     mTts.shutdown(); 
    } 
} 

@Override 
public void onCameraViewStarted(int width, int height) { 
    try { 
     Thread.sleep(1000); 
    } catch (InterruptedException e) { 
     Log.e(Util.TAG, "Sleeping failed before starting camera view. ", e); 
    } 
    Size resolution = mOpenCvCameraView.getResolution(); 
    mOpenCvCameraView.setResolution(resolution); 
    mOpenCvCameraView.setAutoFocus(); 
} 

@Override 
public void onCameraViewStopped() { 
} 

@Override 
public Mat onCameraFrame(CvCameraViewFrame inputFrame) { 
    Mat mRgba = null; 
    try { 
     mRgba = inputFrame.rgba(); 

     List<MatOfPoint> contours = new ArrayList<MatOfPoint>(); 

      contours.add(DetectSquares.find(mRgba)); 
      if (contours.get(0) != null) { 
       Imgproc.drawContours(mRgba, contours, -1, new Scalar(0, 255, 0), 4); 

       if (!killed) { 
        killed = true; 
        ringTone.play(); 

        timer = new Timer(); 
        timer.schedule(new TimerTask() { 
         @Override 
         public void run() { 
          ringTone.stop(); 
          captureImage(); 
         } 
        }, 4 * 1000); 
       } 
      } else { 
       killed = false; 
       ringTone.stop(); 
       timer.cancel(); 
      } 
    } catch (Exception exc) { 
     Log.e(Util.TAG, "Error occured" + exc.getMessage()); 
    } 

    return mRgba; 
} 

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    mItemLanguage = menu.add("Toggle between languages"); 
    return true; 
} 

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
     String toastMesage = new String(); 
     Log.i(Util.TAG, "called onOptionsItemSelected; selected item: " + item); 

     if (item == mItemLanguage) { 
      mOpenCvCameraView.setVisibility(SurfaceView.GONE); 
      mIsJavaCamera = !mIsJavaCamera; 

      if (mIsJavaCamera) { 
       String english = "Language English is selected"; 
       toastMesage = english; 
       lang = "eng"; 
       mTts.speak(english, TextToSpeech.QUEUE_ADD, null); 
      } else { 
       String sinhala = "Language Sinhala is selected"; 
       toastMesage = sinhala; 
       lang = "sin"; 
       mTts.speak(sinhala, TextToSpeech.QUEUE_ADD, null); 
      } 

      mOpenCvCameraView.setVisibility(SurfaceView.VISIBLE); 
      mOpenCvCameraView.setCvCameraViewListener(this); 
      mOpenCvCameraView.enableView(); 
      Toast toast = Toast.makeText(this, toastMesage, Toast.LENGTH_LONG); 
      toast.show(); 
     } 

     return true; 
    } 


@SuppressLint("SimpleDateFormat") 
    private void captureImage() { 
     try { 
      SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd_HH-mm-ss"); 
      String currentDateandTime = sdf.format(new Date()); 
      String fileName = Environment.getExternalStorageDirectory().getPath() + "/project/" + currentDateandTime; 

      mOpenCvCameraView.takePicture(fileName); 
     } catch (Exception exc) { 
      Log.e(Util.TAG, "Error in capture image", exc); 
     } 
    } 


private BaseLoaderCallback mLoaderCallback = new BaseLoaderCallback(this) { 
    @Override 
    public void onManagerConnected(int status) { 
     switch (status) { 
     case LoaderCallbackInterface.SUCCESS: 
      Log.i(Util.TAG, "OpenCV loaded successfully"); 
      mOpenCvCameraView.enableView(); 
      break; 
     default: 
      super.onManagerConnected(status); 
      break; 
     } 
    } 
}; 

@Override 
public void onResume() { 
    super.onResume(); 
    OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_3_0_0, this, 
      mLoaderCallback); 
} 



public void onActivityResult(int requestCode, int resultCode, Intent data) { 
    if (requestCode == MY_DATA_CHECK_CODE) { 
     if (resultCode == TextToSpeech.Engine.CHECK_VOICE_DATA_PASS) { 
      // success, create the TTS instance 
      mTts = new TextToSpeech(this, this); 
     } else { 
      // missing TTS data, install it 
      Intent installIntent = new Intent(); 
      installIntent.setAction(TextToSpeech.Engine.ACTION_INSTALL_TTS_DATA); 
      startActivity(installIntent); 
     } 
    } 
} 

@Override 
public void onInit(int arg0) { 
    // Drop all pending entries in the playback queue. 
    mTts.speak("Place your mobile on top of the document, and move it up slowly.", TextToSpeech.QUEUE_FLUSH, null); 
} 

private void shutdownCamera() { 
    if (mOpenCvCameraView != null) { 
     if (mOpenCvCameraView.getCamera() != null) { 
      mOpenCvCameraView.getCamera().stopPreview(); 
      mOpenCvCameraView.getCamera().release(); 
      mOpenCvCameraView.setCamera(null); 
     } 
     mOpenCvCameraView.disableView(); 
}}} 

HelloViewer.java

import java.io.File; 
import java.io.FileOutputStream; 
import java.io.FileWriter; 
import java.io.IOException; 
import java.text.SimpleDateFormat; 
import java.util.Date; 
import java.util.List; 

import org.opencv.android.JavaCameraView; 

import android.annotation.SuppressLint; 
import android.content.Context; 
import android.graphics.Bitmap; 
import android.hardware.Camera; 
import android.hardware.Camera.PictureCallback; 
import android.hardware.Camera.ShutterCallback; 
import android.hardware.Camera.Size; 
import android.os.AsyncTask; 
import android.os.Environment; 
import android.speech.tts.TextToSpeech; 
import android.util.AttributeSet; 
import android.util.Log; 

public class HelloViewer extends JavaCameraView implements PictureCallback, ShutterCallback { 

private String mPictureFileName; 
public HelloViewer(Context context, AttributeSet attrs) { 
    super(context, attrs); 
} 

public void setResolution(Size resolution) { 
    disconnectCamera(); 

    mMaxHeight = 480; // resolution.width; 
    mMaxWidth = 640; // resolution.height; 

    //connectCamera(getWidth(), getHeight()); 
    // Sets the preview size of camera. 

    connectCamera(getWidth(),getHeight()); 
} 

public Size getResolution() { 
    List<Camera.Size> sizes = mCamera.getParameters().getSupportedPictureSizes(); 
    for (Camera.Size size : sizes) { 
     Log.i(Util.TAG, "Picture sizes height : " + size.height + ", width : " + size.width); 
    } 

    return mCamera.getParameters().getPreviewSize(); 
} 

public void setAutoFocus() { 
    Log.i(Util.TAG, "Seting autofocus mode to Continuous picture."); 
    Camera.Parameters parameters = mCamera.getParameters(); 
    parameters.setFocusMode("continuous-picture"); 
    // Enable in nexus 3 
    //parameters.setPictureSize(2592, 1944); 
    mCamera.setParameters(parameters); 
} 

public void takePicture(final String fileName) { 
    Log.i(Util.TAG, "Taking picture"); 

    this.mPictureFileName = fileName; 
    // PictureCallback is implemented by the current class 
    mCamera.takePicture(this, null, null, this); 
} 

@Override 
public void onPictureTaken(byte[] data, Camera camera) { 
    Log.i(Util.TAG, "Saving a bitmap to file"); 
    HelloOpenCvActivity.mTts.speak("Please wait, Character recognition process is in progress.", TextToSpeech.QUEUE_ADD, null); 

    // Write the image in a file (in jpg format) 
    try { 
     File file = new File(mPictureFileName + ".jpg"); 
     FileOutputStream fos = new FileOutputStream(file); 
     fos.write(data); 
     fos.close(); 

    } catch (IOException e) { 
     Log.e(Util.TAG, "Exception in photoCallback", e); 
    } finally { 
     processOCR(mPictureFileName); 
     // The camera preview was automatically stopped. Start it again. 
     // TODO: Stop this recall and let the program terminate. 
     mCamera.startPreview(); 
     mCamera.setPreviewCallback(this); 
    } 
} 




public void processOCR(String mPictureFileName2) { 
    try { 
     Log.i(Util.TAG, "Started processing OCR"); 

     BitmapWorkerTask task = new BitmapWorkerTask(); 
     AsyncTask<String, Void, Bitmap> aTask = task.execute(mPictureFileName + ".jpg"); 

     OCRProcessor ocr = new OCRProcessor(); 
     String text = ocr.getOCRText(aTask.get()); 

     // Write text to file 
     HelloOpenCvActivity.mTts.speak(text, TextToSpeech.QUEUE_ADD, null); 
     Log.i(Util.TAG, "TEXT \n" + text); 
     writeToFile(text, mPictureFileName + ".txt"); 
    } 
    catch (Exception exc) { 
     Log.e(Util.TAG, "Error occured in processing OCR", exc); 
     HelloOpenCvActivity.mTts.speak("Error occurred in processing document, Please refetch the document", TextToSpeech.QUEUE_FLUSH, null); 
    } 
} 

private void writeToFile(String text, String fileName) { 
    try { 
     File file = new File(fileName); 
     FileWriter writer = new FileWriter(file); 
     writer.write(text); 
     writer.close(); 
    } 
    catch (Exception e) { 
     Log.e(Util.TAG, "File write failed: " + e.toString()); 
    } 
} 

@Override 
public void onShutter() { 
} 

public Camera getCamera() { 
    return mCamera; 
} 

public void setCamera(Camera camera) { 
    this.mCamera = camera; 
}} 

這是logcat的文件的一部分運行時應用程序

11-02 12:58:16.862: I/dalvikvm-heap(19979): Grow heap (frag case) 
to 14.125MB for 4519746-byte allocation 
11-02 12:58:16.882: I/DREAMVISION::(19979): Saving a bitmap to file 

11-02 12:58:16.892: E/DREAMVISION::(19979): Exception in photoCallback 

11-02 12:58:16.892: E/DREAMVISION::(19979):  
java.io.FileNotFoundException: /storage/emulated/0/project 
/2015-11-02_12-58-16.jpg: open failed: ENOENT (No such file or 
directory) 

11-02 12:58:16.892: E/DREAMVISION::(19979): at 
libcore.io.IoBridge.open(IoBridge.java:449) 

11-02 12:58:16.892: E/DREAMVISION::(19979): at 
java.io.FileOutputStream.<init>(FileOutputStream.java:77) 

11-02 12:58:16.892: E/DREAMVISION::(19979): at 
com.hello.HelloViewer.onPictureTaken(HelloViewer.java:81) 

11-02 12:58:16.892: E/DREAMVISION::(19979): at 
android.hardware.Camera$EventHandler.handleMessage(Camera.java:932) 

11-02 12:58:16.892: E/DREAMVISION::(19979): at 
android.os.Handler.dispatchMessage(Handler.java:102) 

11-02 12:58:16.892: E/DREAMVISION::(19979): at 
android.os.Looper.loop(Looper.java:136) 

11-02 12:58:16.892: E/DREAMVISION::(19979): at 
android.app.ActivityThread.main(ActivityThread.java:5291) 

11-02 12:58:16.892: E/DREAMVISION::(19979): at 
java.lang.reflect.Method.invokeNative(Native Method) 

11-02 12:58:16.892: E/DREAMVISION::(19979): at 
java.lang.reflect.Method.invoke(Method.java:515) 

11-02 12:58:16.892: E/DREAMVISION::(19979): at 
com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run 
(ZygoteInit.java:849) 

11-02 12:58:16.892: E/DREAMVISION::(19979): at 
com.android.internal.os.ZygoteInit.main(ZygoteInit.java:665) 

11-02 12:58:16.892: E/DREAMVISION::(19979): at 
dalvik.system.NativeStart.main(Native Method) 

11-02 12:58:16.892: E/DREAMVISION::(19979): Caused by: 
libcore.io.ErrnoException: open failed: ENOENT (No such file or 
directory) 

11-02 12:58:16.892: E/DREAMVISION::(19979): at 
libcore.io.Posix.open(Native Method) 

11-02 12:58:16.892: E/DREAMVISION::(19979): at 
libcore.io.BlockGuardOs.open(BlockGuardOs.java:110) 

11-02 12:58:16.892: E/DREAMVISION::(19979): at 
libcore.io.IoBridge.open(IoBridge.java:440) 

11-02 12:58:16.892: E/DREAMVISION::(19979): ... 11 more 

11-02 12:58:16.892: I/DREAMVISION::(19979): Started processing OCR 

11-02 12:58:16.902: E/BitmapFactory(19979): Unable to decode stream: 
java.io.FileNotFoundException: /storage/emulated/0/project 
/2015-11-02_12-58-16.jpg: open failed: ENOENT (No such file or 
directory) 

11-02 12:58:16.902: E/DREAMVISION::(19979): Error occured in 
processing OCR 

11-02 12:58:16.902: E/DREAMVISION::(19979): 
java.util.concurrent.ExecutionException: java.lang.NullPointerException 

11-02 12:58:16.902: E/DREAMVISION::(19979): at 
java.util.concurrent.FutureTask.report(FutureTask.java:93) 

11-02 12:58:16.902: E/DREAMVISION::(19979): at 
java.util.concurrent.FutureTask.get(FutureTask.java:163) 

11-02 12:58:16.902: E/DREAMVISION::(19979): at 
android.os.AsyncTask.get(AsyncTask.java:483) 

11-02 12:58:16.902: E/DREAMVISION::(19979): at 
com.hello.HelloViewer.processOCR(HelloViewer.java:107) 

11-02 12:58:16.902: E/DREAMVISION::(19979): at 
com.hello.HelloViewer.onPictureTaken(HelloViewer.java:88) 

11-02 12:58:16.902: E/DREAMVISION::(19979): at 
android.hardware.Camera$EventHandler.handleMessage(Camera.java:932) 

11-02 12:58:16.902: E/DREAMVISION::(19979): at 
android.os.Handler.dispatchMessage(Handler.java:102) 

11-02 12:58:16.902: E/DREAMVISION::(19979): at 
android.os.Looper.loop(Looper.java:136) 

11-02 12:58:16.902: E/DREAMVISION::(19979): at 
android.app.ActivityThread.main(ActivityThread.java:5291) 

11-02 12:58:16.902: E/DREAMVISION::(19979): at 
java.lang.reflect.Method.invokeNative(Native Method) 

11-02 12:58:16.902: E/DREAMVISION::(19979): at 
java.lang.reflect.Method.invoke(Method.java:515) 

11-02 12:58:16.902: E/DREAMVISION::(19979): at 
com.android.internal.os.ZygoteInit$MethodAndAr 
gsCaller.run(ZygoteInit.java:849) 

11-02 12:58:16.902: E/DREAMVISION::(19979): at 
com.android.internal.os.ZygoteInit.main(ZygoteInit.java:665) 

11-02 12:58:16.902: E/DREAMVISION::(19979): at 
dalvik.system.NativeStart.main(Native Method) 

11-02 12:58:16.902: E/DREAMVISION::(19979): Caused by: 
java.lang.NullPointerException 

11-02 12:58:16.902: E/DREAMVISION::(19979): at 
com.hello.BitmapWorkerTask.rotateBitMap(BitmapWorkerTask.java:26) 

11-02 12:58:16.902: E/DREAMVISION::(19979): at 
com.hello.BitmapWorkerTask.doInBackground(BitmapWorkerTask.java:17) 

11-02 12:58:16.902: E/DREAMVISION::(19979): at 
com.hello.BitmapWorkerTask.doInBackground(BitmapWorkerTask.java:1) 

11-02 12:58:16.902: E/DREAMVISION::(19979): at 
android.os.AsyncTask$2.call(AsyncTask.java:288) 

11-02 12:58:16.902: E/DREAMVISION::(19979): at 
java.util.concurrent.FutureTask.run(FutureTask.java:237) 

11-02 12:58:16.902: E/DREAMVISION::(19979): at 
android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231) 

11-02 12:58:16.902: E/DREAMVISION::(19979): at 
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolEx 
ecutor.java:1112) 

11-02 12:58:16.902: E/DREAMVISION::(19979): at 
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExe 
cutor. java:587) 

11-02 12:58:16.902: E/DREAMVISION::(19979): at 
java.lang.Thread.run(Thread.java:841) 

回答

0

試試HelloViewer.java

... 
File file = new File(mPictureFileName + ".jpg"); 
File folder = file.getParentFile().getCanonicalFile(); 
folder.mkdirs(); 
FileOutputStream fos = new FileOutputStream(file); 
... 
+0

getCanonicalFile()沒有在我的類中定義。有沒有其他方法? – wsm

+0

它是一個File類方法,不是你的類。你可以查看它[這裏](http://developer.android.com/reference/java/io/File.html#getCanonicalFile%28%29) –

+0

我寫了getParent方法而不是getParentFile。這是錯誤的,這就是爲什麼它無法在String類中找到getCanonicalFile方法的原因。 –

相關問題