2013-03-14 25 views
16

私のFragment私のカメラから撮ろうとしましたが、onActivityResultFragmentではありません。写真を撮った後、これは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

私はその作業罰金男あなたのコードを試してみました。私は、写真を撮って戻って同じ活動に戻った後

getActivity().startActivityForResult(intent, 100); 

PhotosListFragment.this.startActivityForResult(intent, 100); 

を変更しました。

あなたのフラグメントはどちらも同じ活動をしていると思います。

状況がある場合は、新しいアクティビティを作成し、その中に新しいフラグメントを配置することをお勧めします。これはあなたを助ける

+0

ISはonActivityResultのフラグメントまたはアクティビティですか? – Maxrunner

+3

私の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私はあなたのコードを使用しており、完全には機能していません。私はカメラから撮影した画像を見ることができません。あなたは私を助けてください、私はこの問題について過去2日間から立ち往生できますか? –

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

これは、最も人気のある問題の一つです。この問題に関しては、多くのスレッドを見つけることができます。しかし、それらのどれもMEにとっては役に立たない。

このソリューションを使用してこの問題を解決しました。

これがなぜ起こっているのかまず理解してみましょう。

私たちはフラグメントから直接startActivityForResultを呼び出すことができますが、実際にはメカニックはすべてアクティビティによって処理されます。

あなたが断片からstartActivityForResultを呼び出したら、requestCodeは、コードにフラグメントのIDを添付するように変更されます。これにより、アクティビティは、結果が受信された後にこのリクエストを送信した人を追跡できるようになります。

アクティビティがナビゲートされると、変更されたrequestCodeを持つActivityのonActivityResultに結果が送信され、元のrequestCode + FragmentのIDにデコードされます。その後、ActivityはonActivityResultを介してActivity Resultをそのフラグメントに送信します。そしてそれはすべて終わった。

問題がある:

アクティビティのみの活動に直接接続された断片ではなく、ネストされたものに結果を送信することができます。そのため、ネストされたフラグメントのonActivityResultが何に関係なく呼び出されることはありませんでした。

ソリューション:

1)コードの下であなたのフラグメントでカメラの意図を開始します。

 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); 
    } 
あなたはそれを機能させるために親アクティビティでこれを呼び出さなければなりません。 >メソッドビットマップ

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); 
    } 
からURIを取得するための -

@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を取得するための)基準法:あなたのフラグメントの呼び出しで

3)

- > 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がオーバーライドされていることを認識しました。 – Aba

関連する問題