Android 从相机上拍摄片段

Android 从相机上拍摄片段,android,android-fragments,android-camera,Android,Android Fragments,Android Camera,在我的Fragment中,我尝试从我的相机拍摄照片,但是没有调用我的Fragment的onActivityResult。拍照后,此片段未显示,正在切换到我的第一个片段。有没有其他方法可以在片段中捕获照片,或者我做错了什么 这是我目前的代码: public void takePhoto() { Intent intent = new Intent("android.media.action.IMAGE_CAPTURE"); File photo = new File

在我的
Fragment
中,我尝试从我的相机拍摄照片,但是没有调用我的
Fragment
onActivityResult
。拍照后,此
片段
未显示,正在切换到我的第一个
片段
。有没有其他方法可以在
片段中捕获照片,或者我做错了什么

这是我目前的代码:

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

我试过你的代码,很好,伙计。我变了

PhotosListFragment.this.startActivityForResult(intent, 100);

拍完照片后,回到同样的活动中

我想你的两个片段是在同一个活动中


如果是这种情况,我建议您创建一个新的活动,并将新片段放在其中。

希望这能帮助您:

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

            }
        }        
    }    
}

对于片段,这是最简单的解决方案:

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

    }
}

这是最受欢迎的问题之一。我们可以找到很多关于这个问题的线索。但是没有一个对我有用

所以我用这个方法解决了这个问题

让我们首先了解为什么会发生这种情况。

我们可以直接从片段中调用
startActivityForResult
,但实际上,所有这些都是由活动处理的。

从片段调用startActivityForResult后,requestCode将被更改为将片段的标识附加到代码中。这将使活动能够在收到结果后跟踪发送此请求的人

一旦活动被导航回,结果将与修改后的requestCode一起发送到活动的onActivityResult,并将其解码为原始requestCode+片段的标识。之后,Activity将通过onActivityResult将活动结果发送到该片段。一切都完成了

问题是:

       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
@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);
            }    
       }
}
活动只能将结果发送到已直接附加到活动的片段,而不能发送到嵌套的片段。这就是为什么嵌套片段的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
@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);
            }    
       }
}
2)现在在父活动中重写**
onActivityResult()
:**

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
    }
您必须在父活动中调用此项才能使其正常工作

3)在片段调用中:

       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
@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的参考方法:

       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
@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);
            }    
       }
}
->从位图获取Uri的方法

->从Uri获取文件路径的方法

就这样。
有了这个解决方案,它可以应用于任何单个片段,无论它是否嵌套。是的,它也涵盖了所有案例!此外,代码也很好且干净。

片段或活动上的onActivityResult是吗?我的onActivityResult没有触发。我把这两种方法都放在我的片段中。还有什么我应该做的吗?onActivityResult是在称为碎片的活动中触发的。这对我有效,正是我想要的!但这只返回缩略图。@user2630955我使用了你的代码,但它没有完全工作。我无法查看从照相机拍摄的图像。你能帮帮我吗,我在这件事上坚持了两天。嘿,伙计,我知道这有点晚了,但对我来说很有效。谢谢!这个答案让我意识到实际上已经覆盖了活动的onActivityResult&并没有调用super。。很棒的酱汁。