无法获取真实文件路径 - Android Oreo 8+

Cannot get the real file path - Android Oreo 8+

我正在使用下载管理器下载文件并将其保存到下载文件夹中。 下载完成后,我会像这样选择文件夹路径:

int uriIndex = cursor.getColumnIndex(DownloadManager.COLUMN_LOCAL_URI);
                            String downloadedPackageUriString = cursor.getString(uriIndex);

然后我需要使用这个路径来解压下载的文件。解压代码如下:

SouceFile 是 downloadmanager 的路径。

解压缩(字符串源文件,字符串目标文件夹)

try {

            zis = new ZipInputStream(new BufferedInputStream(new FileInputStream(sourceFile)));
            ZipEntry ze;
            int count;

            byte[] buffer = new byte[BUFFER_SIZE];
            while ((ze = zis.getNextEntry()) != null) {

                String fileName = ze.getName();

                fileName = fileName.substring(fileName.indexOf("/") + 1);
                File file = new File(destinationFolder, fileName);
                File dir = ze.isDirectory() ? file : file.getParentFile();
                Log.i("MainService", "Unzipping fileName: " + fileName);

                file_path = destinationFolder + "/" + fileName;

                if (!dir.isDirectory() && !dir.mkdirs())
                    throw new FileNotFoundException("Invalid path: " + dir.getAbsolutePath());
                if (ze.isDirectory()) continue;
                FileOutputStream fout = new FileOutputStream(file);
                try {
                    while ((count = zis.read(buffer)) != -1) {
                        fout.write(buffer, 0, count);
                    }


                } finally {
                    fout.close();
                }

                list_filenames.add(file_downloaded);

            }
            Log.d("MainService", "TAM:" + tam);
        } catch (IOException ioe) {
            Log.d("MainService", "Oiiiiiiiiii " + ioe);
            return list_filenames;
        } finally {
            if (zis != null)
                try {
                    zis.close();
                } catch (IOException e) {

                }
        }

解压缩代码适用于 Android 6(我的 phone),但适用于 Android Oreo + 它不适用。

我正在从 zis = new ZipInputStream(new BufferedInputStream(new FileInputStream(sourceFile)));

获取(没有这样的文件或目录)

加强:我在 Android 6 上没有收到此错误。就在 8+

感谢您的帮助。

我尝试了其他有类似问题的人的一些建议,但对我不起作用。

I'm not getting this error on Android 6

至多,您在 Android 6.0 上测试的一台设备上不会出现此错误。设备型号很多运行Android6.0,不止一个

COLUMN_LOCAL_URI 应该为您提供 Uri 的字符串表示形式。这不适用于 FileInputStream,因为 Uri 不是文件。

替换:

zis = new ZipInputStream(new BufferedInputStream(new FileInputStream(sourceFile)));

与:

zis = new ZipInputStream(new BufferedInputStream(cr.openInputStream(Uri.parse(sourceFile))));

...其中 cr 是一个 ContentResolver,您可以通过在某些 Context.

上调用 getContentResolver() 获得