0

나중에 SurfaceHolder를 사용하여 인터넷의 다양한 소스에서 제공되는 간단한 카메라 앱을 프로토 타입으로 작성하여 나중에 더 큰 프로젝트.독립된 안드로이드 카메라 앱이 작동하지만 해당 카메라 앱 코드가 다른 액티비티에 의해 호출 될 때 작동하지 않습니다.

앱이 정말 잘 작동합니다. 그것은 충돌하지 않고 이미지를 올바르게 저장합니다.

더 큰 프로젝트와 통합하기 시작했습니다. 이제 다른 활동 (기본 활동이 아닌)에서 시작됩니다. 예상 한 카메라보기를 계속 표시하며 충돌하지 않습니다.

그러나 찍은 사진은 저장되지 않습니다.

독립 카메라 앱의 코드와 통합 카메라 활동이 동일합니다.

finish()를 호출하거나 다른 활동을 시작하지 않고 (카메라가 이미지를 올바르게 출력하는지 확인하지 않고) 통합 카메라 코드를 테스트했습니다.

하지만 여전히 작동하지 않습니다.

누구나 전에이 문제가 발생 했습니까? 감사.

public class CameraViewActivity extends Activity implements 
    SurfaceHolder.Callback, OnClickListener { 

private static final String SD_CARD_LOC = "/sdcard/"; 
private static final String FILE_NAME = "image"; 
private static final String JPEG_FORMAT = ".jpg"; 
private static final String TAG = "CameraViewActivity"; 

private Context context = this; 
private SurfaceView surfaceView; 
private SurfaceHolder surfaceHolder; 

Camera camera; 
boolean isPreviewRunning = false; 

@Override 
public void onCreate(Bundle icicle) { 
    super.onCreate(icicle); 

    Log.e(TAG, "onCreate"); 

    //Bundle extras = getIntent().getExtras(); 

    getWindow().setFormat(PixelFormat.TRANSLUCENT); 
    requestWindowFeature(Window.FEATURE_NO_TITLE); 
    getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, 
      WindowManager.LayoutParams.FLAG_FULLSCREEN); 
    setContentView(R.layout.camera_view_layout); 
    surfaceView = (SurfaceView) findViewById(R.id.surface_camera); 
    surfaceView.setOnClickListener(this); 
    surfaceHolder = surfaceView.getHolder(); 
    surfaceHolder.addCallback(this); 
    surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); 
} 

@Override 
public void onRestoreInstanceState(Bundle savedInstanceState) { 
    super.onRestoreInstanceState(savedInstanceState); 
} 

Camera.PictureCallback mPictureCallback = new Camera.PictureCallback() { 
    public void onPictureTaken(byte[] imageByteData, Camera c) { 
     if (imageByteData != null) { 

      Intent intent = new Intent(CameraViewActivity.this,SharePhotoActivity.class); 

      if(saveByteImage(context, imageByteData, 50)){ 
       camera.startPreview(); 
       startActivity(intent); 
       finish(); 
      } 
     } 
    } 
}; 

@Override 
public void onResume() { 
    Log.e(TAG, "onResume"); 
    super.onResume(); 
} 

@Override 
public void onSaveInstanceState(Bundle outState) { 
    super.onSaveInstanceState(outState); 
} 

@Override 
public void onStop() { 
    Log.e(TAG, "onStop"); 
    super.onStop(); 
} 

@Override 
public void surfaceCreated(SurfaceHolder holder) { 
    Log.e(TAG, "surfaceCreated"); 
    camera = Camera.open(); 
} 

@Override 
public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) { 
    Log.e(TAG, "surfaceChanged"); 

    if (isPreviewRunning) { 
     camera.stopPreview(); 
    } 

    Camera.Parameters parameters = camera.getParameters(); 
    int height = parameters.getPreviewSize().height; 
    int width = parameters.getPreviewSize().width; 

    Display display = ((WindowManager) getSystemService(WINDOW_SERVICE)) 
      .getDefaultDisplay(); 

    switch (display.getRotation()) { 
    case Surface.ROTATION_0: { 
     parameters.setPreviewSize(width, height); 
     camera.setDisplayOrientation(90); 
    } 
     break; 
    case Surface.ROTATION_180: { 
     parameters.setPreviewSize(width, height); 
    } 
     break; 
    case Surface.ROTATION_270: { 
     parameters.setPreviewSize(width, height); 
     camera.setDisplayOrientation(180); 
    } 
     break; 
    case Surface.ROTATION_90: { 
     parameters.setPreviewSize(width, height); 
    } 
     break; 
    } 

    camera.setParameters(parameters); 
    try { 
     camera.setPreviewDisplay(holder); 
     camera.startPreview(); 
     isPreviewRunning = true; 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 

@Override 
public void surfaceDestroyed(SurfaceHolder holder) { 
    Log.e(TAG, "surfaceDestroyed"); 
    camera.stopPreview(); 
    isPreviewRunning = false; 
    camera.release(); 
} 

@Override 
public void onClick(View arg0) { 
    camera.takePicture(null, mPictureCallback, mPictureCallback); 
} 

public static boolean saveByteImage(Context context, byte[] imageByteData, int quality) { 

    StringBuffer fileUri = new StringBuffer(); 
    fileUri.append(SD_CARD_LOC); 
    fileUri.append(FILE_NAME); 
    fileUri.append("-"); 
    fileUri.append(System.currentTimeMillis()); 
    fileUri.append(JPEG_FORMAT); 

    try { 
     BitmapFactory.Options options = new BitmapFactory.Options(); 
     options.inSampleSize = 5; 
     Bitmap bitmapImage = BitmapFactory.decodeByteArray(imageByteData, 0, imageByteData.length, options); 
     FileOutputStream fos = new FileOutputStream(fileUri.toString()); 
     BufferedOutputStream bos = new BufferedOutputStream(fos); 
     bitmapImage.compress(CompressFormat.JPEG, quality, bos); 

     bos.flush(); 
     bos.close();   
    } catch (FileNotFoundException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
    return true; 
} 

}

업데이트 :

카메라 활동에 대한 소스 코드 메인 하나는 카메라 뷰 활동 : 나는 두 활동과 새로운 안드로이드 프로젝트를 만들었습니다. 주요 활동은 단순히 버튼 클릭을 통해 카메라보기 활동을 시작합니다. 그리고 여전히 어떤 이미지도 저장하지 않습니다.

+0

"찍은 사진을 저장하지 않을 것"이라는 의미를 정의 할 수 있습니까? 오류가 발생 했습니까? 그렇다면 어떤 오류입니까? 또한 귀하를 도와 드릴 수 있도록 귀하의 일부 코드를 게시해야합니다. –

+0

소스 코드를 추가했습니다. – user426250

+0

오류도 발생하지 않습니다. – user426250

답변

0

수정했습니다.

은 분명히 내가 만든 프로토 타입 버전 4

보다 안드로이드 API 버전 나이가 사용되었으며 다음과 같은 권한을 필요로하지 않습니다

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission> 

난 그냥 그것을 추가를하고 지금은 잘 작동합니다.

감사합니다.