Android: обрезка изображения после захвата или выбора из галереи

Я разрабатываю приложение, и как часть этого мне нужно обрезать изображение после захвата с камеры или после выбора его из галереи. У меня есть приложение для навигации в моем приложении, и из которого пользователь может выбрать опцию для просмотра своего изображения (камера или галерея). Всякий раз, когда он щелкает по одной из опций, вызывается фрагмент, в котором делается все остальное (вызов камеры, щелчок по картинке, получение данных и установка изображения для просмотра изображения). Итак, теперь мне нужно добавить функцию обрезки изображения, и я использовал одну из библиотек обрезки, доступных онлайн, которую можно найти здесь. Прежде чем попробовать его в своем приложении, я создал новый проект студии android и создал пример приложения, в котором пользователь может выбрать камеру, нажав кнопку, после чего обрезка будет завершена, и обрезанное изображение будет установлено в виде изображения на экране. Проект можно найти здесь. Теперь я попытался реализовать то же самое в своем приложении, но это не работает. Что касается кода, у меня есть класс ящика навигации, а затем класс фрагмента. В моей MainDrawerActivity (кратко):

В меню опций:

if (id == R.id.nav_camera) { 
        Fragment_TouchImageView camFrag = (Fragment_TouchImageView) getSupportFragmentManager().findFragmentById(R.id.imageFragment);
        camFrag.startCamera();
    }
else if (id == R.id.nav_gallery) { 
        Fragment_TouchImageView galFrag = (Fragment_TouchImageView) getSupportFragmentManager().findFragmentById(R.id.imageFragment);
        galFrag.openGallery();
    }

Теперь в моем Fragment_TouchImageView.java (Fragment):

Это весь код:

package com.example.shravan.watershed;

import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.provider.MediaStore;
import android.support.v4.app.Fragment;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Toast;

import com.soundcloud.android.crop.Crop;

import java.io.File;

public class Fragment_TouchImageView extends Fragment {

Uri imageUri;
private TouchImageView myTVF;
static final int REQUEST_IMAGE_CAPTURE = 10;
static final int PICK_IMAGE = 100;
private static Context context;
private static final String TAG = "Arunachala";

public Fragment_TouchImageView() {
    // Required empty public constructor
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    View v = inflater.inflate(R.layout.fragment_fragment__touch_image_view, container, false);
    context= getActivity().getApplicationContext();
    myTVF = (TouchImageView) v.findViewById(R.id.img);
    myTVF.setImageBitmap(null);
    return v;
}

public void startCamera() {
    Intent i = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
    startActivityForResult(i, REQUEST_IMAGE_CAPTURE);
}

public void openGallery() {
    Intent gallery = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.INTERNAL_CONTENT_URI);
    startActivityForResult(gallery, PICK_IMAGE);
}

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == REQUEST_IMAGE_CAPTURE && resultCode == Activity.RESULT_OK) {
        print("Camera requested");
        beginCrop(data.getData());
        print("Crop called and came to next line");
    }
    else if (requestCode == PICK_IMAGE  && resultCode == Activity.RESULT_OK)           {
        print("Gallery requested");
        beginCrop(data.getData());
        print("Crop called and came to next line");
    }
    else if (requestCode == Crop.REQUEST_CROP) {
        print("Crop.REQUEST_CROP called");
        handleCrop(resultCode, data);
        print("handleCrop called and came to next line");
    }
}

private void beginCrop(Uri source) {
    print("Crop has begun");
    Uri destination = Uri.fromFile(new File(context.getCacheDir(), "cropped"));
    Crop.of(source, destination).asSquare().start(getActivity());
    print("Crop has ended");
}

private void handleCrop(int resultCode, Intent result) {
    print("Came to handleCrop");
    if (resultCode == Activity.RESULT_OK) {
        print("RESULT OK");
        myTVF.setImageURI(Crop.getOutput(result));
    } else if (resultCode == Crop.RESULT_ERROR) {
        Toast.makeText(getActivity(), Crop.getError(result).getMessage(), Toast.LENGTH_SHORT).show();
    }
}

private void print(String s){
    Log.d(TAG, s);
}
}

Итак, я дал серию тегов Log, чтобы узнать поток и вот в чем проблема. Всякий раз, когда я выбираю камеру или галерею, она открывается правильно, и когда я снимаю изображение, вызывается beginCrop(), а когда я выбираю необходимую область обрезки и нажимаю Готово, она ничего не делает. Поток не входит в этот цикл:

else if (requestCode == Crop.REQUEST_CROP) {
        print("Crop.REQUEST_CROP called");
        handleCrop(resultCode, data);
        print("handleCrop called and came to next line");
    }

То же самое работает в другом примере проекта приложения без каких-либо проблем.(У него не было фрагментов).

Пожалуйста, помогите мне понять это!

1 ответ

Решение

Я получаю ту же проблему несколько недель назад, когда использую ту же библиотеку, поэтому проблема связана с onActivityResult и его requestCode при использовании его во фрагменте, поэтому попробуйте вызвать Crop.of следующим образом:

Crop.of(cropInputUri, cropOutputUri).asSquare().start(getContext(), Fragment.this, Crop.REQUEST_CROP);
Другие вопросы по тегам