2014-01-27 3 views
0

나는 기존의 모든 방법을 시도해 봤지만 응용 프로그램이 닫힐 때마다 닫습니다. 여기에 코드가 있습니다. 디버깅을 도와주세요.Camera Api를 사용하여 안드로이드 카메라 열기

MainActivity.java

package com.example.camera1; 
import android.os.Bundle; 
import android.graphics.Bitmap; 
import android.graphics.BitmapFactory; 
import android.hardware.Camera; 
import android.hardware.Camera.PictureCallback; 
import android.app.Activity; 
import android.view.Menu; 
import android.view.View; 
import android.widget.FrameLayout; 
import android.widget.ImageView; 
import android.widget.Toast; 

public class MainActivity extends Activity { 

private Camera cameraObject; 

private ShowCamera showCamera; 

private ImageView pic; 

public static Camera isCameraAvailiable(){ 

    Camera object = null; 

    try { object = Camera.open(); 

    }  catch (Exception e){   

    }  return object; 

} 

private PictureCallback capturedIt = new PictureCallback() { 
     @Override  
     public void onPictureTaken(byte[] data, Camera camera) { 
     Bitmap bitmap = BitmapFactory.decodeByteArray(data , 0, data .length);  
     if(bitmap==null){   
      Toast.makeText(getApplicationContext(), "not taken", Toast.LENGTH_SHORT).show();  
      }  
     else{ 
      Toast.makeText(getApplicationContext(), "taken", Toast.LENGTH_SHORT).show();   
      }  
     cameraObject.release(); 
     } 

    }; 




    protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    pic = (ImageView)findViewById(R.id.imageView1); 
    cameraObject = isCameraAvailiable(); 
    showCamera = new ShowCamera(this, cameraObject); 
    FrameLayout preview = (FrameLayout) findViewById(R.id.camera_preview); 
    preview.addView(showCamera); 

    } 

    public void snapIt(View view){ 
    cameraObject.takePicture(null, null, capturedIt); 
    } 


@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    // Inflate the menu; this adds items to the action bar if it is present. 
    getMenuInflater().inflate(R.menu.main, menu); 
    return true; 
} 

} 

ShowCamera.java

package com.example.camera1; 

import java.io.IOException; 
import android.content.Context; 
import android.hardware.Camera; 
import android.view.SurfaceHolder; 
import android.view.SurfaceView; 


public class ShowCamera extends SurfaceView implements SurfaceHolder.Callback { 
private SurfaceHolder holdMe; 
private Camera theCamera; 
public ShowCamera(Context context,Camera camera) { 
    super(context); 
    theCamera = camera; 
    holdMe = getHolder();  
    holdMe.addCallback(this); 
    // TODO Auto-generated constructor stub 
} 

@Override 
public void surfaceChanged(SurfaceHolder holder, int format, int width, 
     int height) { 
    // TODO Auto-generated method stub 

} 
@Override 
public void surfaceCreated(SurfaceHolder holder) { 
    // TODO Auto-generated method stub 
     try {   
      theCamera.setPreviewDisplay(holder); 
      theCamera.startPreview(); 
      } catch (IOException e) 
      {  

      } 

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

} 


} 

activity_main.xml

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:orientation="vertical" > 
    <FrameLayout 
    android:id="@+id/camera_preview" 
    android:layout_width="fill_parent" 
    android:layout_height="199dp" > 

    </FrameLayout> 

<Button 
    android:id="@+id/button_capture" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:onClick = "snapIt" 
    android:text="@string/Capture"/> 

<ImageView 
    android:id="@+id/imageView1" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:scaleType="fitXY" 
    android:src="@drawable/ic_launcher"/>  

</LinearLayout> 

나는 안드로이드 진저과 버전 이상이 제작하고있다. 어디 내 목표 SDK는 안드로이드 Kitkat입니다. 진저 브레드에 응용 프로그램을 테스트하는 동안 응용 프로그램이 열리지 만 단순히 레이아웃이로드되어 닫히지 않는 흰색 화면이 표시됩니다 .. 도움을주십시오 .. !!

+2

앱이 강제 종료되면 eclipse의 'logcat'창에 예외가 적용됩니다. 너는 그것을 봐야 해. – weston

+0

일단 카메라 앱이 추락하면 카메라를 제대로 해제하지 못할 수 있습니다. 따라서 다음 번에 코드가 올바르더라도 카메라가 제대로 출시 될 때까지 작동하지 않습니다. – Saqib

+0

mainactivity의 onCreate 메소드를 무시하십시오. – jyomin

답변

0

카메라를 열려면이 적절하게 다음 코드를 사용

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.GINGERBREAD) { 
    Camera.CameraInfo info=new Camera.CameraInfo(); 

    for (int i=0; i < Camera.getNumberOfCameras(); i++) { 
    Camera.getCameraInfo(i, info); 

    if (info.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) { 
     camera=Camera.open(i); 
    } 
    } 
} 

if (camera == null) { 
    camera=Camera.open(); 
} 

그것을 표시하기 위해 FrameLayout이에 서피스 뷰 SurfaceView를 추가합니다.

mCamera.release(); 
    mCamera=null; 
    //remove SurfaceView from the FrameLayout you added it to  

당신은 Camera.Parameters 개체를 유지하고 설정하는 데 사용할 수 있습니다 :

대신 카메라를 반환하는 대신 variable.The 카메라는 다음과 같이 onPause에서 해제 글로벌 카메라의 인스턴스를 사용할 수 있습니다 표면에 수표를 넣어 값에 매개 변수를 변경합니다.

가 여기에 완료되었습니다대로도에서 onCreate에서 별도의 스레드에 카메라를 시작 고려할 수

:

//This code is from AOSP ICS: 
     Thread mCameraOpenThread = new Thread(new Runnable() { 
     public void run() { 
      try { 
       mCameraDevice = Util.openCamera(Camera.this, mCameraId); 
      } catch (CameraHardwareException e) { 
      mOpenCameraFail = true; 
      } catch (CameraDisabledException e) { 
      mCameraDisabled = true; 
     } 
    } 
});  

이것은에서 onCreate 방법 :

super.onCreate(icicle); 
    mCameraOpenThread.start(); 
    SurfaceView preview = (SurfaceView) findViewById(R.id.camera_preview); 
    SurfaceHolder holder = preview.getHolder(); 
    holder.addCallback(this); 
    holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); 

    // Make sure camera device is opened. 
    try { 
      mCameraOpenThread.join(); 
      mCameraOpenThread = null; 
     } 
    catch(InterruptedException e) 
    { 
    //ignore 
    } 
코드에 대한 링크가

여기 http://android.googlesource.com/platform/packages/apps/Camera/+/ics-factoryrom-2-release/src/com/android/camera/Camera.java

관련 문제