2013-03-14 3 views
16

В моем Fragment Я пытаюсь сфотографироваться с моей камеры, но onActivityResult моего Fragment не вызывается. После фотографирования это Fragment не отображается и переключается на мой первый Fragment. Есть ли другой способ для захвата фотографий в Fragment, или что я делаю неправильно?Снять фото с камеры по фрагменту

Вот мой текущий код:

public void takePhoto() { 
     Intent intent = new Intent("android.media.action.IMAGE_CAPTURE"); 
     File photo = new File(Environment.getExternalStorageDirectory(), "Pic.jpg"); 
     intent.putExtra(MediaStore.EXTRA_OUTPUT, 
       Uri.fromFile(photo)); 
     imageUri = Uri.fromFile(photo); 
     PhotosListFragment.this.startActivityForResult(intent, 100); 
    } 

    @Override 
    public void onActivityResult(int requestCode, int resultCode, Intent data) { 
     super.onActivityResult(requestCode, resultCode, data); 
     switch (requestCode) { 
     case 100: 
      if (resultCode == Activity.RESULT_OK) { 
       Uri selectedImage = imageUri; 
       getActivity().getContentResolver().notifyChange(selectedImage, null); 
       ContentResolver cr = getActivity().getContentResolver(); 
       Bitmap bitmap; 
       try { 
        bitmap = android.provider.MediaStore.Images.Media 
        .getBitmap(cr, selectedImage); 

        viewHolder.imageView.setImageBitmap(bitmap); 
        Toast.makeText(getActivity(), selectedImage.toString(), 
          Toast.LENGTH_LONG).show(); 
       } catch (Exception e) { 
        Toast.makeText(getActivity(), "Failed to load", Toast.LENGTH_SHORT) 
          .show(); 
        Log.e("Camera", e.toString()); 
       } 
      } 
     } 
    } 

ответ

7

Я попробовал ваш код его работает нормально чувак. Я изменил

PhotosListFragment.this.startActivityForResult(intent, 100); 

в

getActivity().startActivityForResult(intent, 100); 

который после съемки, возвращаясь к той же деятельности.

Я думаю, что оба ваших фрагмента находятся на одной активности.

Если это так, я предлагаю вам создать новую активность и разместить там новый фрагмент.

+0

IS, что onActivityResult на фрагмент или активность? – Maxrunner

+3

my onActivityResult не является тригером. Я помещаю оба этих метода в свой фрагмент. есть ли что-нибудь еще, что я должен делать? – FilipLuch

+0

OnActivityResult запускается в активности, которая называется фрагментом –

18

Надеется, что это поможет вам:

public class CameraImage extends Fragment { 

    private static final int CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE = 1888; 
    Button button; 
    ImageView imageView; 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
      Bundle savedInstanceState) { 

     final View rootView = inflater.inflate(R.layout.camera_image, 
       container, false); 

     button = (Button) rootView.findViewById(R.id.button); 
     imageView = (ImageView) rootView.findViewById(R.id.imageview); 

     button.setOnClickListener(new OnClickListener() { 
      @Override 
      public void onClick(View view) { 

       Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
       startActivityForResult(intent, 
         CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE); 

      } 
     }); 

     return rootView; 

    } 

    @Override 
    public void onActivityResult(int requestCode, int resultCode, Intent data) { 
     if (requestCode == CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE) { 
      if (resultCode == Activity.RESULT_OK) { 

       Bitmap bmp = (Bitmap) data.getExtras().get("data"); 
       ByteArrayOutputStream stream = new ByteArrayOutputStream(); 

       bmp.compress(Bitmap.CompressFormat.PNG, 100, stream); 
       byte[] byteArray = stream.toByteArray(); 

       // convert byte array to Bitmap 

       Bitmap bitmap = BitmapFactory.decodeByteArray(byteArray, 0, 
         byteArray.length); 

       imageView.setImageBitmap(bitmap); 

      } 
     }   
    }  
} 
+0

Это сработало для меня именно так, что я хотел! Тем не менее, это возвращает только миниатюру. –

+0

@ user2630955 Я использовал ваш код и его не полностью работаю. Я не могу просмотреть изображение, снятое с камеры. Не могли бы вы помочь мне, я застрял от последних двух дней по этому поводу. –

0

Для фрагмента это простое решение:

cameraIamgeView.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      Intent cameraIntent=new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
      getActivity().startActivityFromFragment(PlaceOrderFragment.this, cameraIntent, CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE); 
     } 
    }); 

@Override 
public void onActivityResult(int requestCode, int resultCode, Intent data){ 
    // super.onActivityResult(requestCode, resultCode, data); 
    try { 
    if (requestCode == CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE) { 
     if (resultCode == Activity.RESULT_OK && data != null) { 

      Bitmap bmp = (Bitmap) data.getExtras().get("data"); 
      ByteArrayOutputStream stream = new ByteArrayOutputStream(); 

      /* 
      bmp.compress(Bitmap.CompressFormat.PNG, 100, stream); 
      byte[] byteArray = stream.toByteArray(); 

      // convert byte array to Bitmap 

      Bitmap bitmap = BitmapFactory.decodeByteArray(byteArray, 0, 
        byteArray.length); 
      */ 

      cameraIamgeView.setImageBitmap(bmp); 

     } 
    } 
    }catch(Exception e){ 
     Toast.makeText(this.getActivity(), e+"Something went wrong", Toast.LENGTH_LONG).show(); 

    } 
} 
7

Это один из самых популярных вопроса. Мы можем найти много сообщений об этой проблеме. Но ни один из них не полезен для меня.

Поэтому я решил эту проблему, используя это решение.

Давайте сначала поймем, почему это происходит.

Мы можем назвать startActivityForResult непосредственно из фрагмента, но на самом деле механик за все обработаны деятельности.

После того, как вы называете startActivityForResult из фрагмента, requestCode будет изменен, чтобы прикрепить идентификатор фрагмента к коду. Это позволит Activity отслеживать, кто отправляет этот запрос после получения результата.

После того, как операция была перенесена обратно, результат будет отправлен в Activity onActivityResult Activity с измененным кодом запроса, который будет декодирован до исходного идентификатора requestCode + Fragment. После этого Activity отправит результат активности на этот фрагмент через onActivityResult. И все сделано.

Проблема заключается в том:

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

Решение:

1) Запустить Intent камеры в вашем фрагменте кода с помощью ниже:

 Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
     Fragment frag = this; 
     /** Pass your fragment reference **/ 
     frag.startActivityForResult(intent, REQUEST_IMAGE_CAPTURE); // REQUEST_IMAGE_CAPTURE = 12345 

2) Теперь в вашем Родитель активность переопределение ** onActivityResult(): **

@Override 
    protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
     super.onActivityResult(requestCode, resultCode, data); 
    } 

Вы должны вызвать это в родительской деятельности, чтобы заставить его работать.

3) В вашем фрагменте вызова:

@Override 
    public void onActivityResult(int requestCode, int resultCode, Intent data) { 
     super.onActivityResult(requestCode, resultCode, data); 
     if (resultCode == Activity.RESULT_OK) { 
      if (requestCode == REQUEST_IMAGE_CAPTURE) { 
       // Do something with imagePath 

       Bitmap photo = (Bitmap) data.getExtras().get("data"); 
       imageview.setImageBitmap(photo); 
       // CALL THIS METHOD TO GET THE URI FROM THE BITMAP 
       Uri selectedImage = getImageUri(getActivity(), photo); 
       String realPath=getRealPathFromURI(selectedImage); 
       selectedImage = Uri.parse(realPath); 
      }  
     } 
} 

4) Ссылочные методы для получения URI:

-> Метод для получения Ури из Bitmap

public Uri getImageUri(Context inContext, Bitmap inImage) { 
     ByteArrayOutputStream bytes = new ByteArrayOutputStream(); 
     inImage.compress(Bitmap.CompressFormat.JPEG, 100, bytes); 
     String path = MediaStore.Images.Media.insertImage(inContext.getContentResolver(), inImage, "Title", null); 
     return Uri.parse(path); 
    } 

-> Метод для getti нг путь к файлу от Uri

public String getRealPathFromURI(Uri contentUri) { 
     Cursor cursor = null; 
     try { 
      String[] proj = { MediaStore.Images.Media.DATA }; 
      cursor = getActivity().getContentResolver().query(contentUri, proj, null, null, null); 
      int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA); 
      cursor.moveToFirst(); 
      return cursor.getString(column_index); 
     } finally { 
      if (cursor != null) { 
       cursor.close(); 
      } 
     } 
    } 

Вот и все. С помощью этого решения он может применяться для любого отдельного фрагмента, независимо от того, является он вложенным или нет. И да, это также охватывает весь случай! Кроме того, коды также хороши и чисты.

+0

Эй, приятель, я знаю, что это немного поздно, но это сработало для меня. Большое спасибо! – revipod

+0

Этот ответ заставил меня понять, что на самом деле активность onActivityResult была переопределена и не называлась super .. Удивительный соус. – Aba

Смежные вопросы