faceview for camera在android lollipop os中不起作用

Moh*_*j S 15 android android-intent android-camera android-5.1.1-lollipop

今天我在android中遇到了一个问题surfaceview for camera customization.我尝试了下面的代码.

拍摄图像时出现问题,它会停止相机预览并且不会返回活动.

以下代码将在程序中实现.我从stackoverflow上的现有引用中获取此代码

  1. 支持班级.

    public class AndroidCameraSurfaceview extends Activity implements
        SurfaceHolder.Callback {
    TextView testView;
    
    Camera camera;
    SurfaceView surfaceView;
    SurfaceHolder surfaceHolder;
    boolean preview;
    
    PictureCallback rawCallback;
    ShutterCallback shutterCallback;
    PictureCallback jpegCallback;
    int displayheight, displaywidth;
    Camera.PreviewCallback previewCallback;
    
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        setContentView(R.layout.camerasurfaceview);
    
        getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
        getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
        surfaceView = (SurfaceView) findViewById(R.id.surfaceView);
        surfaceHolder = surfaceView.getHolder();
    
        surfaceHolder.addCallback(this);
    
        surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
    
        jpegCallback = new PictureCallback() {
            public void onPictureTaken(byte[] data, Camera camera) {
                Bundle b = new Bundle();
                b.putByteArray("Image", data);
                Intent intent = new Intent();
                intent.putExtras(b);
                setResult(RESULT_OK, intent);
                finish();
                // refreshCamera();
            }
        };
    }
    
    
    
    public void captureImage(View v) throws IOException {
                // take the picture
                camera.takePicture(null, null, jpegCallback);
            }
    
        public void refreshCamera() {
            if (surfaceHolder.getSurface() == null) {
                // preview surface does not exist
                return;
            }
    
            try {
                camera.stopPreview();
            } catch (Exception e) {
            }
    
            try {
                camera.setDisplayOrientation(90);
                camera.setPreviewDisplay(surfaceHolder);
                camera.startPreview();
            } catch (Exception e) {
    
            }
        }
    
        public void surfaceChanged(SurfaceHolder holder, int format, int width,
                int height) {
            if (preview) {
                camera.stopPreview();
            }
    try{
            Camera.Parameters parameters = camera.getParameters();
            List<Size> sizes = parameters.getSupportedPreviewSizes();
            Size optimalSize = getOptimalPreviewSize(sizes, width, height);
            parameters.setPreviewSize(optimalSize.width, optimalSize.height);
            camera.setParameters(parameters);
            try {
                camera.setDisplayOrientation(90);
                camera.setPreviewDisplay(holder);
                camera.startPreview();
                preview = true;
            } catch (IOException e) {
                e.printStackTrace();
            }
    }catch(Exception e){
        System.out.println("Surface Exception---=>"+e);
    }
        }
    
        public void surfaceCreated(SurfaceHolder holder) {
            camera = Camera.open();
            if (camera != null) {
                Camera.Parameters params = camera.getParameters();
                camera.setDisplayOrientation(90);
                camera.setParameters(params);
    
            }
        }
    
        public void surfaceDestroyed(SurfaceHolder holder) {
            // stop preview and release camera
            camera.stopPreview();
            camera.release();
            camera = null;
        }
    
        private Size getOptimalPreviewSize(List<Size> sizes, int w, int h) {
            final double ASPECT_TOLERANCE = 1;
            double targetRatio = (double) w / h;
            if (sizes == null)
                return null;
            Size optimalSize = null;
            double minDiff = Double.MAX_VALUE;
            int targetHeight = h;
            for (Size size : sizes) {
                double ratio = (double) size.width / size.height;
                if (Math.abs(ratio - targetRatio) > ASPECT_TOLERANCE)
                    continue;
                if (Math.abs(size.height - targetHeight) < minDiff) {
                    optimalSize = size;
                    minDiff = Math.abs(size.height - targetHeight);
                }
            }
    
            if (optimalSize == null) {
                minDiff = Double.MAX_VALUE;
                for (Size size : sizes) {
                    if (Math.abs(size.height - targetHeight) < minDiff) {
                        optimalSize = size;
                        minDiff = Math.abs(size.height - targetHeight);
                    }
                }
            }
            return optimalSize;
        }
    
        }
    
    Run Code Online (Sandbox Code Playgroud)

    2.实施活动

    public void captureImage(){

        Intent intentDriver = new Intent(AddNewDevice_Activity.this,
                AndroidCameraSurfaceview.class);
        startActivityForResult(intentDriver, 0);
        //
        // Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
        //
        // Uri fileUri = getOutputMediaFileUri(MEDIA_TYPE_IMAGE);
        //
        // intent.putExtra(MediaStore.EXTRA_OUTPUT, fileUri);
        //
        // // start the image capture Intent
        // startActivityForResult(intent, CAMERA_CAPTURE_IMAGE_REQUEST_CODE);
    
        // Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
        //
        // fileUri = getOutputMediaFileUri(MEDIA_TYPE_IMAGE);
        //
        // intent.putExtra(MediaStore.EXTRA_OUTPUT, fileUri);
        //
        // // start the image capture Intent
        // startActivityForResult(intent, CAMERA_CAPTURE_IMAGE_REQUEST_CODE);
    
    }
    
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    
        super.onActivityResult(requestCode, resultCode, data);
    
        if (requestCode == 0) {
    
            System.out.println("Result Code: " + resultCode);
            if (resultCode == RESULT_OK && data != null) {
    
                Bundle bundle = data.getExtras();
                byte[] test = bundle.getByteArray("Image");
                Bitmap bpCamera = BitmapFactory.decodeByteArray(test, 0,
                        test.length);
                Matrix matrix = new Matrix();
                matrix.postRotate(90);
                bpCamera = Bitmap
                        .createBitmap(bpCamera, 0, 0, bpCamera.getWidth(),
                                bpCamera.getHeight(), matrix, true);
    
                imageView_camera.setImageBitmap(bpCamera);
                selectedImageStr = encodeTobase64(bpCamera);
            }
    
        } else {
            finish();
        }
    
    }
    
    Run Code Online (Sandbox Code Playgroud)

Tor*_*ris 7

您将拆分活动和表面视图分开.

public class AndroidCameraActivity extends Activity {
    AndroidCameraSurfaceview surfaceView;
    ...
    @Override
    public void onCreate(Bundle savedInstanceState) {
        ...
        surfaceView = (AndroidCameraSurfaceview) findViewById(R.id.surfaceView);
    }
}

class AndroidCameraSurfaceview extends SurfaceView implements SurfaceHolder.Callback {
    public AndroidCameraSurfaceview(Context context, AttributeSet attrs) {
        super(context, attrs);
        getHolder().addCallback(this);
        ...
    }

    public void surfaceCreated(SurfaceHolder holder) {
        ...
    }

    public void surfaceDestroyed(SurfaceHolder holder) {
        ...
    }

    public void surfaceChanged(SurfaceHolder holder, int format, int width,
            int height) {
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)


Aru*_*ami 7

谷歌已经从API版本21修改了相机API,因此我们必须采用新的camera2包,并且必须在相机功能出现的情况下加以遵守.以下是google发布的示例代码的链接,该代码使用表面视图实现,并且在Android 5.0中完美无瑕.我相信它解决了一些神秘感.

https://github.com/googlesamples/android-Camera2Basic


Moh*_*j S 0

我尝试了 Camera API 2,但我没有时间在时间​​范围内解决问题。这是我使用相机 API 1 找到问题解决方案的方法。当多个视图处理单个活动时。请在相机处理的情况下尝试此代码。

protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (requestCode == CAPTURE_IMAGE_CAPTURE_CODE) {
            if (resultCode == RESULT_OK) {
                Bitmap bp = (Bitmap) data.getExtras().get("data");
                Bitmap resized = Bitmap.createScaledBitmap(bp,
                        (int) (bp.getWidth() * 0.8),
                        (int) (bp.getHeight() * 0.8), true);

                imageView_camera.setImageBitmap(resized);

                SharedPreferences value_1_Details = getSharedPreferences(
                        "Value_1_Key", MODE_PRIVATE);
                Value_1_SelectedPosId = Integer.parseInt(value_1_Details.getString(
                        "Value_1_ID", ""));
                String value_1_Name = value_1_Details.getString("Value_1_Data", "");
                btn_popup_value_1_Name.setText(value_1_Name);

                SharedPreferences value_2_Details = getSharedPreferences(
                        "Value_2_Key", MODE_PRIVATE);
                value_2_SelectedPosId = Integer.parseInt(value_2_Details.getString(
                        "Value_2_ID", ""));
                String value_2_Name = value_2_Details.getString("Value_2_Data", "");
                btn_dropdown_value_2_Name.setText(value_2_Name);

                SharedPreferences value_3_Details = getSharedPreferences(
                        "Value_3_Key", MODE_PRIVATE);
                value_3_PosId = Integer.parseInt(value_3_Details
                        .getString("Value_3_ID", ""));
                String value_3_Name = value_3_Details.getString("Value_3_Data",
                        "");
                btn_dropdown_value_3_Name.setText(value_3_Name);


                rL_include_ViewDetails.setVisibility(View.GONE);
                rL_include_AddNew.setVisibility(View.VISIBLE);
                rL_include_View.setVisibility(View.GONE);

                selectedImageStr = encodeTobase64(resized);

            } else if (resultCode == RESULT_CANCELED) {
                Toast.makeText(this, "Cancelled", Toast.LENGTH_LONG).show();
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)