2013-07-29 3 views
3

My Galaxy Nexus теперь работает на Android 4.3, что позволяет мне тестировать мое приложение с этой новой версией. Все кажется прекрасным, кроме обрезки.Результаты поиска в галерее Android 4.3Code Отменить

У меня есть приложение, которое использует камеру для съемки, а затем обрезает изображение через приложение галереи.

Я также могу выбрать изображение из галереи и обрезать его после. С Android 4.3 приложение галереи изменилось.

Если я сделать снимок с помощью ИПН камеры, а затем попросить галерею, чтобы обрезать его в моем методе onActivityResult ResultCode устанавливается в 0 (значение отмены), тогда как я нажал на «Сохранить» с точки зрения культуры.

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

У меня есть quickpic (альтернатива приложению галереи) на моем телефоне, с ним все работает!

private void performCrop(Uri picUri) { 
    try { 
     int aspectX = 750; 
     int aspectY = 1011; 

     Intent intent = new Intent("com.android.camera.action.CROP"); 
     intent.setDataAndType(picUri, "image/*"); 
     intent.putExtra("crop", "true"); 
     intent.putExtra("scale", "true"); 
     intent.putExtra("aspectX", aspectX); 
     intent.putExtra("aspectY", aspectY); 
     intent.putExtra("scaleUpIfNeeded", true); 

     intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(new File(mCurrentPhotoPath))); 

     startActivityForResult(intent, CROP); 
    } 
    catch (ActivityNotFoundException anfe) { 
     String errorMessage = "Your device doesn't support the crop action!"; 
     Toast toast = Toast.makeText(this, errorMessage, Toast.LENGTH_SHORT); 
     toast.show(); 
    } 
} 

Все работает отлично на Android 4.2.2. Благодарим за помощь!

ответ

3

Рассматривали ли вы просто использовать библиотеку, как это:

https://github.com/biokys/cropimage

Я считаю com.android.camera.action.CROP иногда может вести себя по-разному от телефона и не всегда доступны, так что это может вызвать некоторые проблемы для вас, если вы хотите его освободить.

UPDATE:

Я тестировал выше библиотеку с Android 4.3 и работает без проблем. Вам просто нужно добавить библиотеку в свой проект.

Вы можете написать свой метод в очень похожим образом:

private void performCrop(Uri picUri) { 
//you have to convert picUri to string and remove the "file://" to work as a path for this library 
String path = picUri.toString().replaceAll("file://", ""); 

try { 
    int aspectX = 750; 
    int aspectY = 1011; 

    Intent intent = new Intent(this, CropImage.class); 
    //send the path to CropImage intent to get the photo you have just taken or selected from gallery 
    intent.putExtra(CropImage.IMAGE_PATH, path); 

    intent.putExtra(CropImage.SCALE, true); 

    intent.putExtra("aspectX", aspectX); 
    intent.putExtra("aspectY", aspectY); 

    intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(new File(mCurrentPhotoPath))); 

    startActivityForResult(intent, CROP); 
} 
catch (ActivityNotFoundException anfe) { 
    String errorMessage = "Your device doesn't support the crop action!"; 
    Toast toast = Toast.makeText(this, errorMessage, Toast.LENGTH_SHORT); 
    toast.show(); 
} 

}

+0

Спасибо, что он отлично работает! : D – Kerwan

+0

Без проблем, рад, что он работает на вас :) – Daveloper87

+0

Thx отлично работает. Но можете ли вы объяснить это поведение на Android 4.3? Я видел это странное поведение и на Android 4.1 на устройствах Samsung s3. – noxius

3

Над библиотекой только полезно, если ваш кадрирование в гораздо меньших изображений. Если вы хотите обрезать изображения с более высоким разрешением, лучше всего использовать Android Crop Intent.

picUri должен быть действительным URI, который указывает на ваше изображение, а outputUri должен быть новым файлом, созданным для записи обрезанного изображения. Он работает на всех устройствах и 4.3. Исходный код действительно имеет намерение com.android.camera.action.CROP для использования. Я тестировал это на многих устройствах, и он работает хорошо.

private void performCrop(Uri picUri, Uri outputUri) { 
    try { 
     int aspectX = 2000; 
    int aspectY = 1200; 

     Intent intent = new Intent("com.android.camera.action.CROP"); 
     intent.setDataAndType(picUri, "image/*"); 
     intent.putExtra("scale", "true"); 
     intent.putExtra("aspectX", aspectX); 
     intent.putExtra("aspectY", aspectY); 
     intent.putExtra("scaleUpIfNeeded", true); 
     intent.putExtra("return-data", false); 

     intent.putExtra(MediaStore.EXTRA_OUTPUT, outputUri); 

     startActivityForResult(intent, CROP); 
    } 
    catch (ActivityNotFoundException anfe) { 
     String errorMessage = "Your device doesn't support the crop action!"; 
     Toast toast = Toast.makeText(this, errorMessage, Toast.LENGTH_SHORT); 
     toast.show(); 
    } 
} 
0

Я столкнулся с этой проблемой и с Nexus 10. цель урожая возвращает отмененный код. после некоторой настройки я нашел решение:

В моем случае входной файл, установленный в setDataAndType(), был тем же файлом, что и выходной набор с использованием MediaStore.EXTRA_OUTPUT дополнительных. Использование одного и того же файла для ввода и вывода отлично работает на большинстве устройств, особенно на устройствах ниже 4.3. Однако в 4.3 это приведет к отмене посевов.Простое использование разных файлов для ввода и вывода разрешило проблему.

Так что вам нужно убедиться, что ваш параметр picUri указывает на файл, который не совпадает с вашим mCurrentPhotoPath. Я не уверен, что именно изменилось с 4.2 до 4.3, чтобы вызвать эту проблему. Но использование разных файлов, похоже, легко разрешает.

Смежные вопросы