2015-09-29 3 views
1

Я занимаюсь фотографией с использованием камеры в фрагменте. На некоторых устройствах он работает отлично, но на некоторых устройствах мой фрагмент закрывается после съемки.Фрагмент закрывается после намерения камеры

Вот мой код вызывающего намерения камеры:

Intent picIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
getActivity().startActivityForResult(picIntent, Constants.TAKE_PICTURE_SIGN_UP); 

Вот onActivityResult моего MainActivity в:

public void onActivityResult(int requestCode, int resultCode, Intent data) { 
    if(requestCode == Constants.TAKE_PICTURE_SIGN_UP || requestCode == Constants.SELECT_PICTURE_SIGN_UP) 
    { 
     SignUpFragment frag = (SignUpFragment)getSupportFragmentManager().findFragmentByTag(Constants.SignUpFragmentTag); 
     if(frag != null && frag.isVisible()) 
     { 
      frag.onActivityResult(requestCode, resultCode, data); 
     } 
    } 
} 

Когда я выбираю фотографию из галереи она работает нормально, но когда я сфотографировать с фраг камеры нулевой. Что вызывает здесь проблему и как ее решить?

+0

Вы используете ChildFragmentManager?Поскольку на некотором устройстве onActivityResult не работает правильно, если фрагмент является ChildFragment, а onActivityResult улавливается основным действием, закрывающим ваш фрагмент –

+0

protected void onActivityResult (int requestCode, int resultCode, Intent data) { if (requestCode == CAMERA_REQUEST && resultCode == RESULT_OK) { Растровое изображение = (растровое изображение) data.getExtras(). Get ("data"); imageView.setImageBitmap (фото); } } – impathuri

+0

Я использую SupportFragmentManager. Поскольку фрагмент имеет 1 родительскую активность, то есть MainActivity. При выборе изображения из галереи я могу найти фрагмент фрагмента, но при съемке с камеры findFragmentByTag возвращает null. @DarioPicco –

ответ

1

я использую следующий CoE и он работал на меня

Intent picIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 

File f = new File(android.os.Environment.getExternalStorageDirectory(), "temp1.jpg"); 
Uri mImageCaptureUri = Uri.fromFile(f); 

picIntent.putExtra(MediaStore.EXTRA_OUTPUT, mImageCaptureUri); 
getActivity().startActivityForResult(picIntent, Constants.TAKE_PICTURE_SIGN_UP); 
0

Используйте метод, как это сделать, что ваш фрагмент присоединен, и отображается:

private MyFragmentA switchToFragmentA(){ 

    FragmentManager fm = getSupportFragmentManager(); 
    MyFragmentA fragment = (MyFragmentA) fm.findFragmentByTag(TAG_A); 

    if(fragment == null){ 
     fragment = MyFragmentA.newInstance(); 
    } 

    fm.beginTransaction().replace(R.id.fragment_container, fragment, TAG_A).commit(); 

    return fragment; 
} 

Затем настроить onActivityResult так:

public void onActivityResult(int requestCode, int resultCode, Intent data) { 
    if(requestCode == Constants.TAKE_PICTURE_SIGN_UP || requestCode == Constants.SELECT_PICTURE_SIGN_UP){ 
     switchToFragmentA().onActivityResult(requestCode, resultCode, data); 
    } 
} 
+0

У меня есть 3 фрагмента A, B и C. Из MainActivity я перехожу к фрагменту A и оттуда перехожу к фрагменту B, а затем, наконец, перехожу к фрагменту C, где я фотографирую. Тогда как я должен поддерживать ссылку на фрагмент C? –

+0

Я принял новый подход, основанный на том, что у вас есть три фрагмента - у вас может быть три метода, подобных одному в моем ответе, по одному для каждого фрагмента. Тогда вы узнаете, что это всегда есть и доступно – JoeyJubb

0

вы назвали: getActivity().startActivityForResult(intent,111);

вас следует позвонить: startActivityForResult(intent,111);

попробовать Также

// In your activity 
@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    super.onActivityResult(requestCode, resultCode, data); 
    for (Fragment fragment : getSupportFragmentManager().getFragments()) { 
     fragment.onActivityResult(requestCode, resultCode, data); 
    } 
} 
+0

Я пробовал это, но таким образом камера не возвращает результат в onActivityResult MainActivity. –

+0

, пожалуйста, проверьте изменения в моих ans – prat

+0

Результат от камеры пойман MainActivity, и мы не можем получить доступ к getChildFragmentManager() в действии. И я не могу получить фрагмент по тегу после результата камеры. –

0

Проблема: в том, что деятельность камеры разрушает вашу активность и фрагменты. Теперь в правильном решении реализованы методы onSaveInstanceState всех фрагментов и действий.

Last Resort Быстрое решение: это установить активность, чтобы не уничтожить на изменения ориентации и экрана повторно размера и т.д. Для этого в вашем файле манифеста для основной деятельности или деятельности, имеющей этот конкретный фрагмент добавить эту строку

<activity 
     android:name=".MainActivity_" 
     android:configChanges="orientation|keyboardHidden|screenSize" 
</activity> 

Читайте здесь о android:configChanges

0

в дополнение к @Mina Azhar answer, вы должны обращаться, когда система убивают фоновые действия на низкой памяти.

fragment.startActivityForResult(picIntent, Constants.TAKE_PICTURE_SIGN_UP); 
  • Вы должны сохранить состояние фрагмента,

    @Override 
    public void onSaveInstanceState(@NonNull Bundle outState) { 
        outState.putParcelable("cameraMediaOutputUri", mImageCaptureUri); 
        super.onSaveInstanceState(outState); 
    } 
    

Восстановление Fragment государстваFragment Life Cycle

@Override 
public void onActivityCreated(Bundle savedInstanceState) { 
    super.onActivityCreated(savedInstanceState); 
    if (savedInstanceState !=null && savedInstanceState.containsKey("cameraMediaOutputUri")) 
     mImageCaptureUri = savedInstanceState.getParcelable("cameraMediaOutputUri"); 
} 
Смежные вопросы