2016-09-25 8 views
0

私のアプリでは、写真を撮って保存するボタンがあります。プレビューは表示されません。写真をすばやく撮るとアプリがクラッシュする

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


} 

スタックトレース:あなたの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のボタンを無効にしてみてくださいと画像が保存された後、それを再度有効にします。あまりにも速く与えられれば、カメラは明らかに2つの連続した撮影画像コマンドを処理できない。例外ソースはネイティブのカメラコード内にあります。

+0

返信いただきありがとうございます。どのようにボタンの有効/無効をお勧めしますか?たぶんグローバル変数? – Ddddddd

+0

はい、ボタンのインスタンス変数を使用します。 –

+1

私はそれをテストして修正しました。ありがとう。それは本当に簡単でした。 – Ddddddd

関連する問題