В моем приложении у меня есть кнопка, которая снимает фотографию и сохраняет ее. Предварительный просмотр не отображается.Приложение быстро падает при съемке
Приложение работает нормально, если я нажимаю кнопку каждые 1-2, но если я нажму на нее быстрее, приложение сработает. Я могу взять все фотографии, которые я хочу, пока я не нажимаю кнопку слишком быстро.
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;
}
}
}
StackTrace:
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