创建浮动操作按钮以拍摄照片并以片段

时间:2018-06-13 14:58:17

标签: android

我正在尝试创建浮动操作按钮以拍摄照片并在片段的图像视图中显示它。 我设法做浮动,从画廊拍照并在我的片段中显示。 问题是:从相机拍照的浮动动作按钮并不像画廊捕捉的浮动动作按钮那样将其发送到片段。 这是我的代码:

 private final static int REQUEST_REQUIRED_PERMISSION = 0x01;
private final static int REQUEST_PICK_IMAGE = 0x02;
private final static int REQUEST_IMAGE_CAPTURE=102;
Uri uri;
private FloatingActionButton mFabPickImage;
private Button buckyButton;
private FloatingActionButton btn_fab;

ImageView src_img;



    public void onCreate (Bundle savedInstanceState){
        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);
        setCapture();
        setupViews();
    }

setCapture()是相机浮动按钮的功能,setView()是图库浮动按钮的功能

 private void setupViews() {

    mFabPickImage = findViewById(R.id.fab_pick_image);
    if (mFabPickImage != null) {
        mFabPickImage.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                Intent intent;

                if (Build.VERSION.SDK_INT >= 19) {
                    intent = new Intent(Intent.ACTION_OPEN_DOCUMENT);
                    intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, false);
                    intent.addFlags(Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION);
                } else {
                    intent = new Intent(Intent.ACTION_GET_CONTENT);
                }

                intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
                intent.setType("image/*");

                intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);

                ActivityLauncher.launchActivityForResult(MainActivity.this,
                        Intent.createChooser(intent, getString(R.string.app_name)),
                        REQUEST_PICK_IMAGE);


            }

        });
    }

}
private void setCapture(){
    btn_fab=(FloatingActionButton)findViewById(R.id.fab);
    btn_fab.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent i=new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
            String root =Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES).toString()+"propic.jpg";
            uri=Uri.parse(root);
            startActivityForResult(i,REQUEST_IMAGE_CAPTURE);

        }
    });


}

这是我的onActivity采取每个图像并将其发送到segmentImage()函数,使分段和发送输出到片段

protected void onActivityResult(int requestCode, int resultCode, Intent data) {

        Logger.debug("requestCode = %d, resultCode = %d, data = %s",
                requestCode,
                resultCode,
                data);
    if (requestCode == REQUEST_IMAGE_CAPTURE && resultCode == RESULT_OK) {

        Uri ImageCaptureUri=data.getData();
        Logger.debug("capture: %s", ImageCaptureUri);
                    if (ImageCaptureUri != null) {
           if (Build.VERSION.SDK_INT >= 19) {
                final int takeFlags = data.getFlags() & Intent.FLAG_GRANT_READ_URI_PERMISSION;
                getContentResolver()
                        .takePersistableUriPermission(ImageCaptureUri, takeFlags);
            }

            segmentImage2(ImageCaptureUri);
        }
    } else {
        super.onActivityResult(requestCode, resultCode, data);
    }

    Logger.debug("requestCode = %d, resultCode = %d, data = %s",
            requestCode,
            resultCode,
            data);

        if (requestCode == REQUEST_PICK_IMAGE && resultCode == RESULT_OK) {

            Uri pickedImageUri = data.getData();
            Logger.debug("picked: %s", pickedImageUri);

            if (pickedImageUri != null) {
                if (Build.VERSION.SDK_INT >= 19) {
                    final int takeFlags = data.getFlags() & Intent.FLAG_GRANT_READ_URI_PERMISSION;
                    getContentResolver()
                            .takePersistableUriPermission(pickedImageUri, takeFlags);
                }

                segmentImage(pickedImageUri);
            }
        } else {
            super.onActivityResult(requestCode, resultCode, data);
        }
    }


private void segmentImage(Uri pickedImageUri ) {
    Fragment fragment = findFragment(R.id.fragment_segment_bitmaps);

    if (fragment instanceof SegmentBitmapsFragment) {
        ((SegmentBitmapsFragment)fragment).segmentBitmap(pickedImageUri);//important note

    }

}
private void segmentImage2(Uri ImageCaptureUri ) {
    Fragment fragment = findFragment(R.id.fragment_segment_bitmaps);

    if (fragment instanceof SegmentBitmapsFragment) {
        ((SegmentBitmapsFragment)fragment).segmentBitmap(ImageCaptureUri);//important note

    }

}

2 个答案:

答案 0 :(得分:0)

实际上,我看到了一些需要解决的问题。 #1是一个小的,#2是我认为你真正看到的问题。

  1. 这是一件小事,但您的onActivityResult(...)实施应该得到清理。就目前而言,只需一次调用super.onActivityResult(...)即可多次调用onActivityResult(...)。如果我是你,我会使用一个检查请求代码的开关,然后在开关的每个案例中使用if / else来检查结果代码。

  2. 这是最重要的一个。根据我的经验,一些Android设备(三星是最大的冒犯者)拒绝将捕获的图像存储在您要求的地方。作为一般规则,首先,请始终检查您在MediaStore.ACTION_IMAGE_CAPTURE Intent中为图片数据指定的URI。如果它不存在,那么您可以在返回的data的{​​{1}} URI处进行检查。作为最后的手段,您可以在Google周围查找特定设备或相机应用可能存储捕获的图像的位置,并确保您的代码检查该位置。

答案 1 :(得分:0)

您应该覆盖片段

的主机活动中的onActivityResult