2016-09-25 92 views
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) 

回答

0

手柄的RuntimeException,也尝试禁用按钮内的onclick和重新启用的图片已被保存后。如果速度太快,相机显然无法处理两个连续的拍照命令。异常源在本机相机代码内。

+0

感谢您的回复,您如何建议启用/禁用按钮?也许是一个全局变量? – Ddddddd

+0

耶和去与一个实例变量的按钮。 –

+1

我测试了它并修复了它。谢谢。这非常简单。 – Ddddddd

相关问题