У меня проблема с фотографией с помощью камеры и показом ее в разделе «Действия». В основном, фотография не загружается, и BitmapFactory.decodeStream возвращает ноль. как ни странно, если я подожду в отладке какое-то время, он будет загружен. хотя это поведение не соответствует. Я также использую com.isseiaoki.simplecropview.CropImageView
, чтобы обрезать изображение, которое обрабатывает растровое декодирование. Это соответствующий код:
Активность:
private final String DATA_PATH = "/mnt/sdcard/ocr/";
private void init() {
if (getIntent().getIntExtra(KEY_SHOULD_OPEN, 0) == CAMERA) {
tryOpenCamera();
} else {
openGallery();
}
createImageFile();
}
public void createImageFile(){
File photo;
try
{
// place where to store camera taken picture
photo = createTemporaryFile("picture", ".jpg");
}
catch(Exception e)
{
showGenericErrorDialog();
photo = null;
}
if(photo != null){
photoUri = FileProvider.getUriForFile(this, getApplicationContext().getPackageName() + ".provider", photo);
}
}
private File createTemporaryFile(String part, String ext) throws Exception
{
File tempDir=new File(DATA_PATH);
if(!tempDir.exists())
{
tempDir.mkdirs();
}
return File.createTempFile(part, ext, tempDir);
}
private void openCamera() {
Intent takePictureIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, photoUri);
startActivityForResult(takePictureIntent, REQUEST_TAKE_PHOTO);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == REQUEST_TAKE_PHOTO && resultCode == Activity.RESULT_OK) {
updateImageUI(photoUri);
}
}
private void updateImageUI(Uri uri) {
getBinding().cropImageView.startLoad(
uri,
new LoadCallback() {
@Override
public void onSuccess() {
}
@Override
public void onError() {
showGenericErrorDialog();
}
});
}
Код, связанный с библиотекой культур:
public void startLoad(Uri sourceUri, LoadCallback callback) {
mLoadCallback = callback;
mSourceUri = sourceUri;
if (sourceUri == null) {
postErrorOnMainThread(mLoadCallback);
throw new IllegalStateException("Source Uri must not be null.");
}
mExecutor.submit(new Runnable() {
@Override
public void run() {
mIsLoading = true;
mExifRotation = Utils.getExifOrientation(getContext(), mSourceUri);
int maxSize = Utils.getMaxSize();
int requestSize = Math.max(mViewWidth, mViewHeight);
if (requestSize == 0) requestSize = maxSize;
try {
final Bitmap sampledBitmap = Utils.decodeSampledBitmapFromUri(getContext(),
mSourceUri,
requestSize);
mInputImageWidth = Utils.sInputImageWidth;
mInputImageHeight = Utils.sInputImageHeight;
mHandler.post(new Runnable() {
@Override
public void run() {
mAngle = mExifRotation;
setImageBitmap(sampledBitmap);
if (mLoadCallback != null) mLoadCallback.onSuccess();
mIsLoading = false;
}
});
} catch (OutOfMemoryError e) {
Logger.e("OOM Error: " + e.getMessage(), e);
postErrorOnMainThread(mLoadCallback);
mIsLoading = false;
} catch (Exception e) {
Logger.e("An unexpected error has occurred: " + e.getMessage(), e);
postErrorOnMainThread(mLoadCallback);
mIsLoading = false;
}
}
});
}
public static Bitmap decodeSampledBitmapFromUri(Context context, Uri sourceUri, int requestSize) {
InputStream is = null;
try {
is = context.getContentResolver().openInputStream(sourceUri);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
BitmapFactory.Options options = new BitmapFactory.Options();
options.inSampleSize = Utils.calculateInSampleSize(context, sourceUri, requestSize);
options.inJustDecodeBounds = false;
return BitmapFactory.decodeStream(is, null, options);
}
Манифест:
<provider
android:name="android.support.v4.content.FileProvider"
android:authorities="${applicationId}.provider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_paths" />
</provider>
примечаниечто URI выглядит примерно так: content://my.package.provider/%2Fmnt%2Fsdcard%2F/ocr/picture9052876345621346933.jpg
, и я тестирую это на Samsung Galaxy S7 с Android 8
РЕДАКТИРОВАТЬ: на данный момент проблема существует только с S7, другие устройства работают правильно
есть идеи, почему это происходит и как этого избежать?