2015-12-09 3 views
0

В моем коде все идет хорошо, но нажато. Изображение сохраняется в ландшафтном режиме в данном каталоге. Я старался изо всех сил. Пожалуйста, помогите и предложите мне решить эту проблему.Почему изображение сохраняется в ландшафтном режиме?

Полный код приведен ниже с помощью экрана печати. или скачать здесь

https://www.dropbox.com/sh/vp6ohly4zb5vmvq/AACOyS8PvsRxFGBP9zjlVWhza?dl=0

Изображение сохраняется в SDcard даже захватили в портретном он появится в ландшафтном

enter image description here

public class AndroidCamera extends Activity implements SurfaceHolder.Callback{ 

    Camera camera; 

    SurfaceView surfaceView; 
    SurfaceHolder surfaceHolder; 
    boolean previewing = false; 
    LayoutInflater controlInflater = null; 

    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
     setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); 
     //camera.enableShutterSound(true); 


     getWindow().setFormat(PixelFormat.UNKNOWN); 
     surfaceView = (SurfaceView)findViewById(R.id.camerapreview); 
     surfaceHolder = surfaceView.getHolder(); 
     surfaceHolder.addCallback(this); 
     surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); 

     controlInflater = LayoutInflater.from(getBaseContext()); 
     View viewControl = controlInflater.inflate(R.layout.control, null); 
     LayoutParams layoutParamsControl 
       = new LayoutParams(LayoutParams.FILL_PARENT, 
       LayoutParams.FILL_PARENT); 
     this.addContentView(viewControl, layoutParamsControl); 

     Button buttonTakePicture = (Button)findViewById(R.id.takepicture); 
     buttonTakePicture.setOnClickListener(new Button.OnClickListener(){ 

      @Override 
      public void onClick(View arg0) { 
       // TODO Auto-generated method stub 
       camera.takePicture(myShutterCallback, 
         myPictureCallback_RAW, myPictureCallback_JPG); 
      }}); 
    } 

    ShutterCallback myShutterCallback = new ShutterCallback(){ 

     @Override 
     public void onShutter() { 
      // TODO Auto-generated method stub 

     }}; 

    PictureCallback myPictureCallback_RAW = new PictureCallback(){ 

     @Override 
     public void onPictureTaken(byte[] arg0, Camera arg1) { 
      // TODO Auto-generated method stub 

     }}; 



    PictureCallback myPictureCallback_JPG = new PictureCallback(){ 

     @Override 
     public void onPictureTaken(byte[] arg0, Camera arg1) { 
      // TODO Auto-generated method stub 

      Bitmap bitmapPicture 
        = BitmapFactory.decodeByteArray(arg0, 0, arg0.length); 




      String root = Environment.getExternalStorageDirectory().toString(); 
      File myDir = new File(root + "/cam_Api"); 
      myDir.mkdirs(); 

      FileOutputStream outStream = null; 
      try { 
       outStream = new FileOutputStream(String.format("/sdcard/cam_Api/cam_Ap1_%d.jpg", System.currentTimeMillis())); 

       outStream.write(arg0); 
       outStream.close(); 
      } 

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

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

      finally { 
      } 

      Toast.makeText(getApplicationContext(), "Picture Saved", Toast.LENGTH_LONG).show(); 
      refreshCamera(); 

//   File file = new File(Environment.getExternalStorageDirectory(),"/cam_Api/MyPhoto2.jpg"); 

     }}; 

    public void refreshCamera() { 
     if (surfaceHolder.getSurface() == null) { 
      return; 
     } 

     try { 
      camera.stopPreview(); 
     } 

     catch (Exception e) { 
     } 

     try { 
      camera.setPreviewDisplay(surfaceHolder); 
      camera.startPreview(); 
     } 
     catch (Exception e) { 
     } 
    } 

    @Override 
    public void surfaceChanged(SurfaceHolder holder, int format, int width, 
           int height) { 
     // TODO Auto-generated method stub 
     if(previewing){ 
      camera.stopPreview(); 
      previewing = false; 
     } 

     if (camera != null){ 
      try { 
       camera.setPreviewDisplay(surfaceHolder); 
       camera.startPreview(); 
       previewing = true; 
      } catch (IOException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
     } 
    } 

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

     camera = Camera.open(); 
     camera.setDisplayOrientation(90); 
    } 

    @Override 
    public void surfaceDestroyed(SurfaceHolder holder) { 
     // TODO Auto-generated method stub 
     camera.stopPreview(); 
     camera.release(); 
     camera = null; 
     previewing = false; 
    } 
} 
+1

https://stackoverflow.com/questions/27486166/storing-image-in-wrong-direction/27486229#27486229 – CommonsWare

+0

@bakriOnFire сэр, пожалуйста, помогите решить это – Akash

+0

@CommonsWare: вам не кажется, что этот вопрос может быть отмечен как дубликат? –

ответ

0

Кажется, что вы звоните:

camera.setDisplayOrientation(90); 

whic h, вероятно, приведет к созданию пейзажного изображения, которое вы видите, когда ваше приложение находится в портретном режиме.

Вы должны использовать:

int rotation = activity.getWindowManager().getDefaultDisplay().getRotation(); 

, чтобы получить вращение дисплея, а затем установить:

caemra.setDisplayOrientation(rotation); 

или просто позвоните camera.setDisplayOrientation (0) и установите screenOrientation в андроид манифеста, как так:

<activity 
     android:name=".MainActivity" 
     android:label="@string/app_name" 
     android:screenOrientation="portrait" 

для предотвращения изменения ориентации.

+0

По-прежнему результат такой же, и экран камеры выглядит в ландшафте, вот почему я держал 90 градусов, чтобы камера выглядела хорошо, но она сохранялась в ландшафте. – Akash

+0

Пробовал ли вы установить значение 0 или получить значение «вращения»? Я бы рекомендовал попробовать оба. – harry2680

+0

да пробовал, но не удалось разницы была камера появилась в ландшафтном режиме – Akash

0

необходимо повернуть изображение, а затем сохранить его.

public static Bitmap rotateImage(Bitmap bitmapSrc) { 
    Matrix matrix = new Matrix(); 
    matrix.postRotate(CameraConfigurationUtils.previewRotation); 
    return Bitmap.createBitmap(bitmapSrc, 0, 0, 
      bitmapSrc.getWidth(), bitmapSrc.getHeight(), matrix, true); 
} 

Чтобы получить вращение:

private static int setCameraDisplayOrientation(Context mContext, android.hardware.Camera.CameraInfo info) { 
    int rotation = ((CameraActivity) mContext).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; 
    } 

    if (info.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) { 
     previewRotation = (info.orientation + degrees) % 360; 
     previewRotation = (360 - previewRotation) % 360; // compensate the mirror 
    } else { // back-facing 
     previewRotation = (info.orientation - degrees + 360) % 360; 
    } 
    return previewRotation; 
    } 
+0

что это за камераConfigurationutils.preventRotation – Akash

+0

избежать этой линии. Его значение возвращается методом setCameraDisplayOrientation –

+0

Строка orientString = exif.getAttribute (ExifInterface.TAG_ORIENTATION); и int orientation = orientString! = null? Integer.parseInt (orientString): ExifInterface.ORIENTATION_NORMAL; имеют значение 0, что означает – Akash

Смежные вопросы