0
在我的应用程序中,我有一个按钮,拍摄照片并保存。预览不显示。快速拍照时应用程序崩溃
该应用程序工作正常,如果我点击按钮每1-2s,但如果我点击它更快的应用程序崩溃。只要不点击按钮,我就可以拍摄所需的所有照片。
PhotoFragment.java:
public class PhotoFragment extends Fragment {
private final static String LOG_TAG = PhotoFragment.class.getSimpleName();
private Camera mCamera;
private SurfaceTexture mSurfaceTexture; // mSurfaceTexture must be global to avoid log error spam
public static PhotoFragment newInstance() {
Bundle args = new Bundle();
PhotoFragment fragment = new PhotoFragment();
fragment.setArguments(args);
return fragment;
}
public PhotoFragment(){}
@Override
public void onStart() {
super.onStart();
getActivity().setTitle(R.string.photo);
}
@Override
public void onResume() {
super.onResume();
safeCameraOpen();
}
@Override
public void onPause() {
super.onPause();
releaseCamera();
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment_content, container, false);
Button yo = (Button) rootView.findViewById(R.id.pic);
yo.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if(mCamera == null){
Log.w(LOG_TAG, "@onCreateView mCamera is null!");
}
mCamera.takePicture(null, null, mCall);
}
});
Button yoyo = (Button) rootView.findViewById(R.id.vid);
yoyo.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
}
});
return rootView;
}
Camera.PictureCallback mCall = new Camera.PictureCallback() {
public void onPictureTaken(byte[] data, Camera camera) {
//decode the data obtained by the camera into a Bitmap and save it
FileOutputStream outStream = null;
try {
String sdCardDirectory = Environment
.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES)
.getPath();
outStream = new FileOutputStream(sdCardDirectory
+ Utils.getPictureFilename());
outStream.write(data);
outStream.close();
} catch (FileNotFoundException e){
Log.d("CAMERA", e.getMessage());
} catch (IOException e){
Log.d("CAMERA", e.getMessage());
}
mCamera.startPreview();
}
};
private boolean safeCameraOpen() {
boolean qOpened = false;
try {
releaseCamera();
mCamera = Camera.open();
mSurfaceTexture = new SurfaceTexture(Activity.MODE_PRIVATE);
mCamera.setPreviewTexture(mSurfaceTexture);
mCamera.startPreview();
qOpened = (mCamera != null);
} catch (Exception e) {
Log.e(LOG_TAG, "failed to open Camera");
e.printStackTrace();
}
return qOpened;
}
private void releaseCamera() {
if (mCamera != null) {
mCamera.stopPreview();
mCamera.release();
mCamera = null;
}
}
}
堆栈跟踪:在您的onClick
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.dcs.hiddencamera, PID: 10561
java.lang.RuntimeException: takePicture failed
at android.hardware.Camera.native_takePicture(Native Method)
at android.hardware.Camera.takePicture(Camera.java:1434)
at android.hardware.Camera.takePicture(Camera.java:1379)
at com.dcs.hiddencamera.PhotoFragment$1.onClick(PhotoFragment.java:72)
at android.view.View.performClick(View.java:5204)
at android.view.View$PerformClick.run(View.java:21153)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5417)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
感谢您的回复,您如何建议启用/禁用按钮?也许是一个全局变量? – Ddddddd
耶和去与一个实例变量的按钮。 –
我测试了它并修复了它。谢谢。这非常简单。 – Ddddddd