如何处理没有黑屏的android相机打开 [英] How to handle android camera opening without a black screen

查看:211
本文介绍了如何处理没有黑屏的android相机打开的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在开发一个Android应用程序,其中将打开的照相机片段化.每当相机第一次打开时.它加载约1秒的小冲击.使屏幕变黑.如何防止屏幕在一秒钟内完全变黑.

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.

详细说明:
当我们在Facebook Messenger中打开相机或什至尝试在手机中正常打开相机时.打开需要一秒钟,同时屏幕变黑.同样的事情正在发生.可以预防吗?有什么办法吗?谢谢您的答复.

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.

下面是与上述问题相同的工作代码.

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);
    }
}

推荐答案

我看到您使用了已弃用的 Camera API.如果希望您的应用在具有Lollipop或更高版本的设备上表现最佳,则应切换到新的camera2 API.请查看此处的讨论: Android相机android.hardware.Camera不推荐使用.

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.

新的API可以显着提高性能,但是如果您对旧的API感到困惑,请不要失望.如果您没有使用最新版本的ZXingScannerView,请更新此类以在后台线程中打开相机.此更改大大改善了启动.

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.

如果您的片段是ViewPager的一部分(例如 viewpager中的相机预览),确保在寻呼机将扫描片段显示到屏幕之前就开始了摄像头预览.

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.

在其他情况下,最好使用 splash screen 范例的变体,该范例各有利弊.您可以在相机预览表面上方短暂显示另一个非黑色视图,或者如果使用OpenGL预览则显示预定义的纹理.

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.

这篇关于如何处理没有黑屏的android相机打开的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆