Android: не удается загрузить фотографию, сохраненную с камеры - PullRequest
0 голосов
/ 30 октября 2019

У меня проблема с фотографией с помощью камеры и показом ее в разделе «Действия». В основном, фотография не загружается, и 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, другие устройства работают правильно

есть идеи, почему это происходит и как этого избежать?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...