마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

카메라 preview..제발..도와주세요 미칠것같아요..

0 추천
private Preview mPreview;
 /** Called when the activity is first created. */
 @Override
 public void onCreate(Bundle savedInstanceState) {
     super.onCreate(savedInstanceState);
     // TODO Auto-generated method stub
     requestWindowFeature(Window.FEATURE_NO_TITLE);
     mPreview = new Preview(this);
     setContentView(mPreview);
    
 }

액티비티구요..


package com.bingsubingsu.classes;

import android.content.Context;
import android.hardware.Camera;
import android.util.Log;
import android.view.SurfaceHolder;
import android.view.SurfaceHolder.Callback;
import android.view.SurfaceView;

public class Preview extends SurfaceView implements Callback,Camera.PictureCallback {

 SurfaceHolder mHolder;
 Camera mCamera = null;
 
 public Preview(Context context) {
  super(context);
  // TODO Auto-generated constructor stub
  try{
   mHolder = getHolder();
   mHolder.addCallback(this);
   mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); 
  }catch (Exception e) {
   // TODO: handle exception
   Log.d("ErrorLog ","PreView : Preview" );
  }
 }

 @Override
 protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
  // TODO Auto-generated method stub
  super.onMeasure(widthMeasureSpec, heightMeasureSpec);
 }
 @Override
 public void surfaceChanged(SurfaceHolder holder, int format, int width,
   int height) {
  // TODO Auto-generated method stub
  Camera.Parameters parameters = mCamera.getParameters();
  parameters.setPreviewSize(width, height);
  mCamera.setParameters(parameters);
  mCamera.startPreview();
 }

 @Override
 public void surfaceCreated(SurfaceHolder holder) {
  // TODO Auto-generated method stub
  mCamera = Camera.open();
  
  try{
   mCamera.setPreviewDisplay(holder);
   
  }catch (Exception e) {
   // TODO: handle exception
   Log.d("ErrorLog", "Preview : surfaceCreated");
   mCamera.release();
   mCamera = null;
  }
 }

 @Override
 public void surfaceDestroyed(SurfaceHolder holder) {
  // TODO Auto-generated method stub
  mCamera.stopPreview();
  mCamera.release();
  mCamera = null;
 }

 @Override
 public void onPictureTaken(byte[] data, Camera camera) {
  // TODO Auto-generated method stub
  
 }
}

 

surfaceView입니다..

에러로그를 띄워드리고 싶지만.. 에러로그가 안나와요 ㅠㅠ

그냥 죽어버리네요 ㅇ ㅏ.....................살려주세요 3일째입니다 이거..

제발 고수님들 지나치지마시구 한번만 봐주십시오 ㅠㅠㅠㅠ

 

mamongs (4,050 포인트) 님이 2013년 3월 14일 질문

2개의 답변

+1 추천
저도 이 문제 때문에 고생 많이 하다가 겨우 해결했습니다.

제가 사용하는 테스트 기종은 베가 레이서 1 입니다.

저 같은 경우 log켓을 보면

java.lang.RuntimeException: setParameters failed

이렇게 나옵니다. 그래서 구글링 해서 찾아보니

setParameters() 함수를 호출할 때, Parameter.setPreviewSize() 를 통해서 지정한 사이즈가 해당 단말의 카메라 하드웨어를 지원하지 않는 사이즈일 때 발생하는 exception 이라고 합니다.

그리하여 PreView 클래스의 surfaceChanged 메서드에서

        parameters.setPreviewSize(480,320);

이렇게 값을 넣어주고 실행해보니 잘 실행되네요 ㅎㅎ

mamongs 님도 이렇게 해보셔서 잘 되길 빕니다^^
고슴7 (230 포인트) 님이 2013년 5월 2일 답변
0 추천
에러 로그 없이 죽는다는 것도 참 이상한 말이네요

로그를 잘 살펴 보시고 AndroidManifest.xml 에 권한 설정도 확인해 보세요

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

 <uses-feature android:name="android.hardware.camera" />
블랙프리 (1,050 포인트) 님이 2013년 3월 14일 답변
매니페스트 권한은 줬구요..
코드상에는 문제 없어보이나요?
제가 로그를 못보구잇는건지 디바이스 디버깅하면 로그보는 방법이 다른건진 모르겟지만.. 안나오는것 같아요 ㅠㅠ
위에 코드 붙여 넣기로 동작시 정상동작 확인 했습니다

import android.app.Activity;
import android.os.Bundle;
import android.view.ViewGroup.LayoutParams;

public class TestActivity extends Activity{

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        PreView preView = new PreView(this);       
        setContentView(preView);
    }   
}

import android.content.Context;
import android.hardware.Camera;
import android.util.Log;
import android.view.SurfaceHolder;
import android.view.SurfaceHolder.Callback;
import android.view.SurfaceView;

public class PreView extends SurfaceView implements Callback, Camera.PictureCallback {

    SurfaceHolder mHolder;
    Camera mCamera = null;

    public PreView(Context context) {
        super(context);
        // TODO Auto-generated constructor stub
        try {
            mHolder = getHolder();
            mHolder.addCallback(this);
            mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
        } catch (Exception e) {
            // TODO: handle exception
            Log.d("ErrorLog ", "PreView : Preview");
        }
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        // TODO Auto-generated method stub
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    }

    @Override
    public void surfaceChanged(SurfaceHolder holder, int format, int width,
            int height) {
        // TODO Auto-generated method stub
        Camera.Parameters parameters = mCamera.getParameters();
        parameters.setPreviewSize(width, height);
        mCamera.setParameters(parameters);
        mCamera.startPreview();
    }

    @Override
    public void surfaceCreated(SurfaceHolder holder) {
        // TODO Auto-generated method stub
        mCamera = Camera.open();

        try {
            mCamera.setPreviewDisplay(holder);

        } catch (Exception e) {
            // TODO: handle exception
            Log.d("ErrorLog", "Preview : surfaceCreated");
            mCamera.release();
            mCamera = null;
        }
    }

    @Override
    public void surfaceDestroyed(SurfaceHolder holder) {
        // TODO Auto-generated method stub
        mCamera.stopPreview();
        mCamera.release();
        mCamera = null;
    }

    @Override
    public void onPictureTaken(byte[] data, Camera camera) {
        // TODO Auto-generated method stub

    }
}


<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.bingsubingsu.classes"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="10"
        android:targetSdkVersion="15" />

    <!-- ======================================================================================================================================= -->
    
    <uses-permission android:name="android.permission.READ_PHONE_STATE" />
    <uses-permission android:name="android.permission.CAMERA" />
    <uses-permission
        android:name="android.permission.FLASHLIGHT"
        android:permissionGroup="android.permission-group.HARDWARE_CONTROLS"
        android:protectionLevel="normal" />

    <uses-feature android:name="android.hardware.camera.flash" />
    <uses-feature android:name="android.hardware.camera" />
    <!-- ======================================================================================================================================= -->

    <application
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name=".TestActivity"
            android:label="@string/title_activity_main"
            android:screenOrientation="landscape"
            android:theme="@android:style/Theme.Black.NoTitleBar" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>
.......할말이 없네요.... 왜 전안되는걸까요 ㅡㅡ;
저소스 그대로 긁어가서 햇는데;; 안되네요;;;;
버전문제인건가....ㅠ_ㅠ
소스가 정상이여도 에러는 날수 있는게 안드로이드입니다

혹시 에뮬에서 돌리신게 아니라 실 단말이라면 단말을 껏다 켜보던가 아니면 프로젝트를 새로 만들어서 시험해보세요
에뮬에서 카메라는 따로 설정을 해줘야 나오는 걸로 알고 있습니다
에뮬은 거이 잘 쓰질않아 검색해서 확인해 보세요

또는 메니페스트에 activity 지정문제일수 있는데
 <activity android:name=".TestActivity"
의 뜻은 com.bingsubingsu.classes.TestActivity 에 해당 엑티비티가 있어야 합니다 이부분도 확인해 보세요
그리고 카메라의 경우 테스트 중 Camera.release() 가 정상적으로 안된경우 프리뷰 화면이 안나오고 종료 될 수 있습니다 이럴땐 걍 껏다 키고 다시 테스트 해보세요
...