Curzibn / Luban

Luban(鲁班)—Image compression with efficiency very close to WeChat Moments/可能是最接近微信朋友圈的图片压缩算法
Apache License 2.0
13.58k stars 2.25k forks source link

关于兼容Android7.0 FileProvider的问题 #340

Open cheng1128feng opened 5 years ago

cheng1128feng commented 5 years ago

FileProvider提供的Uri的schema是content,不是file,所以通过uri.getPath()是拿不到真正的路径的 `public Builder load(final Uri uri) { mStreamProviders.add(new InputStreamProvider() { @Override public InputStream open() throws IOException { return context.getContentResolver().openInputStream(uri); }

    @Override
    public String getPath() {
      return uri.getPath();
    }
  });
  return this;
}`

这里传入Uri后在open()方法是通过contentResolver来获取文件流的,这个没毛病,但是getpath()方法的实现就拿不到正确的文件路径,并且是一个不存在的路径。 result = Checker.SINGLE.needCompress(mLeastCompressSize, path.getPath()) ? new Engine(path, outFile, focusAlpha).compress() : new File(path.getPath()); 在压缩方法中,如果文件不需要压缩,使用path.getPath()创建了文件,导致返回的压缩文件路径错误,使用时找不到文件。

Tom-Stiven commented 5 years ago

根据uri.getScheme来判断,如果是ContentResolver.SCHEME_CONTENT,那么,使用load(uri)接口,如果是ContentResolver.SCHEME_FILE,那么,使用load(path)接口,其中,path为uri.getPath();