Android 華為拍照閃退
阿新 • • 發佈:2018-11-14
** * 自定義的拍照 * * */ 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();