2013-03-14 33 views
16

W moim Fragment próbuję zrobić zdjęcie z mojego aparatu, ale onActivityResult mojego Fragment nie jest wywoływany. Po zrobieniu zdjęcia ten Fragment nie wyświetla się i przełącza na mój pierwszy Fragment. Czy istnieje inny sposób przechwytywania zdjęć w pliku Fragment lub co robię źle?Zrób zdjęcie z aparatu w fragmencie

Tu jest mój bieżący kod:

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()); 
       } 
      } 
     } 
    } 

Odpowiedz

7

Próbowałem jej kod działa poprawnie stary. Zmieniłem

PhotosListFragment.this.startActivityForResult(intent, 100); 

do

getActivity().startActivityForResult(intent, 100); 

który po zrobieniu zdjęcia, wracając z powrotem do tego samego działania.

Myślę, że oba twoje fragmenty są na tej samej aktywności.

Jeśli taka jest sytuacja, proponuję utworzyć nową aktywność i umieścić tam nowy fragment.

+0

Czy to onActivityResult na fragmencie lub aktywności? – Maxrunner

+3

Moja funkcja onActivityResult nie jest wyzwalana. umieszczam obie te metody w moim fragmencie. czy jest coś jeszcze, co powinienem zrobić? – FilipLuch

+0

Funkcja onActivityResult uruchomiona w działaniu, które wywołało fragment –

18

Nadzieja ta pomoże Ci:

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

To działało dla mnie, dokładnie to, co chciałem! Zwraca to jednak tylko miniaturę. –

+0

@ user2630955 Użyłem twojego kodu i nie działa on całkowicie. Nie mogę wyświetlić obrazu z kamery. Czy możesz mi pomóc, utknąłem w ciągu ostatnich 2 dni w tej sprawie. –

0

Dla Fragment ten jest najprostsze rozwiązanie:

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

Jest to jeden z najbardziej popularnych kwestii. Możemy znaleźć wiele wątków dotyczących tego problemu. Ale żaden z nich nie jest przydatny dla MNIE.

Rozwiązałem ten problem, korzystając z tego rozwiązania.

Najpierw zrozumiemy, dlaczego tak się dzieje.

Możemy zadzwonić startActivityForResult bezpośrednio od Fragment ale faktycznie mechanik za wszystkie są obsługiwane przez działania.

Po wywołaniu startActivityForResult z fragmentu, requestCode zostaną zmienione, aby dołączyć do tożsamości fragment kodu. Pozwoli to Działowi na śledzenie tego, kto wysyła tę prośbę po otrzymaniu wyniku.

Po przejściu Aktywności, wynik zostanie wysłany do funkcji Aktywność onActivityResult ze zmodyfikowanym kodem request, który zostanie zdekodowany na oryginalną tożsamość requestCode + Fragment. Następnie aktywność wyśle ​​wynik działania do tego fragmentu za pomocą funkcji onActivityResult. I wszystko jest gotowe.

Problem polega na:

aktywny może wysłać wynik do tylko fragment, który został dołączony bezpośrednio do działalności, ale nie zagnieżdżone jeden. Z tego powodu funkcja onActivityResult zagnieżdżonego fragmentu nigdy nie zostałaby wywołana bez względu na wszystko.

Rozwiązanie:

1) Zacznij Intent aparat w swojej Fragment według kodu poniżej:

 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) Teraz w swojej dominującej Aktywny ręcznym ** onActivityResult(): **

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

Musisz zadzwonić do tego w aktywności rodziców, aby to zadziałało.

3) W swojej rozmowy fragment:

@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) metody referencyjne dla coraz URI:

-> Metoda uzyskiwania URI z 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); 
    } 

-> Metoda getti ng Ścieżka pliku od 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(); 
      } 
     } 
    } 

To wszystko. Dzięki temu rozwiązaniu można go zastosować do dowolnego pojedynczego fragmentu, niezależnie od tego, czy jest zagnieżdżony, czy nie. I tak, obejmuje to również całą sprawę! Co więcej, kody są również ładne i czyste.

+0

Hej kolego, wiem, że to trochę za późno, ale zadziałało to dla mnie. Wielkie dzięki! – revipod

+0

Ta odpowiedź uświadomiła mi, że faktycznie nadczynność onActivityResult została nadpisana i nie nazywano super .. Niesamowity sos. – Aba

Powiązane problemy