1. 程式人生 > >Android 華為拍照閃退

Android 華為拍照閃退

**
 * 自定義的拍照
 *
 *
 */
public class CameraActivity extends Activity implements View.OnClickListener, TakePictureListener{
   private String mSaveRoot;
   private CameraContainer mContainer;
   private ImageButton mCameraShutterButton;
   private ImageButton mRecordShutterButton;
   private ImageView mFlashView;
   private ImageButton mSwitchModeButton;
   private ImageView mSwitchCameraView;
   private ImageView mSettingView;
   private ImageView mVideoIconView;
   private View mHeaderBar;
   private SimpleDraweeView iv_image;
   private String photoPath;
   private RelativeLayout rl_root;

   @Override
   public void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      try {
         Fresco.initialize(this);
         setContentView(R.layout.camera);
      } catch (Exception e) {
         e.printStackTrace();
      // Log.d("CameraActivity");e.getMessage();
      }
      //上面的
      mHeaderBar = findViewById(R.id.camera_header_bar);

      //Camera的容器 繼承自RelativeLayout
      mContainer = (CameraContainer) findViewById(R.id.container1);
      
      mVideoIconView = (ImageView) findViewById(R.id.videoicon);
      iv_image = (SimpleDraweeView) findViewById(R.id.iv_image);
      //相機
      mCameraShutterButton = (ImageButton) findViewById(R.id.btn_shutter_camera);
      mRecordShutterButton = (ImageButton) findViewById(R.id.btn_shutter_record);
      mSwitchCameraView = (ImageView) findViewById(R.id.btn_switch_camera);
      //閃光燈
      mFlashView = (ImageView) findViewById(R.id.btn_flash_mode);
      mSwitchModeButton = (ImageButton) findViewById(R.id.btn_switch_mode);
      mSettingView = (ImageView) findViewById(R.id.btn_other_setting);

      mCameraShutterButton.setOnClickListener(this);
      mRecordShutterButton.setOnClickListener(this);
      mFlashView.setOnClickListener(this);
      mSwitchModeButton.setOnClickListener(this);
      mSwitchCameraView.setOnClickListener(this);
      mSettingView.setOnClickListener(this);
      mVideoIconView.setOnClickListener(this);

      mSaveRoot = "";
      mContainer.setRootPath(mSaveRoot);
   }


   @Override
   public void onClick(View view) {
      switch (view.getId()) {
      //拍照
      case R.id.btn_shutter_camera:
         //set TakePictureListener callBack
         mCameraShutterButton.setClickable(false);
         mContainer.takePicture(this);
         break;
      case R.id.videoicon:
         //處理刪除的 結果 //
         photoPath = null;
         mCameraShutterButton.setVisibility(View.VISIBLE);
         iv_image.setVisibility(View.GONE);
         mSwitchModeButton.setVisibility(View.INVISIBLE);
         mVideoIconView.setVisibility(View.INVISIBLE);
         mContainer.setVisibility(View.VISIBLE);
         mHeaderBar.setVisibility(View.VISIBLE);       
         
         break;
      case R.id.btn_flash_mode:
         //set light
         if (mContainer.getFlashMode() == FlashMode.ON) {
            mContainer.setFlashMode(FlashMode.OFF);
            mFlashView.setImageResource(R.drawable.btn_flash_off);
         } else if (mContainer.getFlashMode() == FlashMode.OFF) {
            mContainer.setFlashMode(FlashMode.AUTO);
            mFlashView.setImageResource(R.drawable.btn_flash_auto);
         } else if (mContainer.getFlashMode() == FlashMode.AUTO) {
            mContainer.setFlashMode(FlashMode.TORCH);
            mFlashView.setImageResource(R.drawable.btn_flash_torch);
         } else if (mContainer.getFlashMode() == FlashMode.TORCH) {
            mContainer.setFlashMode(FlashMode.ON);
            mFlashView.setImageResource(R.drawable.btn_flash_on);
         }
         break;
      case R.id.btn_switch_mode:
         //處理對 號的結果
         Intent intent = new Intent();
         intent.putExtra("photopath", photoPath);
         setResult(RESULT_OK, intent);
         
         mCameraShutterButton.setVisibility(View.GONE);
         mSwitchModeButton.setVisibility(View.GONE);
         mVideoIconView.setVisibility(View.GONE);
         mContainer.setVisibility(View.GONE);
         

         finish();
         break;
      case R.id.btn_switch_camera:
         //change to camera
         mContainer.switchCamera();
         break;
         
      default:
         break;
      }
   }

   
   
   //拍照後的回撥
   @Override
   public void onTakePictureEnd(Bitmap thumBitmap) {
      mCameraShutterButton.setClickable(true);
   }

   @Override
   public void onAnimtionEnd(Bitmap bm, boolean isVideo) {
   }

   @Override
   public void onTakePictureEnd(String photoPath) {
      this.photoPath = photoPath;
      mContainer.setVisibility(View.GONE);
      mHeaderBar.setVisibility(View.GONE);
      iv_image.setVisibility(View.VISIBLE);
      mCameraShutterButton.setVisibility(View.GONE);
      mSwitchModeButton.setVisibility(View.VISIBLE);
      mVideoIconView.setVisibility(View.VISIBLE);
      iv_image.setImageURI(Uri.parse("file:///" + photoPath));
   }
}

 

原因:CameraContainer類裡的攝像頭在autoFocus之前沒有開啟預覽

    try {
        mCameraView.getmCamera().startPreview(); // 拍照閃退,加上這句話就可以了
        mCameraView.onFocus(point, autoFocusCallback);
        mFocusImageView.startFocus(point);
     }catch (Exception e){
       e.printStackTrace();