Попробуйте получить растровое изображение из uri с помощью Fresco.

Не понимаю поведение, когда я получаю Bitmap, используя Fresco, используя ImagePipeline. Когда я отлаживаю свой код, он выполняет onNewResultImpl или onFailureImpl, а когда я запускаю приложение, оно не работает, это означает, что оно не вызывается onFailureImpl или onNewResultImpl (я проверяю его, используя Toast и Log во время работы приложения). Я видел этот SO Question и взял из него ссылку , а также < a href="http://frescolib.org/docs/using-image-pipeline.html#_" rel="nofollow noreferrer">из Fresco's документа

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (resultCode == Activity.RESULT_OK) {
        switch (requestCode) {
            case ACTION_OPEN_GALLERY:
                mImageCaptureUri = data.getData();
                if (mImageCaptureUri != null) {
                    commentImgView.setImageURI(mImageCaptureUri);//mImageCaptureUri is working fine
                    try {
                        imageRequest = ImageRequestBuilder
                                .newBuilderWithSource(mImageCaptureUri)
                                .setRequestPriority(Priority.HIGH)
                                .setLowestPermittedRequestLevel(ImageRequest.RequestLevel.FULL_FETCH)
                                .build();
                        dataSource = imagePipeline.fetchDecodedImage(imageRequest, CommentActivity.this);
                        dataSource.subscribe(new BaseBitmapDataSubscriber() {
                            @Override
                            protected void onNewResultImpl(@Nullable Bitmap bitmap) {
                                if (bitmap != null) {
                                    bmp = Bitmap.createBitmap(bitmap);
                                    Log.d("Bitmap ","after callback");
                                    Toast.makeText(CommentActivity.this,"has bitmap",Toast.LENGTH_SHORT).show();
                                } else {
                                    Log.d("Bitmap is null ","after callback");
                                    Toast.makeText(CommentActivity.this,"bitmap is null",Toast.LENGTH_SHORT).show();
                                }
                            }

                            @Override
                            protected void onFailureImpl(DataSource<CloseableReference<CloseableImage>> dataSource) {
                                Log.d("Bitmap ","after callback failure");
                                Toast.makeText(CommentActivity.this,"Failure",Toast.LENGTH_SHORT).show();
                            }
                        }, CallerThreadExecutor.getInstance());
                    } catch (Exception e){
                        e.printStackTrace();
                    } finally {
                        if (dataSource != null) {
                            dataSource.close();
                        }
                    }
                }
        }
    }
}

Примечание. Я пытаюсь получить растровое изображение из изображения в формате jpg, а не из какого-либо анимационного изображения в формате gif.


person Kaushik    schedule 05.10.2015    source источник
comment
попробуйте объявить imageRequest, imagePipeline and dataSource на уровне класса   -  person karan    schedule 06.10.2015
comment
убедитесь, что вы используете последние файлы библиотеки и файлы jar   -  person karan    schedule 06.10.2015
comment
какие значения содержит переменная data? убедитесь, что вы получаете правильные значения   -  person karan    schedule 06.10.2015
comment
нет, не видел. не нужно, пока есть Пикассо и Глайд. но сделал демо ранее   -  person karan    schedule 07.10.2015
comment
есть небольшая проблема с использованием скольжения, потому что оно изменяет размер растрового изображения в соответствии с шириной высоты изображения.   -  person Kaushik    schedule 07.10.2015
comment
нужно проверить fresco, попробую сделать демо для этого   -  person karan    schedule 07.10.2015


Ответы (1)


Я удалил блоки try и finally и закрыл Datasource внутри onNewResultImpl и onFailureImpl

фрагмент кода

ImageRequest imageRequest = ImageRequestBuilder
                            .newBuilderWithSource(mImageCaptureUri)
                            .setAutoRotateEnabled(true)
                            .build();

ImagePipeline imagePipeline = Fresco.getImagePipeline();
final DataSource<CloseableReference<CloseableImage>>
                            dataSource = imagePipeline.fetchDecodedImage(imageRequest, this);

dataSource.subscribe(new BaseBitmapDataSubscriber() {

      @Override
      public void onNewResultImpl(@Nullable Bitmap bitmap) {
         if (dataSource.isFinished() && bitmap != null){
                  Log.d("Bitmap","has come");
                  bmp = Bitmap.createBitmap(bitmap);
                  dataSource.close();
         }
     }

     @Override
     public void onFailureImpl(DataSource dataSource) {
        if (dataSource != null) {
                dataSource.close();
        }
     }
 }, CallerThreadExecutor.getInstance());
person Kaushik    schedule 12.10.2015
comment
Интересно, почему вам нужно Bitmap.createBitmap(bitmap) вместо простого bmp = bitmap? - person Sira Lam; 13.09.2017
comment
Это не полный код, я масштабировал растровое изображение и присвоил его bmp. - person Kaushik; 13.09.2017
comment
Хороший код. Очень полезно - person MrinmoyMk; 13.03.2021