2016-05-25 11 views
5

मैं कैमरा एपीआई 2 का उपयोग कर वीडियो रिकॉर्डिंग के आसपास काम करने के लिए Google आधिकारिक sample का उपयोग कर रहा हूं। लेकिन समस्या यह है कि मैं इसे पूर्ण स्क्रीन बनाने में सक्षम नहीं हूं क्योंकि मैंने केवल स्क्रीन अभिविन्यास को पोर्ट्रेट तक सीमित कर दिया है। यहां xml संपादित किया गया है और official xml है।कैमरा 2: पूर्ण स्क्रीन में वीडियो रिकॉर्ड करने में असमर्थ?

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 

    <AutoFitTextureView 
     android:id="@+id/texture" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignParentLeft="true" 
     android:layout_alignParentStart="true" 
     android:layout_alignParentTop="true" /> 

    <FrameLayout 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:layout_alignParentBottom="true" 
     android:layout_alignParentLeft="true" 
     android:layout_alignParentStart="true"> 

     <Button 
      android:id="@+id/video" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_gravity="center" 
      android:text="@string/label_record" /> 

     <ImageView 
      android:id="@+id/info" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_gravity="center_vertical|right" 
      android:contentDescription="Description" 
      android:padding="20dp" 
      android:src="@drawable/ic_more" /> 

    </FrameLayout> 

</RelativeLayout> 

मैं यहाँ लगता है TextureView के पहलू राशन द्वारा वीडियो स्क्रीन आकार सेट कर रहा है लेकिन मैं इसे पूर्ण स्क्रीन करने के लिए नहीं कर सके। कोई भी मदद बहुत ही सराहनीय होगी।

mVideoSize = chooseVideoSize(map.getOutputSizes(MediaRecorder.class)); 
mPreviewSize = chooseOptimalSize(map.getOutputSizes(SurfaceTexture.class), width, height, mVideoSize); 
int orientation = getResources().getConfiguration().orientation; 
if (orientation == Configuration.ORIENTATION_LANDSCAPE) { 
    mTextureView.setAspectRatio(mPreviewSize.getWidth(), mPreviewSize.getHeight()); 
} else { 
    mTextureView.setAspectRatio(mPreviewSize.getHeight(), mPreviewSize.getWidth()); 
} 

enter image description here

उत्तर

1

आपको रिकॉर्डिंग के स्क्रीन आकार पर नियंत्रण के लिए पूर्वावलोकन आकार से निपटने की आवश्यकता है। SurfaceTexture कक्षा के आउटपुट आकार प्राप्त करके अपनी पूर्वावलोकन पूर्ण स्क्रीन बनाने के लिए उसी chooseVideoSize विधि का उपयोग करें।

private static Size chooseVideoSize(Size[] choices) { 
     for (Size size : choices) { 
      if (size.getWidth() == size.getHeight() * 4/3 && size.getWidth() <= 1080) { 
       return size; 
      } 
     } 
     Log.e(TAG, "Couldn't find any suitable video size"); 
     return choices[choices.length - 1]; 
    } 

कि है

mPreviewSize = chooseVideoSize(map.getOutputSizes(SurfaceTexture.class)); 
+0

हाँ .. यह working..thanks है :) – Stella

1

शायद तुम एक विधि को बदलने कि मापता है और सही ओरिएंटेशन को TextureView घूमता को लागू कर सकते हैं।

private void transformImage(int width, int height) { 
    if (mPreviewSize == null || mTextureView == null) { 
     return; 
    } 
    Matrix matrix = new Matrix(); 
    int rotation = getWindowManager().getDefaultDisplay().getRotation(); 
    RectF textureRectF = new RectF(0, 0, width, height); 
    RectF previewRectF = new RectF(0, 0, mPreviewSize.getHeight(), mPreviewSize.getWidth()); 
    float centerX = textureRectF.centerX(); 
    float centerY = textureRectF.centerY(); 
    if (rotation == Surface.ROTATION_90 || rotation == Surface.ROTATION_270) { 
     previewRectF.offset(centerX - previewRectF.centerX(), 
       centerY - previewRectF.centerY()); 
     matrix.setRectToRect(textureRectF, previewRectF, Matrix.ScaleToFit.FILL); 
     float scale = Math.max((float) width/mPreviewSize.getWidth(), 
       (float) height/mPreviewSize.getHeight()); 
     matrix.postScale(scale, scale, centerX, centerY); 
     matrix.postRotate(90 * (rotation - 2), centerX, centerY); 
    } 
    mTextureView.setTransform(matrix); 
} 

उसके बाद आप कॉल करना चाहिए onResume से विधि परिणत:

public void onResume() { 
    super.onResume(); 
    if (mTextureView.isAvailable()) { 
     transformImage(mTextureView.getWidth(), mTextureView.getHeight()); 
    } else { 
     mTextureView.setSurfaceTextureListener(mSurfaceTextureListener); 
    } 
} 

और पर SurfaceTextureListener.Callback:

private TextureView.SurfaceTextureListener mSurfaceTextureListener = 
     new TextureView.SurfaceTextureListener() { 
      @Override 
      public void onSurfaceTextureAvailable(SurfaceTexture surface, int width, int height) { 
       transformImage(width, height); 
      } 

      @Override 
      public void onSurfaceTextureSizeChanged(SurfaceTexture surface, int width, int height) { 
      } 

      @Override 
      public boolean onSurfaceTextureDestroyed(SurfaceTexture surface) { 
       return false; 
      } 

      @Override 
      public void onSurfaceTextureUpdated(SurfaceTexture surface) { 
      } 
     }; 

Source

संबंधित मुद्दे