2013-08-16 3 views
0

Я делаю приложение, которое использует камеру для отправки данных на поверхность. Но когда я вызываю addCallBack(), мое приложение падает. Вот код:Использование камеры телефона

public class Cam_View extends Activity implements SurfaceHolder.Callback{ 

private SurfaceView camView; 
private SurfaceHolder camHolder; 
private boolean previewRunning; 

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

camView = (SurfaceView)findViewById(R.id.sview); 
camHolder = camView.getHolder(); 
camHolder.addCallback(this); 
camHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); 
}} 

И нереализованные методы:

@Override 
    public void surfaceChanged(SurfaceHolder holder, int format, int width, 
    int height) { 
if(previewRunning){ 
    camera.stopPreview(); 
} 
Camera.Parameters camParams = camera.getParameters(); 
camParams.setPreviewFormat(PixelFormat.JPEG); 
camera.setParameters(camParams); 
try{ 
    camera.setPreviewDisplay(holder); 
    camera.startPreview(); 
    previewRunning=true; 
}catch(IOException e){ 
    e.printStackTrace(); 
} 
} 


public void surfaceCreated(SurfaceHolder holder) { 
try{ 
    camera=Camera.open(); 
}catch(Exception e){ 
    e.printStackTrace(); 
    Toast.makeText(getApplicationContext(),"Error",Toast.LENGTH_LONG).show(); 
    finish(); 
} 
} 

    @Override 
    public void surfaceDestroyed(SurfaceHolder holder) { 
camera.stopPreview(); 
camera.release(); 
camera=null; 
    } 

Почему аварии приложение, когда я называю
camHolder.addCallback (это); ? Есть ли другие проблемы в моем коде?

ответ

1

Я пробовал ваш код выше. Он отлично работает на моем устройстве. Я смог успешно запустить камеру. Я не думаю, что это проблема в camHolder.addCallback (this);

проблема заключается в линии

camParams.setPreviewFormat (PixelFormat.JPEG); .

обновление его

Camera.Size размер = camParams.getSupportedPreviewSizes() получаем (0); camParams.setPreviewSize (размер. Ширина, размер. Высота);

Ваш код будет работать.

Также убедитесь, что нижеследующие вещи правильно добавлены.

1) sview имени SurfaceView выходит в макете

2) Добавить разрешение камеры - "android.permission.CAMERA"

, если проблема все еще имеет место, то пожалуйста поделитесь журналы.

+0

Он теперь работает отлично. – mremremre1

0

проверить этот код, это работает для меня.

ПЕРВЫЙ CameraDemo деятельность

public class CameraDemo extends Activity { 
    private static final String TAG = "CameraDemo"; 
    Camera camera; 
    Preview preview; 
    Button buttonClick; 

    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_camera_demo); 

     preview = new Preview(this); 
     ((FrameLayout) findViewById(R.id.preview)).addView(preview); 

     buttonClick = (Button) findViewById(R.id.buttonClick); 
     buttonClick.setOnClickListener(new OnClickListener() { 
      public void onClick(View v) { 
       preview.camera.takePicture(shutterCallback, rawCallback, jpegCallback); 
      } 
     }); 

     Log.d(TAG, "onCreate'd"); 
    } 


    ShutterCallback shutterCallback = new ShutterCallback() { 
     public void onShutter() { 
      Log.d(TAG, "onShutter'd"); 
     } 
    }; 

    /** Handles data for raw picture */ 
    PictureCallback rawCallback = new PictureCallback() { 
     public void onPictureTaken(byte[] data, Camera camera) { 
      Log.d(TAG, "onPictureTaken - raw"); 
     } 
    }; 

    /** Handles data for jpeg picture */ 
    PictureCallback jpegCallback = new PictureCallback() { 
     public void onPictureTaken(byte[] data, Camera camera) { 
      FileOutputStream outStream = null; 
      long time = 0; 
      try { 
       // write to local sandbox file system 
//    outStream = CameraDemo.this.openFileOutput(String.format("%d.jpg", System.currentTimeMillis()), 0);  
       // Or write to sdcard 
       time = System.currentTimeMillis(); 
       outStream = new FileOutputStream(String.format("/sdcard/%d.jpg",time));  
       outStream.write(data); 
       outStream.close(); 
       Log.d(TAG, "onPictureTaken - wrote bytes: " + data.length); 
      } catch (FileNotFoundException e) { 
       e.printStackTrace(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } finally { 



      } 
      Log.d(TAG, "onPictureTaken - jpeg"); 
     } 
    }; 

} 

И класс Предварительный просмотр:

class Preview extends SurfaceView implements SurfaceHolder.Callback { 
    private static final String TAG = "Preview"; 

    SurfaceHolder mHolder; 
    public static Camera camera; 

    Preview(Context context) { 
     super(context); 

     // Install a SurfaceHolder.Callback so we get notified when the 
     // underlying surface is created and destroyed. 
     mHolder = getHolder(); 
     mHolder.addCallback(this); 
     mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); 
    } 

    public void surfaceCreated(SurfaceHolder holder) { 
     // The Surface has been created, acquire the camera and tell it where 
     // to draw. 



     /* camera = getCameraInstance(); 

     camera = Camera.open();*/ 

     //int cameraType = 1; // front 
     camera = Camera.open(CameraInfo.CAMERA_FACING_BACK); 



     try { 
      camera.setPreviewDisplay(holder); 


      camera.setPreviewCallback(new PreviewCallback() { 

       public void onPreviewFrame(byte[] data, Camera arg1) { 
        FileOutputStream outStream = null; 
        try { 
         outStream = new FileOutputStream(String.format("/sdcard/%d.jpg", System.currentTimeMillis()));  
         outStream.write(data); 
         outStream.close(); 
         Log.d(TAG, "onPreviewFrame - wrote bytes: " + data.length); 
        } catch (FileNotFoundException e) { 

         e.printStackTrace(); 
        } catch (IOException e) { 
         e.printStackTrace(); 
        } finally { 
        } 
         Preview.this.invalidate(); 
       } 
      }); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 

    public static Camera getCameraInstance(){ 
     camera = null; 
     try { 
      camera = Camera.open(); // attempt to get a Camera instance 
     } 
     catch (Exception e){ 
      // Camera is not available (in use or does not exist) 
     } 
     return camera; // returns null if camera is unavailable 
    } 

    public void surfaceDestroyed(SurfaceHolder holder) { 
     // Surface will be destroyed when we return, so stop the preview. 
     // Because the CameraDevice object is not a shared resource, it's very 
     // important to release it when the activity is paused. 
     camera.stopPreview(); 

     camera.release(); 
     camera = null; 
    } 

    public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) { 
     // Now that the size is known, set up the camera parameters and begin 
     // the preview. 
     Camera.Parameters parameters = camera.getParameters(); 
//  parameters.setPreviewSize(w, h); 
     camera.setParameters(parameters); 
     camera.startPreview(); 
    } 

    @Override 
    public void draw(Canvas canvas) { 
      super.draw(canvas); 
      Paint p= new Paint(Color.RED); 
      Log.d(TAG,"draw"); 
      canvas.drawText("PREVIEW", canvas.getWidth()/2, canvas.getHeight()/2, p); 
    } 
}