从片段中的相机拍照

use*_*897 20 android android-camera android-fragments

在我的Fragment尝试从我的相机拍照,但onActivityResultFragment没有被调用.拍照后这Fragment没有显示,正在切换到我的第一个Fragment.在那里有任何其他方式来捕捉a中的照片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());
                }
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

San*_*iya 23

希望对你有帮助:

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

            }
        }        
    }    
}
Run Code Online (Sandbox Code Playgroud)


Kis*_*oid 14

这是最受欢迎的问题之一.我们可以找到很多有关此问题的主题.但它们都不适合我.

所以我使用这个解决方案解决了这个问题.

让我们先了解为什么会这样.

我们可以startActivityForResult直接从Fragment 调用,但实际上后面的机制都是由Activity处理的.

startActivityForResult从Fragment 调用后,requestCode将被更改为将Fragment的标识附加到代码中.这将使Activity能够跟踪收到结果后发送此请求的人员.

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

问题是:

Activity可以将结果仅发送到已直接附加到Activity而不是嵌套的Fragment.这就是为什么嵌套片段的onActivityResult永远不会被调用的原因.

解:

1)通过以下代码在片段中启动Camera 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
Run Code Online (Sandbox Code Playgroud)

2)现在在您的父活动覆盖**onActivityResult():**

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
    }
Run Code Online (Sandbox Code Playgroud)

您必须在父活动中调用此方法才能使其正常工作.

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);
            }    
       }
}
Run Code Online (Sandbox Code Playgroud)

4)获取URI的参考方法:

- >从位图获取Uri的方法

 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);
    }
Run Code Online (Sandbox Code Playgroud)

- >从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();
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

而已.使用此解决方案,它可以应用于任何单个片段,无论它是否嵌套.是的,它也涵盖了所有情况!此外,代码也很好,干净.


Ami*_*kar 8

我试过你的代码工作得很好.我变了

PhotosListFragment.this.startActivityForResult(intent, 100);
Run Code Online (Sandbox Code Playgroud)

getActivity().startActivityForResult(intent, 100);
Run Code Online (Sandbox Code Playgroud)

在拍完照片之后,返回相同的活动.

我认为你的两个片段都是同一个活动.

如果是这种情况,我建议你创建一个新活动并将新片段放在那里.

  • 我的onActivityResult并没有被惹恼.我将这两种方法都放在我的片段中.还有什么我应该做的吗? (3认同)