Android обрезать действие getData null с некоторым устройством
У меня проблема при обрезке изображения с результатом активности. Я установил разрешение на устройстве>6. Но когда показывать обрезку и обрезку успешно, данные результата равны нулю. (imageReturnedIntent.getData()
нам нулевые и намеренные данные тоже нулевые). Это код обрезки изображения.
public static Intent cropIntent(Uri inUri, int outputX, int outputY,
boolean isScale) {
Intent cropIntent = new Intent("com.android.camera.action.CROP");
cropIntent.setDataAndType(inUri, "image/*");
cropIntent.putExtra("crop", "true");
cropIntent.putExtra("aspectX", outputX > 0 ? outputX : 100);
cropIntent.putExtra("aspectY", outputY > 0 ? outputY : 100);
cropIntent.putExtra("outputX", outputX > 0 ? outputX : 100);
cropIntent.putExtra("outputY", outputY > 0 ? outputY : 100);
cropIntent.putExtra("scale", isScale);
File file = new File(Environment.getExternalStorageDirectory() + File.separator + "img.jpg");
Uri mCropImagedUri = Uri.fromFile(file);
cropIntent.putExtra(android.provider.MediaStore.EXTRA_OUTPUT, mCropImagedUri);
cropIntent.putExtra("return-data", true);
return cropIntent;
}
Это код активности результата
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent imageReturnedIntent) {
super.onActivityResult(requestCode, resultCode, imageReturnedIntent);
if (callbackManager != null) {
callbackManager.onActivityResult(requestCode, resultCode, imageReturnedIntent);
}
switch (requestCode) {
case SELECT_PHOTO:
if (resultCode == RESULT_OK) {
Uri uriImage = imageReturnedIntent.getData();
System.out.println(">>>> uri "+uriImage);
// CommonUtils.cropImage(uriImage,HomeActivity.this,SELECT_CROP_IMAGE);
startActivityForResult(CommonUtils.cropIntent(uriImage,
200, 200, true), SELECT_CROP_IMAGE);
}
break;
case SELECT_CROP_IMAGE:
if (resultCode == RESULT_OK) {
// Uri uri = imageReturnedIntent.getData();
System.out.println(">>>>> "+imageReturnedIntent.getData());
Bundle extras = imageReturnedIntent.getExtras();
if (extras == null) {
System.out.println(">>>>> check intent");
return;
}
// Bitmap bitMapScale = extras.getParcelable("data");
Uri uri = extras.getParcelable(MediaStore.EXTRA_OUTPUT);
try {
Bitmap bitMapScale = MediaStore.Images.Media.getBitmap(this.getContentResolver(), uri);
System.out.println(">>>>>> check " + bitMapScale);
// yourSelectedImage.recycle();
// base64
String myBase64Image = CommonUtils.encodeToBase64(bitMapScale, Bitmap.CompressFormat.PNG, 100);
// bitMapScale.recycle();
assert uri != null;
LocalStorage.getShareInstance().saveUriAvatar(uri.toString());
LocalStorage.getShareInstance().saveBase64Image(myBase64Image);
UserModel userModel = LocalStorage.getShareInstance().getUserLogin();
if (userModel == null) {
// if user have not login.
if (uiLeftMenu != null) {
uiLeftMenu.fillImage(uri);
}
} else {
System.out.println(">>>>>> check data");
if (CommonUtils.isStringDataValid(myBase64Image)) {
upLoadImageToServerWithStringBase64(myBase64Image);
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
break;
}
}
В чем проблема?
1 ответ
Я также столкнулся с той же проблемой на устройстве Huwai. Некоторое устройство не отправило Uri назначения через intent.getData()
, Но после некоторой отладки я узнал, что URI установлен на mAction
Строковая переменная и к ней можно получить доступ через intent.getAction()
метод. Затем вы можете сгенерировать Uri с помощью метода Uri.parse (outPutFilePath). Вы можете сначала проверить intent.getData()
является нулевым или нет. Если ноль, тогда используйте intent.getAction()
метод, чтобы получить Uri в виде строки и сгенерировать выходной Uri. Я решил свою проблему таким образом. Надеюсь, это поможет.