【问题标题】:Cropper returns null UriCropper 返回空 Uri
【发布时间】:2015-03-06 09:38:27
【问题描述】:

我的应用有可能更改用户头像(后者将其上传到网络服务)。但在某些设备上 Cropper ("com.android.camera.action.CROP" Intent) 启动,但返回 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() 为 null:

@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;
}

【问题讨论】:

  • if (uri==null) bitmap = (Bitmap) data.getExtras().get("data");
  • @greenapps,它不会返回传递给 Cropper 的未裁剪的原始位图吗?
  • 那么你为什么不自己回答你的问题呢?我真的很想知道你为什么不试试这个。

标签: android android-intent camera gallery


【解决方案1】:

正如 greenapps 在 cmets 中提到的,如果 uri 为 null 然后 getExtra("data") 只需在 onActivityResult() 中进行额外检查,如下所示:

@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
        }
    }
}

代码在我的应用程序中测试并且运行良好。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-17
    相关资源
    最近更新 更多