如何在没有黑屏的情况下处理 android 相机打开
How to handle android camera opening without a black screen
我正在开发一个 android 应用程序,在其中的片段中打开相机。每当第一次打开相机时。它以大约 1 秒的小冲击加载。使屏幕变黑。如何完全避免那一秒黑屏
详细说明:
当我们在 Facebook Messenger 中打开相机或什至尝试在您的 phone 中正常打开相机时。打开需要一秒钟,同时屏幕变黑。同样的事情正在发生。这可以预防吗?怎么办?非常感谢您的回复。请大家。
下面是与上述问题相同的工作代码。
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);
}
}
试试下面的代码打开相机并点击图片,因为它适合我。
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);
}
}
}
}
希望对你有用。
我看到您使用 已弃用 相机 API。如果您希望您的应用在 Lollipop 或更高版本的设备上表现最佳,您应该切换到新的 camera2 API。请在此处查看讨论:.
新的 API 可以显着提高性能,但如果您受困于旧的,请不要绝望。如果您使用的不是最新版本的 ZXingScannerView,请更新此 class 以在后台线程中打开相机。此更改 improved 启动显着。
如果您的片段是 ViewPager 的一部分(如 camera preview within viewpager),请确保在寻呼机将 scan 片段带到屏幕之前启动相机预览。
在其他情况下,最好选择 启动画面 范例的变体,这有利也有弊。您可以在相机预览表面上短暂显示另一个非黑色视图,或者如果您使用 OpenGL 预览,则显示预定义的纹理。
我正在开发一个 android 应用程序,在其中的片段中打开相机。每当第一次打开相机时。它以大约 1 秒的小冲击加载。使屏幕变黑。如何完全避免那一秒黑屏
详细说明:
当我们在 Facebook Messenger 中打开相机或什至尝试在您的 phone 中正常打开相机时。打开需要一秒钟,同时屏幕变黑。同样的事情正在发生。这可以预防吗?怎么办?非常感谢您的回复。请大家。
下面是与上述问题相同的工作代码。
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);
}
}
试试下面的代码打开相机并点击图片,因为它适合我。
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);
}
}
}
}
希望对你有用。
我看到您使用 已弃用 相机 API。如果您希望您的应用在 Lollipop 或更高版本的设备上表现最佳,您应该切换到新的 camera2 API。请在此处查看讨论:
新的 API 可以显着提高性能,但如果您受困于旧的,请不要绝望。如果您使用的不是最新版本的 ZXingScannerView,请更新此 class 以在后台线程中打开相机。此更改 improved 启动显着。
如果您的片段是 ViewPager 的一部分(如 camera preview within viewpager),请确保在寻呼机将 scan 片段带到屏幕之前启动相机预览。
在其他情况下,最好选择 启动画面 范例的变体,这有利也有弊。您可以在相机预览表面上短暂显示另一个非黑色视图,或者如果您使用 OpenGL 预览,则显示预定义的纹理。