Androidフォンのフロントカメラにアクセスしようとしていて、プレビューなしで画像を時々キャプチャしようとしています.私のコードは、スレッドを使用していないときにうまく機能しています.私のコードはバックグラウンドサービス内でもうまく機能していますが、スレッドを適用するとexception.Exception は、カメラ情報にアクセスできないことを示します。実装する最良の方法は何ですか?????
これは私のコードで、これはうまくいきます。
このアプリケーションにスレッドを適用したいのですが、どうすればいいですか????
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import android.os.Bundle;
import android.app.Activity;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.hardware.Camera;
import android.hardware.Camera.CameraInfo;
import android.hardware.Camera.Parameters;
public class MainActivity extends Activity {
Button front;
private Camera mCamera=null;
private Parameters parameters;
private SurfaceHolder sHolder;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
addListnerOnButton();
}
public void addListnerOnButton(){
front=(Button)findViewById(R.id.btn);
front.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View arg0) {
for (int camNo = 0; camNo < Camera.getNumberOfCameras(); camNo++) {
CameraInfo camInfo = new CameraInfo();
Camera.getCameraInfo(camNo, camInfo);
if (camInfo.facing==(Camera.CameraInfo.CAMERA_FACING_FRONT)) {
//mCamera = Camera.open(camNo);
//toastCam(camNo);
takePic(camNo);
}
}
}
});
}
/*public void toastCam(int id){
Toast.makeText(this,String.valueOf(id), Toast.LENGTH_LONG).show();
}
*/
public void takePic(int no){
mCamera = Camera.open(no);
SurfaceView sv = new SurfaceView(getApplicationContext());
try {
mCamera.setPreviewDisplay(sv.getHolder());
parameters = mCamera.getParameters();
//set camera parameters
mCamera.setParameters(parameters);
mCamera.startPreview();
mCamera.takePicture(null, null, mCall);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//Get a surface
sHolder = sv.getHolder();
//tells Android that this surface will have its data constantly replaced
sHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
}
Camera.PictureCallback mCall = new Camera.PictureCallback()
{
public void onPictureTaken(byte[] data, Camera camera)
{
//decode the data obtained by the camera into a Bitmap
FileOutputStream outStream = null;
try{
outStream = new FileOutputStream("/sdcard/Image.jpeg");
outStream.write(data);
outStream.close();
mCamera.release();
} catch (FileNotFoundException e){
} catch (IOException e){
}
}
};
}