2015-03-06 3 views
0

Мое приложение имеет возможность изменить аватар пользователя (при последнем загрузке его в веб-службу). Но на некоторых устройствах запускается Cropper («com.android.camera.action.CROP» Intent), но возвращает null Uri. Могу ли я указать, что я сделал неправильно?Cropper возвращает null Uri

первый пользователь выбирает фотографию с:

public static void pickPhoto(final Context context) { 
    Intent pickImageIntent = new Intent(Intent.ACTION_GET_CONTENT); 
    pickImageIntent.setType("image/*"); 
    ((ActionBarActivity) context).startActivityForResult(Intent.createChooser(pickImageIntent, "Select Avatar"), SettingsActivity.REQUEST_CODE_PICK_AVATAR); 
} 

Затем после RESULT_OK (выбранного изображения Uri) активность ПОЛУЧИТЬ - он начинает кадрирования:

public static void startCropper(final Context context, final Uri imageToCrop) { 
    final Intent intent = new Intent("com.android.camera.action.CROP"); 
    intent.setData(imageToCrop); 
    intent.putExtra("outputX", 200); 
    intent.putExtra("outputY", 200); 
    intent.putExtra("aspectX", 1); 
    intent.putExtra("aspectY", 1); 
    intent.putExtra("scale", true); 
    intent.putExtra("noFaceDetection", true); 
    intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(getTempFile(context))); 
    intent.putExtra("return-data", true); 
    ((ActionBarActivity) context).startActivityForResult(intent, SettingsActivity.REQUEST_CODE_CROP_AVATAR); 
} 

который возвращает RESULT_OK с нулевым GetData():

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    if (requestCode == REQUEST_CODE_CROP_AVATAR && resultCode == RESULT_OK) { 
     Uri uri = data.getData(); // uri is null on some devices 
    } 
} 

Мой метод getTempFile:

public static File getTempFile(Context context) { 
    File cacheDir; 
    if (!Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) { 
     cacheDir = context.getCacheDir(); 
    } else { 
     cacheDir = context.getExternalCacheDir(); 
    } 
    File file = new File(cacheDir, "temp_avatar.jpg"); 
    try { 
     file.createNewFile(); 
    } catch (IOException e) { 
    } 
    return file; 
} 
+1

if (uri == null) bitmap = (Bitmap) data.getExtras(). Get ("data"); – greenapps

+0

@greenapps, не возвратит ли он необрезанный оригинальный растровый рисунок, который был передан Cropper? – localhost

+0

Хорошо, почему вы не отвечаете на свой вопрос самостоятельно? Я действительно удивляюсь, почему вы этого не пробовали. – greenapps

ответ

1

Как уже упоминалось в комментариях вопрос по greenapps, это просто нужно разместить дополнительную проверку в onActivityResult() если Ури нуль, а затем getExtra («данные»), как это:

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    if (requestCode == REQUEST_CODE_CROP_AVATAR && resultCode == RESULT_OK) { 
     Uri uri = data.getData(); 
     if (null != uri) { 
      // do something with uri 
     } else { 
      Bitmap bitmap = data.getExtra("data"); 
      // get uri from bitmap and do something with uri 
     } 
    } 
} 

Код проверен в моем приложении и работает нормально.

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