来自片段的 UCrop 没有发送 requestCode

UCrop from a fragment no requestCode being sent

我正在尝试使用片段中的 Ucrop。我面临的问题是 onActivityresult 没有收到 requestCode == UCrop.REQUEST_CROP 因此没有执行我需要对图像执行的操作。我到处寻找教程,但没找到。

以下是使用UCrop的片段代码:

public class FragmentSettingsTabImage extends Fragment {
private String TAG = "----->";
Tools t;
private String currentPhotoPath;
private final int REQUEST_TAKE_PHOTO = 1;
private final int CAMERA_PERMISSIONS = 2;
private ImageView imgTabImageDriver;
private Button btnSettingsSaveImage;

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    if (requestCode == CAMERA_PERMISSIONS) {
        if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
            // All good so launch take picture from here
            dispatchTakePictureIntent();
        } else {
            // Permission denied. Warn the user and kick out of app
            AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
            builder.setTitle(R.string.permsDeniedCameraTitle);
            builder.setMessage(R.string.permsDeniedCameraMessage);
            builder.setCancelable(false);
            builder.setPositiveButton(R.string.close, new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    Objects.requireNonNull(getActivity()).finishAffinity();
                }
            });
            builder.create().show();
        }
    }
}

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == REQUEST_TAKE_PHOTO && resultCode == Activity.RESULT_OK) {
        Uri starturi = Uri.fromFile(new File(currentPhotoPath));
        Uri destinationuri = Uri.fromFile(new File(currentPhotoPath));
        UCrop.Options options = AppConstants.makeUcropOptions(Objects.requireNonNull(getActivity()));
        UCrop.of(starturi, destinationuri).withOptions(options).start(getActivity());
    }

    Log.d(TAG, "onActivityResult: CCCCCCC" + resultCode + " " + requestCode);

    // On result from cropper add to imageview
    getActivity();
    if (resultCode == Activity.RESULT_OK && requestCode == UCrop.REQUEST_CROP) {
        final Uri resultUri = UCrop.getOutput(data);
        assert resultUri != null;
        File imgFile = new File(resultUri.getPath());
        Picasso.Builder builder = new Picasso.Builder(Objects.requireNonNull(getActivity()));
        builder.listener(new Picasso.Listener() {
            @Override
            public void onImageLoadFailed(Picasso picasso, Uri uri, Exception exception) {
                exception.printStackTrace();
            }
        });
        builder.build().load(imgFile).into(imgTabImageDriver, new Callback() {
            @Override
            public void onSuccess() {
                btnSettingsSaveImage.setEnabled(true);
            }

            @Override
            public void onError(Exception e) {
                e.printStackTrace();
            }
        });
    }
}

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
}

@Override
public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    SharedPreferences preferences = Objects.requireNonNull(this.getActivity()).getSharedPreferences("mykago-driver", Context.MODE_PRIVATE);
    final SharedPreferences.Editor editor = preferences.edit();
    View view = inflater.inflate(R.layout.fragment_settings_tab_image, container, false);
    imgTabImageDriver= view.findViewById(R.id.imgTabImageDriver);
    ImageView imgTakeSettingsDriverPicture = view.findViewById(R.id.imgTakeSettingsDriverPicture);
    btnSettingsSaveImage = view.findViewById(R.id.btnSettingsSaveImage);

    imgTakeSettingsDriverPicture.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            dispatchTakePictureIntent();
        }
    });

    imgTabImageDriver.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            dispatchTakePictureIntent();
        }
    });

    btnSettingsSaveImage.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            editor.putString("driver_picture", currentPhotoPath);
            editor.apply();
        }
    });

    Picasso.Builder builder = new Picasso.Builder(Objects.requireNonNull(getContext()));
    builder.listener(new Picasso.Listener() {
        @Override
        public void onImageLoadFailed(Picasso picasso, Uri uri, Exception exception) {
            exception.printStackTrace();
        }
    });

    Log.d(TAG, "onCreateView: " + preferences.getString("driver_picture", ""));

    builder.build().load(new File(preferences.getString("id_picture", ""))).into(imgTabImageDriver);

    return view;
}

private void dispatchTakePictureIntent() {
    Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
    // Ensure that there's a camera activity to handle the intent
    if (takePictureIntent.resolveActivity(Objects.requireNonNull(getActivity()).getPackageManager()) != null) {
        // Create the File where the photo should go
        File photoFile = null;
        try {
            photoFile = createImageFile();
        } catch (IOException ex) {
            // Error occurred while creating the File
            Log.d("IMAGE CREATION", ex.toString());
        }
        // Continue only if the File was successfully created
        if (photoFile != null) {
            Uri photoURI = FileProvider.getUriForFile(getActivity(),
                    "com.mytestapp.fileprovider",
                    photoFile);
            takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, photoURI);
            startActivityForResult(takePictureIntent, REQUEST_TAKE_PHOTO);
        }
    }
}

private File createImageFile() throws IOException {
    // Create an image file name
    String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss", Locale.US).format(new Date());
    String imageFileName = "didimage_" + timeStamp + "_";
    File storageDir = Objects.requireNonNull(getActivity()).getExternalFilesDir(Environment.DIRECTORY_PICTURES);
    File image = File.createTempFile(
            imageFileName,
            ".png",
            storageDir
    );

    // Save a file: path for use with ACTION_VIEW intents
    currentPhotoPath = image.getAbsolutePath();
    return image;
}

}

正常 activity 中的相同代码可以正常工作。任何帮助表示赞赏。

已成功解决问题。要将 UCrop activity 的结果传递给片段而不是宿主 activity,您需要按如下方式调用 UCrop....start() 方法:

UCrop.of(starturi, destinationuri).withOptions(options).start(getActivity().getApplicationContext(), getFragmentManager().findFragmentByTag("your_fragment_tag"));

所以

.start(Context, Fragment)

这将确保调用片段的 onActivityResult 而不是宿主 activity。

这也适用:

UCrop.of(sourceUri,destinationUri) .withOptions(选项) .start(getActivity(),YourFragment.this);

如果你想从片段开始 uCrop activity 使用这个。

UCrop.of(uri, destinationFileName)
.withAspectRatio(1, 1)
.start(getContext(), this, UCrop.REQUEST_CROP);