Почему намерение обрезать Android не возвращает ActivityResult? - PullRequest
3 голосов
/ 19 февраля 2012

Я пытаюсь обрезать изображение из медиа галереи. Я могу получить доступ к изображению, запустить инструмент обрезки по умолчанию и даже сохранить результат обрезанного изображения.

Тем не менее, намерение, которое я использую, просто не вернет никаких результатов, если обрезка прошла успешно.

Мой ГЛАВНЫЙ метод:

// Crop photo intent.
Intent intent = new Intent("com.android.camera.action.CROP", null);         
intent.setData(uri);   
intent.putExtra("outputX", outputX);
intent.putExtra("outputY", outputY);
intent.putExtra("aspectX", aspectX);
intent.putExtra("aspectY", aspectY);
intent.putExtra("scale", scale);
intent.putExtra("return-data", true);
intent.putExtra(MediaStore.EXTRA_OUTPUT, createTempCroppedImageFile());
intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString());

// Publish intent to crop picture.
activity.startActivityForResult(intent, activity.CROP_PHOTO_REQUEST_CODE);  

& Ndash; Метод OnActivityResult () & ndash;

// Photo crop activity.
if (requestCode == CROP_PHOTO_REQUEST_CODE) {
    if (resultCode == RESULT_OK) {
        Log.d(TAG, "user cropped a photo");
        signupScreen.setImage(new PhotoTool(this).getTempCroppedImageFileLocation());
    } else
        Log.d(TAG, "user cancelled photo crop");
}

Если я отменяю операцию обрезки, я получаю сообщение «Пользователь отменил обрезку фотографии». Но если я обрежу изображение, новое обрезанное изображение появится в целевом каталоге, но функция OnActivityResult () никогда не вызывается. Что дает?

Глядя на LogCat, я обнаружил, что каждый раз, когда я сохраняю обрезанное изображение, "JavaBinder" жалуется на "Ошибка транзакции подшивки". Я понимаю, что это как-то связано с памятью, но размер обрезанного файла составляет всего 24 КБ.

Ответы [ 2 ]

15 голосов
/ 19 февраля 2012

Нашел проблему с этим вопросом. Это, к сожалению, ограничение Android.

См. Android кроппер не может превышать 256?

Я установил вывод моего обрезанного изображения на 400x400. К сожалению, Android по умолчанию может обрезать только 256x256. Это очень расстраивает, особенно когда нет документации по лимитам.

1 голос
/ 19 февраля 2012

Вы звоните setResult(int) ( ссылка ) в намерении обрезать?

UPDATE : \

По умолчанию отправляется RESULT_CANCELLED. Он всегда будет отправлен обратно, если вы не реализуете несколько вещей.

В вашем намерении кадрирования, когда вы закончите редактирование (то есть пользователь нажимает кнопку «Готово» или что-то подобное), часть этого процесса вызовет setResult(RESULT_OK).

пример:

public void doneBTNPressed( View view ) {
    if ( view.getId() == R.id.doneBTN ) {
        this.isCropped = true;
    }
}

@Override    
protected void onPause() {
        if ( this.isCropped ) {
            setResult(RESUL_OK);
        }
        super.onPause();
    }

Этот результат (RESULT_OK плюс другое указанное вами целое число) передается обратно в вызывающую активность (при условии использования startActivityForResult ()). Там также несколько переопределений, в зависимости от ваших потребностей. В вызывающем (родительском) действии вам нужно будет реализовать onActivityResultint,int,Intent), чтобы получить результат от существующего действия.

В приведенной выше ссылке есть раздел «Начало деятельности и получение результатов», в котором объясняются различные способы получения информации из существующей деятельности.

...