2012-05-01 52 views
0

我是Android新手我已經編寫了一個小程序來拍照並將它們保存在內部存儲器磁盤中。我的程序已成功啓動,但是當我拍照時,沒有數據寫入存儲盤。Android相機程序

以下是我的代碼。我錯過了什麼?

package com.lab2; 

import java.io.File; 
import java.io.FileNotFoundException; 
import java.io.FileOutputStream; 
import java.io.IOException; 

import android.app.Activity; 
import android.hardware.Camera; 
import android.hardware.Camera.AutoFocusCallback; 
import android.hardware.Camera.PictureCallback; 
import android.hardware.Camera.ShutterCallback; 
import android.os.Bundle; 
import android.view.SurfaceHolder; 
import android.view.SurfaceView; 
import android.view.View; 
import android.widget.Button; 
import android.widget.Toast; 
import android.os.Environment; 

public class Lab2_cameraActivity extends Activity implements SurfaceHolder.Callback { 
/** Called when the activity is first created. */ 
private Camera mCamera; 
private SurfaceHolder mHolder; 
private SurfaceView mSurfaceView; 
private Button mbutton1; 
private ShutterCallback shutter; 
private PictureCallback raw; 
private PictureCallback postview; 



AutoFocusCallback AFCallback = new AutoFocusCallback(){ 
    @Override 
    public void onAutoFocus(boolean success, Camera camera) { 
     // TODO Auto-generated method stub 
     if (success){    
      mCamera.takePicture(shutter, raw, postview, jpeg);//take photo 
     }else{ 
      Toast.makeText(Lab2_cameraActivity.this, "in else...",Toast.LENGTH_LONG).show(); 
     } 
    } 
    }; 

    /*jpeg callback occurs when the compressed image is available*/ 
     PictureCallback jpeg = new PictureCallback(){ 
      @Override 
      public void onPictureTaken(byte[] data, Camera camera) { 
       // TODO Auto-generated method stub 
       FileOutputStream outStream = null;           
       File file = new File("/mnt/sdcard/");    
       try {      
        outStream = new FileOutputStream(file.toString()+"photo.jpg");            
        outStream.write(data);    
        outStream.close(); 
        Toast.makeText(Lab2_cameraActivity.this, "Photo Saved...",Toast.LENGTH_LONG).show();     
        mCamera.startPreview();    
       } catch (FileNotFoundException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } catch (IOException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 
      } 
      }; 

    public void surfaceDestroyed(SurfaceHolder holder) { 
     // TODO Auto-generated method stub 
     /*when surface destroyed, stop preview*/ 
     if(mCamera != null){ 
      mCamera.stopPreview(); 
      mCamera.release();//release camera resources 
      mCamera = null; 
     } 

     } 



public void surfaceCreated(SurfaceHolder holder) { 
    // TODO Auto-generated method stub 
    mCamera = Camera.open();//open camera 
    try { 
     mCamera.setPreviewDisplay(holder);//set surface to display 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
    } 

public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { 
    // TODO Auto-generated method stub 
    /*when surface changed, reset camera parameters for preview*/ 
    mCamera.getParameters();//get default parameters 
    Camera.Parameters parameters= mCamera.getParameters(); 
    /*you can set your own parameters in there*/ 
    mCamera.setParameters(parameters);//set parameters if parameters has been changed 
    mCamera.startPreview(); 
    } 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main);  
    mbutton1 = (Button)findViewById(R.id.button1); 
    mSurfaceView = (SurfaceView)findViewById(R.id.surfaceView); 
    mHolder = mSurfaceView.getHolder(); 
    mHolder.addCallback(this); 
    mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); 
    mbutton1.setOnClickListener(new Button.OnClickListener() 
    { 
     @Override 
     public void onClick(View v) { 
      mCamera.autoFocus(AFCallback); 
     } 
    }); 



} 

}

+0

你有權限寫入SD卡嗎?看到我的其他帖子瞭解更多信息:http://stackoverflow.com/questions/5453708/android-how-to-use-environment-getexternalstoragedirectory/5453753#5453753 – debracey

+0

我檢查了你的帖子,但沒有關於權限,我想我有權寫入SD卡。此外,我不讀取存儲的圖像,我正在存儲由相機拍攝的新照片 – fanbondi

回答

1
  1. 你不應該指定 '到/ mnt /不管/' 路徑,你的SD卡,使用getExternalFilesDir()以獲得正確的路徑。

  2. 回調不叫,除非你在mCamera.takePicture(null, null, jpeg);

  3. 指定它你真的有

    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"> 
    
在AndroidManifest.xml文件

+0

謝謝,這是問題所在 – fanbondi