其实TextureView是在Android4.0以后才有的,为了弥补SurfaceView的不足,即不能够融入到整个UI中,也不能设置一些属性,如设置透明度等等,废话不多说,上代码:
TextureView实现Camera的预览
package com.creditease.runningman; import android.app.Activity; import android.graphics.ImageFormat; import android.graphics.SurfaceTexture; import android.hardware.Camera; import android.os.Bundle; import android.util.DisplayMetrics; import android.util.Log; import android.view.Gravity; import android.view.TextureView; import android.view.WindowManager; import android.widget.FrameLayout; import java.io.IOException; /** * Created by guibaozou on 2016/11/3. */ public class TextureActivity extends Activity implements TextureView.SurfaceTextureListener{ private TextureView textureView; private Camera camera; private static final String TAG = "TextureActivity"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState);
//此行代码必须存在,是TextureView必要在窗口加速中才能使用 getWindow().setFlags( WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED, WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED); textureView = new TextureView(this); textureView.setSurfaceTextureListener(this); textureView.setBackgroundColor(getResources().getColor(android.R.color.black)); setContentView(textureView); } @Override public void onSurfaceTextureAvailable(SurfaceTexture surface, int width, int height) { camera = Camera.open(1); try { camera.setPreviewTexture(surface); } catch (IOException e) { e.printStackTrace(); } Camera.Parameters parameters = camera.getParameters(); Camera.Size previewSize = parameters.getPreviewSize(); // parameters.setPreviewSize(mScreenWidth,mScreenHeight); // parameters.setPictureFormat(ImageFormat.NV21); // camera.setParameters(parameters); textureView.setLayoutParams(new FrameLayout.LayoutParams(previewSize.width,previewSize.height,Gravity.CENTER)); camera.setPreviewCallback(new Camera.PreviewCallback() { @Override public void onPreviewFrame(byte[] data, Camera camera) { //在视频聊天中,这里传送本地frame数据给remote端 Log.e(TAG, "camera:"+camera); Log.e(TAG, "byte:"+data); } }); camera.startPreview();
//设置窗口透明度 textureView.setAlpha(0.5f);
//此行代码让其预览画面为竖直的画面
textureView.setRotation(90.0f); } @Override public void onSurfaceTextureSizeChanged(SurfaceTexture surface, int width, int height) { } @Override public boolean onSurfaceTextureDestroyed(SurfaceTexture surface) { camera.stopPreview(); camera.release(); return true; } @Override public void onSurfaceTextureUpdated(SurfaceTexture surface) { }}
SurfaceView预览Camera实现
package com.creditease.runningman; import android.app.Activity; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.ImageFormat; import android.graphics.PixelFormat; import android.graphics.Rect; import android.graphics.YuvImage; import android.hardware.Camera; import android.os.Bundle; import android.util.DisplayMetrics; import android.util.Log; import android.view.SurfaceHolder; import android.view.SurfaceView; import java.io.ByteArrayOutputStream; import java.io.IOException; /** * Created by guibaozou on 2016/11/3. */ public class SurfaceActivity extends Activity implements SurfaceHolder.Callback { private static final String TAG = "SurfaceActivity"; private Camera mCamera; private SurfaceView surfaceView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); surfaceView = new SurfaceView(this); surfaceView.getHolder().setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); surfaceView.getHolder().addCallback(this); setContentView(surfaceView); } @Override public void surfaceCreated(SurfaceHolder holder) { mCamera = Camera.open(1);//此行代码让其预览画面为竖直的画面 mCamera.setDisplayOrientation(90); try { mCamera.setPreviewDisplay(holder); } catch (IOException e) { e.printStackTrace(); } } @Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { Camera.Parameters parameters = mCamera.getParameters(); Camera.Size previewSize = parameters.getPreviewSize(); parameters.setPreviewSize(previewSize.width,previewSize.height); surfaceView.getHolder().setFixedSize(previewSize.width,previewSize.height); /* 每秒从摄像头捕获5帧画面, */ // parameters.setPreviewFrameRate(5); /* 设置照片的输出格式:jpg */ parameters.setPictureFormat(ImageFormat.NV21); /* 照片质量 */ // parameters.set("jpeg-quality", 85); parameters.setPictureSize(previewSize.width,previewSize.height); mCamera.setPreviewCallback(new Camera.PreviewCallback() { @Override public void onPreviewFrame(byte[] data, Camera camera) { //在视频聊天中,这里传送本地frame数据给remote端 Log.e(TAG, "camera:"+camera); Log.e(TAG, "byte:"+data); Camera.Size size = camera.getParameters().getPreviewSize(); YuvImage image = new YuvImage(data, ImageFormat.NV21, size.width, size.height, null); ByteArrayOutputStream stream = new ByteArrayOutputStream(); image.compressToJpeg(new Rect(0, 0, size.width, size.height), 80, stream); Bitmap bmp = BitmapFactory.decodeByteArray(stream.toByteArray(), 0, stream.size()); } }); mCamera.setParameters(parameters); mCamera.startPreview(); } @Override public void surfaceDestroyed(SurfaceHolder holder) { mCamera.stopPreview(); mCamera.setPreviewCallback(null); mCamera.release(); } }
若有不足,欢迎指正