2011-04-14 3 views
1

안녕 얘들 아 내 응용 프로그램에서 카메라에 액세스하려면 다음 코드를 사용하고 있습니다. 응용 프로그램은 내가 또한 OnClickListener를 버튼을 추가 한 카메라에 액세스 할 수있는 코드 줄을 추가합니다 - 지금은 응용 프로그램이 난 다음 닫기를 강제해야하고 걸리면을 제외한 어떻게되는지 잘 모릅니다이미지 캡처 및 SD 카드에 저장하는 방법

camera.takePicture(mShutterCallback, mPictureCallbackRaw, mPictureCallbackJpeg); 

심지어 네이티브 카메라 응용 프로그램에 액세스 할 수 없습니다. Camera 객체를 해제하지 않고 응용 프로그램을 종료한다고 생각합니다. 이미지가 저장되지 않습니다.

코드 : -

SurfaceHolder holder; 
SurfaceView surface; 
Camera camera; 
Boolean isPreviewRunning, fromOnResume; 
//Preview mpreview; 
/** Called when the activity is first created. */ 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 
    isPreviewRunning = false; 
    fromOnResume = false; 
    // requestWindowFeature(Window.FEATURE_NO_TITLE); 
    surface = (SurfaceView)findViewById(R.id.surface); 
    holder = surface.getHolder(); 
    holder.addCallback(this); 
    holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); 

    Button btn = (Button)findViewById(R.id.click); 
    btn.setOnClickListener(new OnClickListener(){ 

     @Override 
     public void onClick(View v) { 
      // TODO Auto-generated method stub 
      camera.takePicture(mShutterCallback, mPictureCallbackRaw, mPictureCallbackJpeg); 
      //onCreate(null); 


     } 

    }); 

} 


@Override 
public void surfaceChanged(SurfaceHolder holder, int format, int width, 
     int height) { 
/* if (isPreviewRunning) { 
      camera.stopPreview(); 
     } */ 

    Camera.Parameters parameters = camera.getParameters(); 

    List<Size> sizes = parameters.getSupportedPreviewSizes(); 
    Size size = sizes.get(0); 
    parameters.setPreviewSize(size.width, size.height); 

    camera.setParameters(parameters); 
    camera.startPreview(); 
    isPreviewRunning=true; 
} 
@Override 
public void surfaceCreated(SurfaceHolder holder) { 
    // TODO Auto-generated method stub 

    camera = Camera.open(); 

    try { 
     camera.setPreviewDisplay(holder); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 

    } 
} 
@Override 
public void surfaceDestroyed(SurfaceHolder holder) { 
    // TODO Auto-generated method stub 

    camera.stopPreview(); 
    camera.release(); 
    camera=null; 
} 

Camera.PictureCallback mPictureCallbackRaw = new Camera.PictureCallback() { 
public void onPictureTaken(byte[] data, Camera c) { 
    Log.e(getClass().getSimpleName(), "PICTURE CALLBACK RAW: " + data); 
    camera.startPreview(); 
} 
}; 

Camera.PictureCallback mPictureCallbackJpeg= new Camera.PictureCallback() { 
public void onPictureTaken(byte[] data, Camera c) { 
    Log.e(getClass().getSimpleName(), "PICTURE CALLBACK JPEG: data.length = " + data); 

    camera.startPreview(); 
} 
}; 


Camera.ShutterCallback mShutterCallback = new Camera.ShutterCallback() { 
public void onShutter() { 
Log.e(getClass().getSimpleName(), "SHUTTER CALLBACK"); 
} 
}; 
/* 
* protected void onRestoreInstanceState(Bundle savedInstanceState) 
{ 

super.onRestoreInstanceState(savedInstanceState); 
} 
protected void onResume() 
{ 

Log.e(getClass().getSimpleName(), "onResume"); 
camera.open(); 
fromOnResume=true; 
super.onResume(); 
} 

protected void onSaveInstanceState(Bundle outState) 
{ 
super.onSaveInstanceState(outState); 
} 

@Override 
protected void onPause() { 
    // TODO Auto-generated method stub 
    camera.release(); 
    super.onPause(); 
} 


protected void onStop() 
{ 
Log.e(getClass().getSimpleName(), "onStop"); 
super.onStop(); 
}*/ 

답변

9

나는이 정확하게 질문에 대한 답변하지 않습니다 알아,하지만 쉽게 할 수 wouldn'nt 주식 카메라 응용 프로그램을 사용할 수 있나요? 당신은 당신의 활동에이 코드를 사용하여 액세스 할 수 있습니다

그냥 제안
@Override 
public void onCreate(Bundle savedInstanceState) 
{ 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.capture); 

    Button capture = (Button) findViewById(R.id.capture_button); 
    capture.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 

      // We use the stock camera app to take a photo 
      Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
      intent.putExtra(MediaStore.EXTRA_OUTPUT, getImageUri()); 
      startActivityForResult(intent, TAKE_PHOTO_CODE); 
     } 
    }); 
} 

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    super.onActivityResult(requestCode, resultCode, data); 

    if (requestCode == TAKE_PHOTO_CODE && resultCode == RESULT_OK) { 
     Uri imagePath = getImageUri(); 

     doSomething(); 
    } 
} 

/** 
* Get the uri of the captured file 
* @return A Uri which path is the path of an image file, stored on the dcim folder 
*/ 
private Uri getImageUri() { 
    // Store image in dcim 
    File file = new File(Environment.getExternalStorageDirectory() + "/DCIM", CAPTURE_TITLE); 
    Uri imgUri = Uri.fromFile(file); 

    return imgUri; 
} 
+0

Genuin ... 그 덕분에 많은 도움을주었습니다 ... 내 다음 단계는 서버에 이미지를 업로드하는 것입니다 ... 플러스 나는 날짜와 시간에 따라 이미지의 이름을 가져야한다고 생각합니다 isn 그거 좋은 옵션이야 ?? 현재 모든 이미지는 내 이름으로 만 저장됩니다 :) – abhishek

+0

[이 프로젝트 확인] (https://github.com/thibault/UrbanJungle) : 사진을 캡처하여 원격지에 업로드하는 안드로이드 앱이 있습니다. 섬기는 사람. 상기 서버의 코드도 내장되어 있습니다. –

0

은 JPG에서 EXIF를 사용하여 서버에 업로드하기 전에. 오늘 스마트 폰 카메라의 품질 때문에 지루하게 이미지를 업로드하는 것을 발견했습니다. 간단한 해결책은 exif 읽기 프로그램을 사용하여 jpeg의 축소판을 추출하고, 상기 축소판을 새 jpeg로 저장 한 다음 업로드하는 것입니다. 원본 사진과 동일하지만 훨씬 작습니다 (100kb 미만 미만). 당신이 원하는 이미지 화질인지는 모르겠지만 그렇지 않다면 사진을 많이 업로드하려면 exif 메서드를 사용하십시오. 나는 python sl4a에서 프로그램을 작성하고 EXIF.py를 사용했지만 자바와 비슷하다고 확신한다.