Android 创建浮动动作按钮以拍摄照片并在片段中显示

Android 创建浮动动作按钮以拍摄照片并在片段中显示,android,Android,我试图创建浮动动作按钮来拍照,并在图像视图中显示它的片段。 我设法做到了这一点,从画廊中拍摄照片,并在我的片段中展示。 问题是:从相机拍摄照片的浮动动作按钮不会像gallery capture的浮动动作按钮那样将照片发送到片段。 以下是我的代码: private final static int REQUEST_REQUIRED_PERMISSION = 0x01; private final static int REQUEST_PICK_IMAGE = 0x02; private fina

我试图创建浮动动作按钮来拍照,并在图像视图中显示它的片段。 我设法做到了这一点,从画廊中拍摄照片,并在我的片段中展示。 问题是:从相机拍摄照片的浮动动作按钮不会像gallery capture的浮动动作按钮那样将照片发送到片段。 以下是我的代码:

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

        }
    });


}
这是我的一个活动,可以获取每个图像并将其发送到segmentImage()函数,该函数进行分割并将输出发送到fragment

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

    }

}

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

  • 这是一件小事,但是您的
    onActivityResult(…)
    实现应该得到清理。目前,可以在对
    onActivityResult(…)
    的一次调用中多次调用
    super.onActivityResult(…)
    。如果我是你,我会使用一个检查请求代码的开关,然后在开关的每个案例中使用If/else来检查结果代码

  • 这是最大的一个。一些安卓设备(根据我的经验,三星是最大的罪犯)拒绝将拍摄的图像存储在你要求它们存储的地方。作为一般规则,首先,始终检查您在
    MediaStore.ACTION\u IMAGE\u CAPTURE
    Intent
    中为图像数据指定的URI。如果它不在那里,那么您可以在返回的
    Intent
    data
    URI中检查它。作为最后一种手段,您可以在谷歌上搜索特定设备或相机应用程序可能存储捕获图像的位置,并确保您的代码检查该位置


  • 您应该在片段的宿主活动中重写onActivityResult

    您的问题是什么?出什么问题了?我的浮动按钮只是从相机拍摄照片,但没有将其发送到碎片我如何做到这一点?尝试这样做:我如何检查从数据中捕获的图像返回的URI?您是否首先检查向系统发送
    MediaStore.ACTION\u image\u CAPTURE
    intent时指定的URI(以“propic.jpg”结尾的那一个)?它大部分时间都在那里。如果它不在那里,那么你需要搜索特定设备/相机应用程序存储图片的位置。