Android 카메라 API를 사용하려고합니다. 동영상 미리보기가 효과적입니다. 사진을 찍은 다음 SDCARD에 저장하는 데 사용되는 버튼 인스턴스가 있습니다. 때로는 완벽하게 작동하지 않는 경우도 있습니다. 버튼을 누르기 만하면 비디오 미리보기가 멈추고 아무 반응이 없으며 "응용 프로그램이 응답하지 않습니다."등과 같은 팝업이 표시됩니다. 이 사건이 일어날 때 (3 번에 약 1 번) 나는 logcat에 오류 메시지가 없다. 그 후 카메라를 더 이상 사용할 수 없기 때문에 전화기를 재부팅해야합니다.Android에서 카메라 API를 사용할 때 문제가 발생했습니다.
05-03 18:22:31.053: INFO/SecCamera(76): int android::SecCamera::endSnapshot() :
05-03 18:22:31.053: INFO/SecCamera(76): munmap():virt. addr 0x41ddb000 size = 4261248
05-03 18:22:31.061: DEBUG/dalvikvm(700): GC_FOR_MALLOC freed 506K, 57% free 2779K/6407K, external 1625K/2137K, paused 15ms
05-03 18:22:31.061: INFO/dalvikvm-heap(700): Grow heap (frag case) to 7.734MB for 1114262-byte allocation
05-03 18:22:31.088: DEBUG/dalvikvm(700): GC_FOR_MALLOC freed 0K, 49% free 3867K/7559K, external 1625K/2137K, paused 13ms
05-03 18:22:31.127: DEBUG/dalvikvm(700): GC_CONCURRENT freed <1K, 49% free 3867K/7559K, external 1625K/2137K, paused 2ms+2ms
05-03 18:22:32.022: ERROR/CameraDemo(700): onPictureTaken - wrote bytes: 1114246
05-03 18:22:32.022: ERROR/CameraDemo(700): onPictureTaken - jpeg
나는를 저장하는 응용 프로그램에 대해 시간을두고 타이머를 추가하려고 :
public class Test_cam extends Activity implements PictureCallback,ShutterCallback,OnClickListener{
private static final String TAG = "CameraDemo";
Test_cam_preview preview; // This object will create the Camera object and return it to the CameraDemo activity.
Button buttonClick;
public boolean onProgress = false;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.camera);
preview = new Test_cam_preview(this);
((FrameLayout) findViewById(R.id.preview)).addView(preview);
buttonClick = (Button) findViewById(R.id.buttonClick);
buttonClick.setOnClickListener(this);
Log.d(TAG, "onCreate'd");
}
public void launch_scanpic(){
Intent intent = new Intent(Test_cam.this,Test_cam_scanpic.class);
startActivity(intent);
}
@Override
public void onClick(View v) {
if(!onProgress)
{
onProgress = true;
preview.camera.takePicture(Test_cam.this, null, Test_cam.this); //bien mettre null car raw callback renvoit tjrs null!
//on lance scanclothe activity
}
}
@Override
public void onShutter() {
Log.d(getClass().getSimpleName(), "get pic...");
}
@Override
public void onPictureTaken(byte[] data, Camera camera) {
FileOutputStream outStream = null;
try {
if (data==null)
{
Log.e(TAG,"data is null !!!!!!!");
}
else
{
// Write to SD Card
outStream = new FileOutputStream("/sdcard/test.jpg");
outStream.write(data);
Log.e(TAG, "onPictureTaken - wrote bytes: " + data.length);
outStream.close();
}
} catch (FileNotFoundException e) {
Log.e(getClass().getSimpleName(), "file not found",e);
e.printStackTrace();
} catch (IOException e) {
Log.e(getClass().getSimpleName(), "Saving picture error",e);
e.printStackTrace();
}
Log.e(TAG, "onPictureTaken - jpeg");
SystemClock.sleep(2000);
onProgress=false;
launch_scanpic();
}
}
응용 프로그램이 작동, 내가 분명히 올바른 로그 캣을 얻을 : 여기 내 코드입니다 그림, 그러나 효과 없음. Google Nexus S (2.3.4)에서 테스트 중입니다. 누구든지이 문제를 해결하는 데 도움이 될 수 있습니까? 사전에
class Test_cam_preview extends SurfaceView implements SurfaceHolder.Callback{
private static final String TAG = "Preview";
SurfaceHolder mHolder;
public Camera camera;
Test_cam_preview(Context context){
super(context);
mHolder = getHolder();
mHolder.addCallback(this);
mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);}
public void surfaceCreated(SurfaceHolder holder){
camera = Camera.open();
Camera.Parameters params = camera.getParameters();
params.setPictureFormat(PixelFormat.JPEG);
params.set("flash-mode", "auto");
camera.setParameters(params);
try {
camera.setPreviewDisplay(holder);
camera.setPreviewCallback(new PreviewCallback(){
public void onPreviewFrame(byte[] data, Camera camera){
Test_cam_preview.this.invalidate();
}
});
} catch (IOException e) {
e.printStackTrace();
camera.release();
camera = null;
}}
public void surfaceDestroyed(SurfaceHolder holder){
if(camera != null){
camera.stopPreview();
camera.setPreviewCallback(null);
camera.release(); //it is important that this is done so camera is
camera = null;
}
}
public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {
camera.startPreview();
}}
감사 : 여기
내 코드의 미리보기 부분입니다.존
에 제외 미세 매번 일 때문에 넥서스 S 카메라 네이티브 코드에서 버그가 수 있어야합니다 가정 . – john7002