【问题标题】:How to handle android camera opening without a black screen如何处理没有黑屏的android相机打开
【发布时间】:2017-10-15 02:10:30
【问题描述】:

我正在开发一个在片段中打开相机的 android 应用程序。每当相机第一次打开时。它以大约 1 秒的小抖动加载。使屏幕变黑。如何防止屏幕在那一秒完全变黑。

详细说明:
当我们在 Facebook Messenger 中打开相机,甚至尝试在您的手机中正常打开相机时。打开需要一秒钟,同时屏幕变黑。同样的事情正在发生。这可以防止吗?有什么办法吗?各位,我们将不胜感激。

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

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

【问题讨论】:

  • 你不想只从相机中挑选图像吗?
  • 向我们展示您到目前为止尝试了什么? (代码)
  • 是的,我需要打开相机拍照@nikhil
  • @Jayanth 我已添加代码,请立即查看。我希望你能正确回答我的问题

标签: android android-layout android-fragments android-camera


【解决方案1】:

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

新的 API 可以显着提高性能,但如果您坚持使用旧 API,请不要绝望。如果您使用的不是最新版本的 ZXingScannerView,请更新该类以在后台线程中打开相机。此更改improved 启动显着。

如果您的片段是 ViewPager 的一部分(例如 camera preview within viewpager),请确保在分页器将 scan 片段带到屏幕之前启动相机预览。

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

【讨论】:

    【解决方案2】:

    试试下面的代码打开相机并点击图片,因为它对我有用。

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

    希望它对你有用。

    【讨论】:

    • 看@Nikhil 我很高兴你传递了这段代码。但这是以另一种意图打开相机。我正在使用片段。其次。使用此代码.. 有一阵子混蛋.. 一秒钟的黑屏甚至不到一秒钟。你没明白吗?打开相机时?我需要解决这个问题。也请查看我的 LOC。
    • 我会等。如果这将是一个很长的讨论,我们可以聊天吗?
    • 是的!把聊天链接传给我……或者在这里解决问题
    猜你喜欢
    • 1970-01-01
    • 2020-06-04
    • 1970-01-01
    • 2016-11-22
    • 2021-12-22
    • 1970-01-01
    • 2020-04-12
    • 1970-01-01
    相关资源
    最近更新 更多