2013-03-25 62 views
0

我正在開發自定義的相機應用。我設置了android清單文件屏幕模式的肖像。它可以在HTC和其他設備上正常工作,但在三星手機上,會出現定位問題。如何開發定製相機的所有設備..如何開發自定義的相機應用的不同manufacters

相機模塊

public class Cameramodule extends Activity { 

Camerapriview preview; 
FrameLayout cameraframe; 
Button b,camswitch; 
ImageButton camera_settings,Take_picture; 

public static int second_select=0; 
Animation animation; 

int orienation; 

SensorManager sensorManager; 

ImageButton flash,camera_switching; 

RelativeLayout second_overlay; 
int flag=1; 

public static int cam_switch_flag=1; 

Button one,two,five,eight,ten,infinity; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_cameramodule); 






    one=(Button) findViewById(R.id.one); 
    two=(Button) findViewById(R.id.two); 
    five=(Button) findViewById(R.id.five); 
    eight=(Button) findViewById(R.id.eight); 
    ten=(Button) findViewById(R.id.ten); 
    infinity=(Button) findViewById(R.id.infinity); 

    one.setOnClickListener(new OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      // TODO Auto-generated method stub 
      second_select=1; 
      second_overlay.setVisibility(View.GONE); 


     } 
    }); 

    two.setOnClickListener(new OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      // TODO Auto-generated method stub 
      second_select=2; 
      second_overlay.setVisibility(View.GONE); 

     } 
    }); 

    five.setOnClickListener(new OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      // TODO Auto-generated method stub 
      second_select=5; 
      second_overlay.setVisibility(View.GONE); 

     } 
    }); 

    eight.setOnClickListener(new OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      // TODO Auto-generated method stub 
      second_select=8; 
      second_overlay.setVisibility(View.GONE); 

     } 
    }); 

    ten.setOnClickListener(new OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      // TODO Auto-generated method stub 
      second_select=10; 
      second_overlay.setVisibility(View.GONE); 

     } 
    }); 

    infinity.setOnClickListener(new OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      // TODO Auto-generated method stub 
      second_overlay.setVisibility(View.GONE); 

      second_select=0;//zero means infinity; 

     } 
    }); 

    preview=new Camerapriview(this,Cameramodule.this); 

    second_overlay=(RelativeLayout) findViewById(R.id.second_overlay); 
    second_overlay.setVisibility(View.GONE); 

    //sensorManager = (SensorManager)getSystemService(SENSOR_SERVICE); 


    cameraframe=(FrameLayout) findViewById(R.id.mframe); 
    camera_settings=(ImageButton) findViewById(R.id.camera_settings); 
    Take_picture=(ImageButton) findViewById(R.id.taje_picture); 

    camera_switching=(ImageButton) findViewById(R.id.camera_switch); 


    orienation=getResources().getConfiguration().orientation; 



    cameraframe.addView(preview); 

    WindowManager wm = (WindowManager) getSystemService(Context.WINDOW_SERVICE); 


    Display display = getWindowManager().getDefaultDisplay(); 
    int width = display.getWidth(); // deprecated 
    int height = display.getHeight(); 





    //create dialog box.. 





    /* 
    * 
    * Camera record setting options 
    */ 


    Take_picture.setOnClickListener(new OnClickListener() { 

     @Override 
     public void onClick(View arg0) { 
      // TODO Auto-generated method stub 
      preview.camera.takePicture(null, new Rwacallbackhandler(getApplicationContext()), new Photohandler(getApplicationContext())); 



     } 
    }); 


    /* 
    * Switch the front and back camera... 
    */ 
    camera_switching.setOnClickListener(new OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      // TODO Auto-generated method stub 

      preview.callswitch(Cameramodule.this); 

      if(cam_switch_flag==1) 
      { 
      cam_switch_flag=2; 
      } 
      else if (cam_switch_flag==2) { 
       cam_switch_flag=1; 

      } 



     } 
    }); 

    //create flash option 

    camera_settings.setOnClickListener(new OnClickListener() { 

     @Override 
     public void onClick(View arg0) { 
      // TODO Auto-generated method stub 

      if(flag==1) 
      { 
      second_overlay.setVisibility(View.VISIBLE); 
      startAnimationPopOut(); 

      flag=2; 
      } 
      else if(flag==2) 
      { 
       second_overlay.setVisibility(View.GONE); 
       //startAnimationPopOut(); 
       flag=1; 

      } 

     } 
    }); 


} 



private void startAnimationPopOut() {   


    animation = AnimationUtils.loadAnimation(this,R.anim.layout_animation); 

    animation.setAnimationListener(new AnimationListener() {     
     @Override 
     public void onAnimationStart(Animation animation) { 

     } 

     @Override 
     public void onAnimationRepeat(Animation animation) { 

     } 

     @Override 
     public void onAnimationEnd(Animation animation) { 

     } 
    }); 

    second_overlay.clearAnimation(); 
    second_overlay.startAnimation(animation); 

} 

}

Camerapriview

public class Camerapriview extends SurfaceView implements SurfaceHolder.Callback { 

public static Activity mactivity; 
SurfaceHolder holder; 
public Camera camera; 
List<String> coloreffect; 
public Context mcoContext; 
int currentCameraId=Camera.CameraInfo.CAMERA_FACING_BACK; 


int cameraId=Camera.CameraInfo.CAMERA_FACING_BACK; 

public Camerapriview(Context context, Cameramodule cameramodule) { 
    super(context); 
    // TODO Auto-generated constructor stub 
    mcoContext=context; 
    mactivity=cameramodule; 

    holder=getHolder(); 
    holder.addCallback(this); 
    holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); 




} 

@Override 
public void surfaceChanged(SurfaceHolder holder, int format, int width, 
     int height) { 
    // TODO Auto-generated method stub 



    //setCameraDisplayOrientation(mactivity, cameraId, camera); 
    camera.setDisplayOrientation(90); 
    camera.startPreview(); 





} 

@Override 
public void surfaceCreated(SurfaceHolder holder) { 
    // TODO Auto-generated method stub 

    camera=Camera.open(cameraId); 

    Camera.Parameters param=camera.getParameters(); 
    param.setFlashMode(Camera.Parameters.FLASH_MODE_AUTO); 
    camera.setParameters(param); 


    holder.setFixedSize(mactivity.getWindow().getWindowManager() 
      .getDefaultDisplay().getWidth(),mactivity.getWindow().getWindowManager() 
      .getDefaultDisplay().getHeight()); 



    try 
    { 
     camera.setPreviewDisplay(this.holder); 


    } 

    catch (Exception e) { 
     // TODO: handle exception 
    } 

} 

@Override 
public void surfaceDestroyed(SurfaceHolder holder) { 
    // TODO Auto-generated method stub 
    //preview.this.getHolder().removeCallback(this); 



      camera.setPreviewCallback(null); 
      camera.stopPreview(); 

      camera.release(); 
      holder = null; 
      camera = null; 






} 



//Set the orientation of the camera..... 

    public void setCameraDisplayOrientation(Activity activity, 
      int cameraId, android.hardware.Camera camera) 
    { 

     camera.stopPreview(); 
     android.hardware.Camera.CameraInfo info = 
       new android.hardware.Camera.CameraInfo(); 
     android.hardware.Camera.getCameraInfo(cameraId, info); 
     int rotation = activity.getWindowManager().getDefaultDisplay() 
       .getRotation(); 
     int degrees = 0; 
     switch (rotation) { 
      case Surface.ROTATION_0: degrees = 0; 
      Toast.makeText(mcoContext,"degree zero", 1000).show(); 
             break; 
      case Surface.ROTATION_90: degrees = 90; 

      Toast.makeText(mcoContext,"degree 90", 1000).show(); 

             break; 
      case Surface.ROTATION_180: degrees = 180; 
      Toast.makeText(mcoContext,"degree 180", 1000).show(); 

             break; 
      case Surface.ROTATION_270: degrees = 270; 
      Toast.makeText(mcoContext,"degree 270", 1000).show(); 

             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; 
     } 

     camera.setDisplayOrientation(result); 


    } 

    public void callswitch(Cameramodule cameramodule) { 
     // TODO Auto-generated method stub 
     try 
     { 

     Activity myactivity=cameramodule; 

     camera.release(); 

      //swap the id of the camera to be used 
      if(currentCameraId == Camera.CameraInfo.CAMERA_FACING_BACK){ 
       currentCameraId = Camera.CameraInfo.CAMERA_FACING_FRONT; 
      } 
      else { 
       currentCameraId = Camera.CameraInfo.CAMERA_FACING_BACK; 
      } 
      camera = Camera.open(currentCameraId); 
      //Code snippet for this method from somewhere on android developers, i forget where 

      setCameraDisplayOrientation(myactivity, currentCameraId, camera); 

      try { 
       //this step is critical or preview on new camera will no know where to render to 
       camera.setPreviewDisplay(holder); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
      camera.startPreview(); 
     } 
     catch (Exception e) { 
      // TODO: handle exception 
      Toast.makeText(mcoContext, e.getMessage().toString(), 1000).show(); 
     } 

    } 

    //set the flash modes... 

    public void setflash() { 
     // TODO Auto-generated method stub 

     Toast.makeText(mcoContext, "Inside set", 1000).show(); 
     Log.i("flash", "My flash"); 

     Camera.Parameters param=camera.getParameters(); 

     List<String> flash=param.getSupportedFlashModes(); 

     if(camera.getParameters().getFlashMode()==Camera.Parameters.FLASH_MODE_AUTO) 
     { 
      if(flash.contains(Camera.Parameters.FLASH_MODE_ON)) 
       param.setFlashMode(Camera.Parameters.FLASH_MODE_AUTO); 

     } 

      else 
      { 
       if(flash.contains(Camera.Parameters.FLASH_MODE_ON)) 
       param.setFlashMode(Camera.Parameters.FLASH_MODE_ON); 

      } 

     camera.setParameters(param); 
     } 




    }    

我有方向問題。我想設置屏幕始終縱向模式。

+0

你有什麼問題?詳細說明,也許我們可以幫助 – Stanley 2013-03-25 07:07:33

+0

我發佈的代碼also.I要設置肖像screenmode,但三星手機不支持該mode.Help我找到共同的解決辦法適用於所有Android手機 – 2013-03-25 07:14:16

+0

在這種情況下很多時候,_Samsung phones_是異常值。當然他們確實有很大的市場份額,我不太確定其他廠商的手機是否會顯示這個bug。 – Kgrover 2013-03-25 07:18:15

回答

0

貌似有對三星Android開發者網站,在那裏他們概述Common Issues in Android一些幫助。您有很多代碼供我瀏覽,但是我看到此部分:

問題:預覽顯示方向錯誤。

,並認爲此頁可能是對你有所幫助。

+0

這裏有答案嗎? – Kgrover 2013-03-25 16:04:44

0

過得好異常,或者它忽略你的setDisplayOrientation()調用,或者其他什麼東西? 嘗試確保你的寬度/高度在肖像中得到支持。我曾經有一個設置肖像模式的模擬問題,在你surfaceChanged中,試試:

final Camera.Parameters parameters = this.mCamera.getParameters(); 
List<Camera.Size> previewSizes = parameters.getSupportedPreviewSizes(); 
Camera.Size cs = previewSizes.get(0); 

mCamera.setDisplayOrientation(90); 
parameters.setPreviewSize(cs.width,cs.height); 
this.mCamera.setParameters(parameters); 

this.mCamera.startPreview(); 
+0

三星手機仍然存在問題,如何爲所有手機獲得通用解決方案 – 2013-03-25 07:42:04

相關問題