2012-08-09 69 views
1

我的应用程序要求我拍摄一张照片,并且遇到问题的唯一设备是Motorola Razr。我已经在Nexus One,Droid X,Droid 2,Sensation和其他一些产品上尝试过了。这里是代码我使用:摩托罗拉Razr相机崩溃 - 内存不足

public class CameraView extends Activity { 
    private static final String TAG = "CameraView"; 

    private SurfaceView preview=null; 
    private SurfaceHolder previewHolder=null; 
    public Camera camera=null; 
    private boolean inPreview=false; 
    private ImageView takePicture; 

    private Uri uriTarget; 


    @Override 
    public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.cameraview); 

    takePicture = (ImageView)findViewById(R.id.take_picture); 

    preview=(SurfaceView)findViewById(R.id.preview); 
    previewHolder=preview.getHolder(); 
    previewHolder.addCallback(surfaceCallback); 
    previewHolder 
     .setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); 


    if (savedInstanceState != null) 
    { 
     uriTarget = savedInstanceState.getParcelable("uriTarget"); 
    } 

    preview.setOnClickListener(new OnClickListener(){ 

     @Override 
     public void onClick(View arg0) { 
      takePicture.setEnabled(false); 
      camera.autoFocus(myAutoFocusCallback); 

     } 

    }); 


    takePicture.setOnClickListener(new OnClickListener(){ 

     @Override 
     public void onClick(View arg0) { 

      //camera.takePicture(null, null, photoCallback); 
      camera.takePicture(myShutterCallback, 
        myPictureCallback_RAW, myPictureCallback_JPG); 
      inPreview=false;  
     } 

    }); 


    } 

    @Override 
    public void onResume() { 
    super.onResume(); 
    try{ 
     if (camera==null) { 
      camera=Camera.open(); 
      camera.setDisplayOrientation(90); 
      Camera.Parameters params = camera.getParameters(); 
      params.set("rotation", 90); 
      params.setJpegQuality(60); 
      //params.setPictureSize(32, 32); 
      camera.setParameters(params); 

     } 
    }catch (Exception e){ 
     finish(); 
    } 
    } 

    @Override 
    public void onPause() { 
    if (inPreview) { 
     camera.stopPreview(); 
    } 
    if(camera != null) 
     camera.release(); 
    camera=null; 
    inPreview=false; 

    super.onPause(); 
    } 

    SurfaceHolder.Callback surfaceCallback=new SurfaceHolder.Callback() { 
    public void surfaceCreated(SurfaceHolder holder) { 
     try { 
     camera.setPreviewDisplay(previewHolder); 
     } 
     catch (Throwable t) { 
     Log.e("PictureDemo-surfaceCallback", 
      "Exception in setPreviewDisplay()", t); 
     Toast.makeText(CameraView.this, t.getMessage(), 
      Toast.LENGTH_LONG).show(); 
     } 
    } 

    public void surfaceChanged(SurfaceHolder holder, 
     int format, int width, int height) { 
     Camera.Parameters parameters=camera.getParameters(); 
     parameters.setPictureFormat(PixelFormat.JPEG); 
     parameters.setJpegQuality(60); 
     parameters.set("rotation", 90); 
     camera.setParameters(parameters); 
     camera.startPreview(); 

     inPreview=true; 
    } 

    public void surfaceDestroyed(SurfaceHolder holder) { 
     // no-op 
    } 
    }; 


    ShutterCallback myShutterCallback = new ShutterCallback(){ 

     @Override 
     public void onShutter() { 

     }}; 


    PictureCallback myPictureCallback_RAW = new PictureCallback(){ 

     @Override 
     public void onPictureTaken(byte[] arg0, Camera arg1) { 

     }}; 

    PictureCallback myPictureCallback_JPG = new PictureCallback(){ 

     @Override 
     public void onPictureTaken(byte[] data, Camera camera1) { 


      Constants.car_image = BitmapFactory.decodeByteArray(data, 0, data.length); 
      Constants.showImage = true; 

      FileOutputStream outStream = null; 
      try { 


       File esd = Environment.getExternalStorageDirectory(); 


       File newDirectory = new File(esd.getAbsolutePath() + "/DCIM/statefair/"); 
       if(!newDirectory.exists()) 
        newDirectory.mkdirs(); 
       outStream = new FileOutputStream(esd.getAbsolutePath() + String.format(
         "/DCIM/statefair/%d.jpg", System.currentTimeMillis())); 

       outStream.write(data); 
       outStream.close(); 
      } catch (FileNotFoundException e) { 
       e.printStackTrace(); 

      } catch (IOException e) { 
       e.printStackTrace(); 

        System.out.println("IO exception"); 
      } finally { 
        System.out.println("Finally"); 
        camera.release(); 
      } 

      finish(); 

     } 
     }; 
     AutoFocusCallback myAutoFocusCallback = new AutoFocusCallback(){ 

      @Override 
      public void onAutoFocus(boolean arg0, Camera arg1) { 
      // TODO Auto-generated method stub 
      takePicture.setEnabled(true); 
      } 
     }; 
     protected void onSaveInstanceState(Bundle outState) 
     { 
      outState.putParcelable("uriTarget", uriTarget); 
     } 
} 

我得到一个OutOfMemory错误在这条线:

Constants.car_image = BitmapFactory.decodeByteArray(data, 0, data.length); 

,甚至当我设置JPEG质量10.其他人遇到这个问题?

+0

这是因为每部手机都有不同的相机图像格式,揣摩什么是摩托罗拉DROID的图像格式,并使用它。 – Numair 2012-08-09 16:02:56

回答

1

入住这BitmapFactory.Options

全尺寸图像需要大量的内存,你应该重新大小。只是为了快速测试,试试这个:

Options opts = new Options(); 
opts.inSampleSize = 4;   
Constants.car_image = BitmapFactory.decodeByteArray(data, 0, data.length, opts);