How to handle android camera opening without a bla

2019-05-30 03:55发布

问题:

I am developing an android application in which open camera in a fragment. Whenever Camera is opened for the FIRST TIME. It loads with a small jerk of 1 second approximately. Making screen black. How to prevent screen from turning black for that second completely.

Detailed Explanation:
When we open camera in Facebook messenger or even try to open camera normally in your phone. It takes one second to open and meanwhile screens turns black. The same thing is happening. Can this be prevented? Any how? your reply will be highly appreciated Please guys.

Below Is the working code with same problem as described above.

public class scan extends Fragment implements ZXingScannerView.ResultHandler{
private ZXingScannerView zXingScannerView;
    private SurfaceView mySurfaceView;
    private QREader qrEader;
    private Camera mCamera;
    private CameraPreview mPreview;
    private String m_Text="";
    private  String number="";
  
    private static final String ARG_PARAM1 = "param1";
    private static final String ARG_PARAM2 = "param2";

    private String mParam1;
    private String mParam2;

    private OnFragmentInteractionListener mListener;

    public scan() {
    }
    @Override
    public void handleResult(Result rawResult) {
       

        Log.e("handler", rawResult.getText()); 
        Log.e("handler", rawResult.getBarcodeFormat().toString()); 

        AlertDialog.Builder builder = new AlertDialog.Builder(this.getActivity());
        builder.setTitle("Scan Result");
        builder.setMessage(rawResult.getText());
        number = rawResult.getText().substring(rawResult.getText().length() - 13);

        //
        final EditText input = new EditText(this.getActivity());
     input.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD);
        builder.setView(input);

        builder.setPositiveButton("OK", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                m_Text = input.getText().toString();

            }
        });
        builder.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                dialog.cancel();
            }
        });

        builder.setNegativeButton("NO",
                new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int which) {
                        dialog.cancel();
                    }
                });

        AlertDialog alert1 = builder.create();
        alert1.show();


        zXingScannerView.resumeCameraPreview(this);
    }

    public static scan newInstance(String param1, String param2) {
        scan fragment = new scan();
        Bundle args = new Bundle();
        args.putString(ARG_PARAM1, param1);
        args.putString(ARG_PARAM2, param2);
        fragment.setArguments(args);
        return fragment;
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        if (getArguments() != null) {
            mParam1 = getArguments().getString(ARG_PARAM1);
            mParam2 = getArguments().getString(ARG_PARAM2);
        }

        if(checkCameraHardware(getActivity().getApplicationContext())) {
            zXingScannerView = new ZXingScannerView(this.getActivity().getApplicationContext());
            zXingScannerView.setResultHandler(this);
            zXingScannerView.startCamera();
        }
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_scan, container, false);

        FrameLayout preview =(FrameLayout)view.findViewById(R.id.camera_preview);
        preview.addView(zXingScannerView);

        return view;
    }
@Override
public   void onPause()
{
    super.onPause();
zXingScannerView.stopCamera();
}
    @Override
    public void onResume() {
        super.onResume();
        zXingScannerView.setResultHandler(this); // Register ourselves as a handler for scan results.
        zXingScannerView.startCamera();          // Start camera on resume
    }

    /** Check if this device has a camera */
    public boolean checkCameraHardware(Context context) {
        if (context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA)){
            // this device has a camera
            return true;
        } else {
            // no camera on this device
            return false;
        }
    }


    public void onButtonPressed(Uri uri) {
        if (mListener != null) {
            mListener.onFragmentInteraction(uri);
        }
    }

    @Override
    public void onAttach(Context context) {
        super.onAttach(context);
        if (context instanceof OnFragmentInteractionListener) {
            mListener = (OnFragmentInteractionListener) context;
        } else {
            throw new RuntimeException(context.toString()
                    + " must implement OnFragmentInteractionListener");
        }
    }

    @Override
    public void onDetach() {

        if (mCamera!= null) {
            mCamera.stopPreview();
           mCamera.release();
            mCamera = null;
        }
        super.onDetach();
        mListener = null;
    }

    public interface OnFragmentInteractionListener {
        // TODO: Update argument type and name
        void onFragmentInteraction(Uri uri);
    }
}

回答1:

I see that you use the deprecated Camera API. If you want your app to perform the best on devices with Lollipop or higher, you should switch to the new camera2 API. Please see the discussion here: Android camera android.hardware.Camera deprecated.

The new API can improve performance significantly, but if you are stuck with the old one, don't despair. If you are not using the latest version of ZXingScannerView, update this class to open the camera in a background thread. This change improved startup significantly.

If your fragment is part of a ViewPager (like camera preview within viewpager), make sure that the camera preview is started before the pager brings the scan fragment to screen.

In other scenarios, it is preferable to go for a variation of splash screen paradigm, which has it pros and cons. You can show for a short while another non-black view on top of the camera preview surface, or show a predefined texture if you use OpenGL preview.



回答2:

Try this below code to open camera and click picture as it works for me.

public class CameraImage extends Fragment {

private static final int CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE = 1888;
Button button;
ImageView imageView;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {

    final View rootView = inflater.inflate(R.layout.camera_image,
            container, false);

    button = (Button) rootView.findViewById(R.id.button);
    imageView = (ImageView) rootView.findViewById(R.id.imageview);

    button.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View view) {

            Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
            startActivityForResult(intent,
                    CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE);

        }
    });

    return rootView;

}

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE) {
        if (resultCode == Activity.RESULT_OK) {

            Bitmap bmp = (Bitmap) data.getExtras().get("data");
            ByteArrayOutputStream stream = new ByteArrayOutputStream();

            bmp.compress(Bitmap.CompressFormat.PNG, 100, stream);
            byte[] byteArray = stream.toByteArray();

            // convert byte array to Bitmap

            Bitmap bitmap = BitmapFactory.decodeByteArray(byteArray, 0,
                    byteArray.length);

            imageView.setImageBitmap(bitmap);

        }
    }        
 }    
}

Hope it will work for you.