2012-03-07 19 views
2

私はAndroid上でopenCVサンプルを試しています。私は私のSDカードにBMPファイルを保存しようとしているときに次のコードを使用してすべてのスレッド:スレッドからSDカードにbmpイメージを保存する

String filePath = "/sdcard"; // some times it may be only /sdcard not /mnt/sdcard 
     filePath += "newFileName.jpg"; 
     try { 
      bmp.compress(Bitmap.CompressFormat.JPEG, 100, new FileOutputStream(new File(filePath))); 
     } catch (FileNotFoundException e) { 
        // TODO Auto-generated catch block 
     e.printStackTrace(); 
     Log.i(TAG, "IOException Occurred!!!"); 
     } 

は、ログが常に現れる「IOExceptionが発生しました」と何のファイルはSDカードに保存されていません。

フルクラスコードはここ

public abstract class SampleCvViewBase extends SurfaceView implements SurfaceHolder.Callback, Runnable { 
private static final String TAG = "Sample::SurfaceView"; 

private SurfaceHolder  mHolder; 
private VideoCapture  mCamera; 
private FpsMeter   mFps; 

public SampleCvViewBase(Context context) { 
    super(context); 
    mHolder = getHolder(); 
    mHolder.addCallback(this); 
    mFps = new FpsMeter(); 
    Log.i(TAG, "Instantiated new " + this.getClass()); 
} 

public void surfaceChanged(SurfaceHolder _holder, int format, int width, int height) {//called immediately after the structural change of surface 
    Log.i(TAG, "surfaceCreated"); 
    synchronized (this) { 
     if (mCamera != null && mCamera.isOpened()) { 
      Log.i(TAG, "before mCamera.getSupportedPreviewSizes()"); 
      List<Size> sizes = mCamera.getSupportedPreviewSizes(); 
      Log.i(TAG, "after mCamera.getSupportedPreviewSizes()"); 
      int mFrameWidth = width; 
      int mFrameHeight = height; 

      // selecting optimal camera preview size 
      { 
       double minDiff = Double.MAX_VALUE; 
       for (Size size : sizes) { 
        if (Math.abs(size.height - height) < minDiff) { 
         mFrameWidth = (int) size.width; 
         mFrameHeight = (int) size.height; 
         minDiff = Math.abs(size.height - height); 
        } 
       } 
      } 

      mCamera.set(Highgui.CV_CAP_PROP_FRAME_WIDTH, mFrameWidth); 
      mCamera.set(Highgui.CV_CAP_PROP_FRAME_HEIGHT, mFrameHeight); 
     } 
    } 
} 

public void surfaceCreated(SurfaceHolder holder) { 
    Log.i(TAG, "surfaceCreated"); 
    mCamera = new VideoCapture(Highgui.CV_CAP_ANDROID); 
    if (mCamera.isOpened()) { 
     (new Thread(this)).start();  //new thread 
    } else { 
     mCamera.release(); 
     mCamera = null; 
     Log.e(TAG, "Failed to open native camera"); 
    } 
} 

public void surfaceDestroyed(SurfaceHolder holder) { 
    Log.i(TAG, "surfaceDestroyed"); 
    if (mCamera != null) { 
     synchronized (this) { 
      mCamera.release();      
      mCamera = null; 
     } 
    } 
} 

protected abstract Bitmap processFrame(VideoCapture capture) throws IOException; 

public void run() { 
    Log.i(TAG, "Starting processing thread");  //send out log notice 
    mFps.init();        //instance of Fps meter  

    while (true) { 
     Bitmap bmp = null; 

     synchronized (this) { 
      if (mCamera == null)     //instance of video capture 
       break; 

      if (!mCamera.grab()) { 
       Log.e(TAG, "mCamera.grab() failed"); 
       break; 
      } 

      try { 
       bmp = processFrame(mCamera); 
      } catch (IOException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 

      mFps.measure(); 
     } 

     if (bmp != null) { 
      Canvas canvas = mHolder.lockCanvas(); 
      if (canvas != null) { 
       canvas.drawBitmap(bmp, (canvas.getWidth() - bmp.getWidth())/2, (canvas.getHeight() - bmp.getHeight())/2, null); 
       mFps.draw(canvas, (canvas.getWidth() - bmp.getWidth())/2, 0); 
       mHolder.unlockCanvasAndPost(canvas); 
      } 
      String filePath = "/sdcard"; // some times it may be only /sdcard not /mnt/sdcard 
      filePath += "newFileName.jpg"; 
      try { 
       bmp.compress(Bitmap.CompressFormat.JPEG, 100, new FileOutputStream(new File(filePath))); 
      } catch (FileNotFoundException e) { 
         // TODO Auto-generated catch block 
      e.printStackTrace(); 
      Log.i(TAG, "IOExcpetion Occurred!!!"); 
      } 
     } 

を下回っている私は、DDMSに持っているものです:

03-07 08:58:11.639: W/TextLayoutCache(986): computeValuesWithHarfbuzz -- need to force to single run 
03-07 08:58:11.709: W/System.err(986): java.io.FileNotFoundException: /sdcardnewFileName.jpg: open failed: EROFS (Read-only file system) 
03-07 08:58:11.769: W/System.err(986): at libcore.io.IoBridge.open(IoBridge.java:406) 
03-07 08:58:11.769: W/System.err(986): at java.io.FileOutputStream.<init>(FileOutputStream.java:88) 
03-07 08:58:11.809: W/System.err(986): at java.io.FileOutputStream.<init>(FileOutputStream.java:73) 
03-07 08:58:11.829: W/System.err(986): at org.opencv.samples.fd.SampleCvViewBase.run(SampleCvViewBase.java:125) 
03-07 08:58:11.829: W/System.err(986): at org.opencv.samples.fd.FdView.run(FdView.java:107) 
03-07 08:58:11.829: W/System.err(986): at java.lang.Thread.run(Thread.java:856) 
03-07 08:58:11.829: W/System.err(986): Caused by: libcore.io.ErrnoException: open failed: EROFS (Read-only file system) 
03-07 08:58:11.859: W/System.err(986): at libcore.io.Posix.open(Native Method) 
03-07 08:58:11.859: W/System.err(986): at libcore.io.BlockGuardOs.open(BlockGuardOs.java:98) 
03-07 08:58:11.889: W/System.err(986): at libcore.io.IoBridge.open(IoBridge.java:390) 
03-07 08:58:11.889: W/System.err(986): ... 5 more 

03-07 08:58:11.919: I/Sample::SurfaceView(986): IOExcpetion Occurred!!! 

03-07 08:58:12.489: D/dalvikvm(986): GC_FOR_ALLOC freed 1209K, 14% free 9902K/11399K, paused 29ms 
03-07 08:58:12.489: I/dalvikvm-heap(986): Grow heap (frag case) to 10.925MB for 1228816-byte allocation 
03-07 08:58:12.619: D/dalvikvm(986): GC_CONCURRENT freed <1K, 3% free 11102K/11399K, paused 3ms+45ms 

私は、すぐに検出が完了したように、1枚のBMP画像を保存しようとしています一度。誰でも助けてくれますか?ありがとうございます

答えて

4

ファイルパスにスラッシュがないため、ファイルシステムのルートに書き込もうとしています。/sdcard/newFileName.jpgの代わりに/sdcardnewFileName.jpgを使用しています。 しかし、そこに書き込む許可がないので、例外が発生します。

また、このようにSDカードへのパスをハードコードしないでください。代わりにEnvironment.getExternalStorageDirectory()を使用してください。デバイスによっては、カードを別のパスにマウントするか、代わりにフラッシュメモリを使用するものがあります。このメソッドは常に正しいパスを返します。これをしないと、複数のデバイス間でアプリを使用する際に問題が発生します。

関連する問題