2016-12-20 60 views
0

我在我的應用程序中實現了表面,它可以在某些設備(galaxy,htc,...)上運行,但在索尼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

您正在爲預覽尺寸添加相同的高度,圖片尺寸寬度。我不確定索尼Xperia的情況,但某些設備的預覽尺寸和圖片尺寸可能沒有相同的比例。 因此,最佳選擇是獲得所選尺寸的縱橫比(您可從getBestPreviewSize()獲得),並從List<Size> imageSizes = mCamera.getParameters().getSupportedPictureSizes();中找到與縱橫比相同的圖片尺寸的最佳匹配。您可以查看詳細的答案here

+0

感謝您的最佳答案 – b4hr4m

相關問題