2016-06-23 4 views
-2

У меня есть пользовательская камера, работающая в Фрагменте. Когда функция OnPictureTaken называется Activity, она освобождает фрагмент, поэтому getActivity возвращает NULL и «Fragment Not Attached To Activity».Активность Релиз Фрагмент

Как картинка успешно взята. onPictureTaken называется. Там я хочу начать работу.

@Override 
    public void onAttach(Context context) { 
     super.onAttach(context); 
     mOrientationListener = new CameraOrientationListener(context); 
    } 


    @Override 
    public void onAttach(Activity activity) { 
     super.onAttach(activity); 
     mOrientationListener = new CameraOrientationListener(activity); 
     activity2 = activity; 
    } 


    @Override 
    public void onCreate(@Nullable Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     // Restore your state here because a double rotation with this fragment 
     // in the backstack will cause improper state restoration 
     // onCreate() -> onSavedInstanceState() instead of going through onCreateView() 
     if (savedInstanceState == null) { 
      mCameraID = getBackCameraID(); 
      mFlashMode = CameraSettingPreferences.getCameraFlashMode(getActivity()); 
      mImageParameters = new ImageParameters(); 

     } else { 
      mCameraID = savedInstanceState.getInt(CAMERA_ID_KEY); 
      mFlashMode = savedInstanceState.getString(CAMERA_FLASH_KEY); 
      mImageParameters = savedInstanceState.getParcelable(IMAGE_INFO); 
     } 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 
     return inflater.inflate(R.layout.squarecamera__fragment_camera_demo, container, false); 
    } 

    @Override 
    public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { 
     super.onViewCreated(view, savedInstanceState); 
     mOrientationListener.enable(); 

     mPreviewView = (SquareCameraPreview) view.findViewById(R.id.camera_preview_view); 
     mPreviewView.getHolder().addCallback(CameraFragment.this); 

     final View topCoverView = view.findViewById(R.id.cover_top_view); 
     final View btnCoverView = view.findViewById(R.id.cover_bottom_view); 

     mImageParameters.mIsPortrait = 
       getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT; 

     if (savedInstanceState == null) { 
      ViewTreeObserver observer = mPreviewView.getViewTreeObserver(); 
      observer.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { 
       @Override 
       public void onGlobalLayout() { 
        mImageParameters.mPreviewWidth = mPreviewView.getWidth(); 
        mImageParameters.mPreviewHeight = mPreviewView.getHeight(); 

        mImageParameters.mCoverWidth = mImageParameters.mCoverHeight 
          = mImageParameters.calculateCoverWidthHeight(); 

//     Log.d(TAG, "parameters: " + mImageParameters.getStringValues()); 
//     Log.d(TAG, "cover height " + topCoverView.getHeight()); 
        resizeTopAndBtmCover(topCoverView, btnCoverView); 

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) { 
         mPreviewView.getViewTreeObserver().removeOnGlobalLayoutListener(this); 
        } else { 
         mPreviewView.getViewTreeObserver().removeGlobalOnLayoutListener(this); 
        } 
       } 
      }); 
     } else { 
      if (mImageParameters.isPortrait()) { 
       topCoverView.getLayoutParams().height = mImageParameters.mCoverHeight; 
       btnCoverView.getLayoutParams().height = mImageParameters.mCoverHeight; 
      } else { 
       topCoverView.getLayoutParams().width = mImageParameters.mCoverWidth; 
       btnCoverView.getLayoutParams().width = mImageParameters.mCoverWidth; 
      } 
     } 

     final ImageView swapCameraBtn = (ImageView) view.findViewById(R.id.change_camera); 
     swapCameraBtn.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       if (mCameraID == CameraInfo.CAMERA_FACING_FRONT) { 
        mCameraID = getBackCameraID(); 
       } else { 
        mCameraID = getFrontCameraID(); 
       } 
       restartPreview(); 
      } 
     }); 

     final View changeCameraFlashModeBtn = view.findViewById(R.id.flash); 
     changeCameraFlashModeBtn.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       if (mFlashMode.equalsIgnoreCase(Camera.Parameters.FLASH_MODE_AUTO)) { 
        mFlashMode = Camera.Parameters.FLASH_MODE_ON; 
       } else if (mFlashMode.equalsIgnoreCase(Camera.Parameters.FLASH_MODE_ON)) { 
        mFlashMode = Camera.Parameters.FLASH_MODE_OFF; 
       } else if (mFlashMode.equalsIgnoreCase(Camera.Parameters.FLASH_MODE_OFF)) { 
        mFlashMode = Camera.Parameters.FLASH_MODE_AUTO; 
       } 

       setupFlashMode(); 
       setupCamera(); 
      } 
     }); 

     final ImageView takePhotoBtn = (ImageView) view.findViewById(R.id.capture_image_button); 
     takePhotoBtn.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       takePicture(); 
      } 
     }); 
    } 
@Override 
    public void onActivityResult(int requestCode, int resultCode, Intent data) { 
     if (resultCode != Activity.RESULT_OK) return; 

     switch (requestCode) { 
      case 1: 
       Uri imageUri = data.getData(); 
       break; 

      default: 
       super.onActivityResult(requestCode, resultCode, data); 
     } 
    } 


    //This is the Function Where it lands after the Picture is taken 
    /** 
    * A picture has been taken 
    * @param data 
    * @param camera 
    */ 
    @Override 
    public void onPictureTaken(byte[] data, Camera camera) { 
      rotation = getPhotoRotation(); 
     DisplayPicFragment.newInstance(data, rotation,mImageParameters.createCopy()); 
     startActivity(new Intent(getActivity(), DisplayPicActivity.class)); 
//  if(isAdded()){ 
//   startActivity(new Intent(activity2, DisplayPicActivity.class)); 
//  } 

     setSafeToTakePhoto(true); 
    } 
+1

Ваш разговор о коде, который у нас отсутствует, пожалуйста, предоставьте код, чтобы мы могли понять структуру вашего фрагмента и жизненный цикл обратных вызовов, на которые вы ссылаетесь. – Warrick

+0

Отредактировано. Пожалуйста, проверьте. –

ответ

0

От DisplayPicActivity Я понимаю, что вы хотите отобразить изображение.

Существует способ для этого - setPreviewDisplay (SurfaceHolder holder).

+0

Да jamal. Спасибо, я позабочусь об этом. –