2016-12-20 5 views
0

Я реализую поверхность в своем приложении, и она может работать на некоторых устройствах (галактика, htc, ...), но в sony Xperia, когда моя активность загружена У меня есть ошибка в заданных параметрах, как должен ли я сделать для решения этой ошибки?Ошибка в параметрах поверхности в некотором устройстве

активность:

public class TakePhotoActivity extends Activity implements SurfaceHolder.Callback, Camera.ShutterCallback, Camera.PictureCallback{ 



Camera mCamera; 
SurfaceView mPreview; 

boolean isPreviewRunning; 




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

    mPreview = (SurfaceView)findViewById(R.id.preview); 
    mPreview.getHolder().addCallback(this); 
    mPreview.getHolder().setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); 

    mCamera = Camera.open(); 

} 



@Override 
public void onPause() { 

     super.onPause(); 
     mCamera.stopPreview(); 
     finish(); 

} 

@Override 
public void onDestroy() { 
    super.onDestroy(); 
    mCamera.release(); 

} 

public void onCancelClick(View v) { 
    finish(); 
} 

public void onSnapClick(View v) { 
    mCamera.takePicture(this, null, null, this); 
} 

public void onSaveClick(View v) { 

} 

@Override 
public void onShutter() { 
    //Toast.makeText(this, "Click!", Toast.LENGTH_SHORT).show(); 
} 



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

    try { 

     /*try { 
      File file = new File(Environment.getExternalStorageDirectory().getPath() + File.separator +"DocumentsWallet"); 
      if(! file.exists()){ 
       file.mkdirs(); 
      } 

      FileOutputStream out = new FileOutputStream(file.getPath()+"/pic.jpeg"); 
      out.write(data); 
      out.flush(); 
      out.close(); 
     }catch(Exception ex){ 
      Toast.makeText(this,ex.getMessage(),Toast.LENGTH_LONG).show(); 
     }*/ 


     Photos img=new Photos(); 

     Bitmap bmp=img.convertArrayByteToBitmap(data); 
     Bitmap bitmap=img.rotateImage(bmp,90); 
     showPhoto(bitmap); 


    } catch (Exception e) { 
     Toast.makeText(this,"Error in onPictureTaken method : "+e.getMessage(),Toast.LENGTH_LONG).show(); 

    } 

    camera.startPreview(); 

} 





private void showPhoto(Bitmap bitmap) { 

    ImageView img = (ImageView) findViewById(R.id.imageView2); 

    mPreview.setVisibility(View.INVISIBLE); 
    img.setImageBitmap(bitmap); 
    img.setVisibility(View.VISIBLE); 
} 


@Override 
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { 


    try { 

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


     Camera.Parameters params = mCamera.getParameters(); 
     Camera.Size selected = getBestPreviewSize(); 
     params.setPreviewSize(selected.width, selected.height); 
     params.setPictureSize(selected.width, selected.height); 

     setCameraDisplayOrientation(); 
     params.setPictureFormat(PixelFormat.JPEG); 
     mCamera.setParameters(params); 
     isPreviewRunning = true; 
     mCamera.startPreview(); 
    }catch (Exception ex){ 

    } 

} 

@Override 
public void surfaceCreated(SurfaceHolder holder) { 
    try { 
     mCamera.setPreviewDisplay(mPreview.getHolder()); 

    } catch (Exception e) { 
     Toast.makeText(this,e.getMessage(),Toast.LENGTH_SHORT).show(); 
    } 
} 

@Override 
public void surfaceDestroyed(SurfaceHolder holder) { 

    isPreviewRunning = false; 
} 





private Camera.Size getBestPreviewSize() { 



    List<Camera.Size> sizeList = mCamera.getParameters().getSupportedPreviewSizes(); 
    Toast.makeText(this,sizeList.size()+"",Toast.LENGTH_LONG).show(); 
    Camera.Size bestSize = sizeList.get(0); 
    for(int i = 1; i < sizeList.size(); i++){ 

     if((sizeList.get(i).width * sizeList.get(i).height) > (bestSize.width * bestSize.height )){ 
      bestSize = sizeList.get(i); 
     } 
    } 

    return bestSize; 
} 




private void setCameraDisplayOrientation(){ 

    try { 

     android.hardware.Camera.CameraInfo info = 
       new android.hardware.Camera.CameraInfo(); 
     android.hardware.Camera.getCameraInfo(Camera.CameraInfo.CAMERA_FACING_BACK, info); 
     int rotation = getWindowManager().getDefaultDisplay() 
       .getRotation(); 
     int degrees = 0; 
     switch (rotation) { 
      case Surface.ROTATION_0: 
       degrees = 0; 
       break; 
      case Surface.ROTATION_90: 
       degrees = 90; 
       break; 
      case Surface.ROTATION_180: 
       degrees = 180; 
       break; 
      case Surface.ROTATION_270: 
       degrees = 270; 
       break; 
     } 

     int result; 
     if (info.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) { 
      result = (info.orientation + degrees) % 360; 
      result = (360 - result) % 360; // compensate the mirror 
     } else { // back-facing 
      result = (info.orientation - degrees + 360) % 360; 
     } 
     mCamera.setDisplayOrientation(result); 

    }catch (Exception ex){ 
     Toast.makeText(this,"Error in setCameraDisplayOrientation() method : "+ex.getMessage(),Toast.LENGTH_LONG).show(); 
    } 
    } 

} 

, когда я удалил и params.setPictureSize(selected.width, selected.height); ошибка решена, но я нужен лучший размер для моего образа. любой может мне помочь?

ответ

2

вы добавляете такую ​​же высоту, ширину в размере изображения, как и размер предварительного просмотра. Я не уверен в случае Sony Xperia, но некоторые из устройств могут не иметь одинаковых коэффициентов для размера предварительного просмотра и размера изображения. Итак, лучший вариант - получить соотношение сторон вашего выбранного размера (вы получите от getBestPreviewSize()) и найти наилучшее соответствие размера изображения с тем же соотношением сторон от List<Size> imageSizes = mCamera.getParameters().getSupportedPictureSizes();. Вы можете проверить подробный ответ here

+0

поблагодарить за лучший ответ – b4hr4m