简体   繁体   English

Cropper返回空的Uri

[英]Cropper returns null Uri

My app has possibility to change user avatar (with latter uploading it to web service). 我的应用程序可以更改用户头像(稍后将其上传到Web服务)。 But on some devices Cropper ("com.android.camera.action.CROP" Intent) starts, but returns null Uri. 但是在某些设备上,Cropper(“ com.android.camera.action.CROP” Intent)启动,但返回空Uri。 Could u point me what i've done wrong? 你能指出我做错了什么吗?

1st user picks photo with: 第一位用户通过以下方式选择照片:

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

Then after activity get's RESULT_OK (selected image uri) - it starts cropper: 然后,在活动获得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);
}

which returns RESULT_OK with null getData(): 返回带有空getData()的RESULT_OK:

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

My getTempFile method: 我的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;
}

As mentioned in question comments by greenapps, it's just need to place additional check in onActivityResult() if uri is null and then getExtra("data"), like this: 正如greenapps在问题注释中提到的,如果uri为null,则只需要在onActivityResult()中进行其他检查,然后将getExtra(“ data”)设置为如下所示:

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

Code tested in my app and works fine. 代码在我的应用中经过测试,可以正常运行。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM