public class Tracking extends AppCompatActivity implements SurfaceHolder.Callback,Camera.PreviewCallback{ Camera camera = null; SurfaceView camerasurface = null; Camera.Parameters parameters; static int height = 480; static int width = 640; private float scale1; private int oritentation;//屏幕方向0-竖屏,1-横屏 private static final int MY_CAMERA_REQUEST_CODE = 100; /** * 获取最适合屏幕的照片 尺寸 * * @param sizes * @param w * @param h * @return */ private static final int REQUEST_EXTERNAL_STORAGE = 1; private static String[] PERMISSIONS_STORAGE = { "android.permission.READ_EXTERNAL_STORAGE", "android.permission.WRITE_EXTERNAL_STORAGE" }; public static void verifyStoragePermissions(Activity activity) { try { //检测是否有写的权限 int permission = ActivityCompat.checkSelfPermission(activity, "android.permission.WRITE_EXTERNAL_STORAGE"); if (permission != PackageManager.PERMISSION_GRANTED) { // 没有写的权限,去申请写的权限,会弹出对话框 ActivityCompat.requestPermissions(activity, PERMISSIONS_STORAGE,REQUEST_EXTERNAL_STORAGE); } } catch (Exception e) { e.printStackTrace(); } } @RequiresApi(api = Build.VERSION_CODES.M) @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_tracking); if (checkSelfPermission(Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) { requestPermissions(new String[]{Manifest.permission.CAMERA}, MY_CAMERA_REQUEST_CODE); } getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); verifyStoragePermissions(this); camerasurface = (SurfaceView) findViewById(R.id.preview); camerasurface.getHolder().addCallback(this); camerasurface.setKeepScreenOn(true); if (this.getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) { Log.i("info", "landscape"); // 横屏 oritentation = 1; } else if (this.getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) { Log.i("info", "portrait"); // 竖屏 oritentation = 0; } int w = ScreenUtils.getScreenWidth(this); int h = ScreenUtils.getScreenHeight(this); if (oritentation == 0) { scale1 = (float) w / height; camerasurface.setLayoutParams(new FrameLayout.LayoutParams(w, (int) (width * scale1), Gravity.CENTER|Gravity.TOP)); } else { scale1 = (float) h / height; camerasurface.setLayoutParams(new FrameLayout.LayoutParams((int) (width * scale1), h, Gravity.CENTER|Gravity.TOP)); } } /** * A native method that is implemented by the 'native-lib' native library, * which is packaged with this application. */ @Override protected void onResume() { super.onResume(); // camera.setParameters(para); } @Override protected void onPause() { super.onPause(); Log.i("MainActivity","Activity On Pasue"); if (camera != null) { camera.setPreviewCallback(null); camera.stopPreview(); camera.release(); //finish(); } } private void reOpenCamera() { releaseCamera(); openCamera(surfaceHolder); } private void openCamera(SurfaceHolder holder) { releaseCamera(); // release Camera, if not release camera before call camera, it will be locked camera = Camera.open(Camera.CameraInfo.CAMERA_FACING_FRONT); parameters = camera.getParameters(); setCameraDisplayOrientation(this, Camera.CameraInfo.CAMERA_FACING_FRONT, camera); parameters.setPreviewSize(width, height); // parameters.setPreviewFormat(ImageFormat.YV12); // setting preview format:YV12 // parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_CONTINUOUS_VIDEO); camera.setParameters(parameters); // setting camera parameters try { camera.setPreviewDisplay(holder); } catch (IOException ioe) { ioe.printStackTrace(); } camera.setPreviewCallback(this); camera.startPreview(); } private synchronized void releaseCamera() { if (camera != null) { try { camera.setPreviewCallback(null); } catch (Exception e) { e.printStackTrace(); } try { camera.stopPreview(); } catch (Exception e) { e.printStackTrace(); } try { camera.release(); } catch (Exception e) { e.printStackTrace(); } camera = null; } } /** * Android API: Display Orientation Setting * Just change screen display orientation, * the rawFrame data never be changed. */ private void setCameraDisplayOrientation(Activity activity, int cameraId, Camera camera) { Camera.CameraInfo info = new Camera.CameraInfo(); Camera.getCameraInfo(cameraId, info); int rotation = activity.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 displayDegree; if (info.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) { displayDegree = (info.orientation + degrees) % 360; displayDegree = (360 - displayDegree) % 360; // compensate the mirror } else { displayDegree = (info.orientation - degrees + 360) % 360; } camera.setDisplayOrientation(displayDegree); } private SurfaceHolder surfaceHolder; @Override public void surfaceCreated(SurfaceHolder surfaceHolder) { this.surfaceHolder = surfaceHolder; openCamera(surfaceHolder); } @Override public void surfaceChanged(SurfaceHolder surfaceHolder, int i, int i1, int i2) { } @Override public void surfaceDestroyed(SurfaceHolder surfaceHolder) { } public static void saveImageData(byte[] imageData, String path) { File imageFile = new File(path); if (imageFile == null) return; try { FileOutputStream fos = new FileOutputStream(imageFile); fos.write(imageData); fos.close(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } public void byte2image(byte[] data,String path){ if(data.length<3||path.equals("")) return; try{ FileOutputStream imageOutput = new FileOutputStream(new File(path)); imageOutput.write(data, 0, data.length); imageOutput.close(); System.out.println("Make Picture success,Please find image in " + path); } catch(Exception ex) { System.out.println("Exception: " + ex); ex.printStackTrace(); } } /** * 保存图片到本地 * @param bm 图片 * @param picPath 保存地址 */ public static void saveBitmap(Bitmap bm, String picPath) { File f = new File(picPath); if (f.exists()) { f.delete(); } try { FileOutputStream out = new FileOutputStream(f); bm.compress(Bitmap.CompressFormat.JPEG, 100, out); out.flush(); out.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } public static Bitmap yuvToBitmap(byte[] data, int width, int height) { int frameSize = width * height; int[] rgba = new int[frameSize]; for (int i = 0; i < height; i++) for (int j = 0; j < width; j++) { int y = (0xff & ((int) data[i * width + j])); int u = (0xff & ((int) data[frameSize + (i >> 1) * width + (j & ~1) + 0])); int v = (0xff & ((int) data[frameSize + (i >> 1) * width + (j & ~1) + 1])); y = y < 16 ? 16 : y; int r = Math.round(1.164f * (y - 16) + 1.596f * (v - 128)); int g = Math.round(1.164f * (y - 16) - 0.813f * (v - 128) - 0.391f * (u - 128)); int b = Math.round(1.164f * (y - 16) + 2.018f * (u - 128)); r = r < 0 ? 0 : (r > 255 ? 255 : r); g = g < 0 ? 0 : (g > 255 ? 255 : g); b = b < 0 ? 0 : (b > 255 ? 255 : b); rgba[i * width + j] = 0xff000000 + (b << 16) + (g << 8) + r; } Bitmap bmp = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888); bmp.setPixels(rgba, 0 , width, 0, 0, width, height); return bmp; } private void Mirror(byte[] src, int w, int h) { //src是原始yuv数组 int i; int index; byte temp; int a, b; //mirror y for (i = 0; i < h; i++) { a = i * w; b = (i + 1) * w - 1; while (a < b) { temp = src[a]; src[a] = src[b]; src[b] = temp; a++; b--; } } // mirror u and v index = w * h; for (i = 0; i < h / 2; i++) { a = i * w; b = (i + 1) * w - 2; while (a < b) { temp = src[a + index]; src[a + index] = src[b + index]; src[b + index] = temp; temp = src[a + index + 1]; src[a + index + 1] = src[b + index + 1]; src[b + index + 1] = temp; a+=2; b-=2; } } } @Override public void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT) { oritentation = 0; } else { oritentation = 1; } int w = ScreenUtils.getScreenWidth(this); int h = ScreenUtils.getScreenHeight(this); if (oritentation == 0) { scale1 = (float) w / height; camerasurface.setLayoutParams(new FrameLayout.LayoutParams(w, (int) (width * scale1), Gravity.CENTER|Gravity.TOP)); } else { scale1 = (float) h / height; camerasurface.setLayoutParams(new FrameLayout.LayoutParams((int) (width * scale1), h, Gravity.CENTER|Gravity.TOP)); } reOpenCamera(); Log.e("Tracking", "onConfigurationChanged:" + oritentation); } @Override public void onPreviewFrame(byte[] data, Camera camera) { } }
android 摄像头预览,横竖屏自由切换,解决拉伸问题。
最新推荐文章于 2025-06-09 11:15:57 发布