iielse / imageviewer

A simple and customizable Android full-screen image viewer 一个简单且可自定义的Android全屏图像浏览器
MIT License
2.23k stars 310 forks source link

P01 open failed: ENOENT (No such file or directory) #13

Closed iielse closed 6 years ago

iielse commented 7 years ago

华为系统相册返回Uri不能直接使用 uri.getPath 。不然使用BitmapFactory.decodeFile会返回空

解析方案参考 https://github.com/Yalantis/uCrop 源码

private static Bitmap obtainBmpSource(@NonNull Context context, @NonNull Uri uri, int requiredWidth, int requiredHeight) throws Exception {
        final ParcelFileDescriptor parcelFileDescriptor = context.getContentResolver().openFileDescriptor(uri, "r");
        final FileDescriptor fileDescriptor = parcelFileDescriptor.getFileDescriptor();
        final BitmapFactory.Options options = new BitmapFactory.Options();
        options.inJustDecodeBounds = true;
        BitmapFactory.decodeFileDescriptor(fileDescriptor, null, options);
        options.inSampleSize = calculateInSampleSize(options, requiredWidth, requiredHeight);
        options.inJustDecodeBounds = false;

        Bitmap decodeSampledBitmap = null;

        boolean success = false;
        while (!success) {
            try {
                decodeSampledBitmap = BitmapFactory.decodeFileDescriptor(fileDescriptor, null, options);
                success = true;
            } catch (OutOfMemoryError error) {
                Log.e("ImageCropper", "decodeSampledBitmap: BitmapFactory.decodeFileDescriptor: ", error);
                options.inSampleSize++;
            }
        }

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
            close(parcelFileDescriptor);
        }

        int exifOrientation = getExifOrientation(context, uri);
        int exifDegrees = exifToDegrees(exifOrientation);
        int exifTranslation = exifToTranslation(exifOrientation);

        Matrix matrix = new Matrix();
        if (exifDegrees != 0) {
            matrix.preRotate(exifDegrees);
        }
        if (exifTranslation != 1) {
            matrix.postScale(exifTranslation, 1);
        }
        if (!matrix.isIdentity()) {
            decodeSampledBitmap = transformBitmap(decodeSampledBitmap, matrix);
        }
        return decodeSampledBitmap;
    }

修改核心代码 RxImagePickerFragment
替换方法入参 private void onQueryOrTakeSuccess(@NonNull String type, @NonNull List<String> pictures) { ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ private void onQueryOrTakeSuccess(@NonNull String type, @NonNull List<Uri> pictures) {

iielse commented 6 years ago

项目移除了这个工程代码