java.io.FileNotFoundException打开失败:EEXIST(文件存在)Android 11

java.io.FileNotFoundException打开失败:EEXIST(文件存在)Android 11,java,android,android-11,Java,Android,Android 11,我试图从服务器下载一个图像并将其保存在外部内存中,但在Android 11中,当我尝试创建文件时,它会给我一个错误。 我已授予访问外部存储器的权限 我在互联网上搜索了一下,他们建议我把这段代码放在清单中,但它对android 11不起作用 android:requestLegacyExternalStorage="true" 显示 <uses-permission android:name="android.permission.CAMERA" /

我试图从服务器下载一个图像并将其保存在外部内存中,但在Android 11中,当我尝试创建文件时,它会给我一个错误。 我已授予访问外部存储器的权限

我在互联网上搜索了一下,他们建议我把这段代码放在清单中,但它对android 11不起作用

android:requestLegacyExternalStorage="true"
显示

<uses-permission android:name="android.permission.CAMERA" />
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.WAKE_LOCK" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:requestLegacyExternalStorage="true"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/Theme.TestDwonloadImgApp"
        android:usesCleartextTraffic="true">
        <activity android:name=".MainActivity2">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity android:name=".MainActivity">
        </activity>
    </application>
错误

/System.err:java.io.FileNotFoundException:/storage/emulated/0/Download/ArtHunter/immaginimusei/arte-scienza.jpg:open失败:EEXIST(文件存在)
W/System.err:at libcore.io.IoBridge.open(IoBridge.java:492)
位于java.io.FileOutputStream。(FileOutputStream.java:236)
位于java.io.FileOutputStream。(FileOutputStream.java:186)
在com.theapplegeek.testdwonload imgapp.MainActivity.writeResponseBody(MainActivity.java:93)上
在com.theapplegeek.testdwonloadimgapp.MainActivity$1.onResponse(MainActivity.java:47)上
在2.DefaultCallAdapterFactory$ExecutorCallbackCall$1.lambda$onResponse$0$DefaultCallAdapterFactory$ExecutorCallbackCall$1(DefaultCallAdapterFactory.java:89)
更新时2.-$$Lambda$DefaultCallAdapterFactory$ExecutorCallbackCall$1$hVGjmafRi6VitDIrPNdoFizVAdk.run(未知来源:6)
位于android.os.Handler.handleCallback(Handler.java:938)
位于android.os.Handler.dispatchMessage(Handler.java:99)
位于android.os.Looper.loop(Looper.java:245)
位于android.app.ActivityThread.main(ActivityThread.java:8004)
位于java.lang.reflect.Method.invoke(本机方法)
位于com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:631)
位于com.android.internal.os.ZygoteInit.main(ZygoteInit.java:978)
原因:android.system.ErrnoException:打开失败:EEXIST(文件存在)
在libcore.io.Linux.open上(本机方法)
在libcore.io.ForwardingOs.open中(ForwardingOs.java:166)
在libcore.io.BlockGuardOs.open上(BlockGuardOs.java:254)
W/System.err:at libcore.io.ForwardingOs.open(ForwardingOs.java:166)
在android.app.ActivityThread$AndroidOs.open上(ActivityThread.java:7865)
在libcore.io.IoBridge.open中(IoBridge.java:478)
... 还有13个

在Android 11中
Android:requestLegacyExternalStorage=“true”
将被忽略,因为它是Android<11不破坏旧应用程序的一种特殊解决方案。 现在,你必须使用

<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE"/>
这将打开一个设置页面,您可以在其中为应用程序授予存储访问权限。如果应用程序已具有权限,则您将能够访问该目录。设置布局资源后,将其放在
onCreate()
方法的最开头


最好不要对您将来构建的任何应用程序执行此操作。

转到您的移动设置->应用程序->选择您的应用程序->权限->存储->选择允许管理所有文件


它适合我。

path2=path2.replaceAll(“/”+nome,”)你正在构建一条路径。没人能跟上你,我想你也看不见了。进一步检查mkdirs的返回值,如果为false,则相应地处理。删除.createNewFile调用。请重写你的代码。也在这里。你得到解决方案了吗??我不想使用android:requestLegacyExternalStorage
public static boolean writeResponseBody(ResponseBody body, String dir1) {
        try {
            String state = Environment.getExternalStorageState();
            if (Environment.MEDIA_MOUNTED.equals(state)) {
                // todo change the file location/name according to your needs

                String path = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS).toString() + "/ArtHunter";

                String path1 = path + dir1;
                File f = new File(path1);
                String path2 = f.getPath();
                String nome = f.getName();
                path2 = path2.replaceAll("/" + nome, "");

                File directory = new File(path2);
                if (!directory.exists())
                    directory.mkdirs();

                File img = new File(path2, nome);
                if (img.exists())
                    return true;
                img.createNewFile();

                InputStream inputStream = null;
                FileOutputStream outputStream = null;

                try {
                    byte[] fileReader = new byte[4096];

                    inputStream = body.byteStream();
                    outputStream = new FileOutputStream(img); //error here!

                    while (true) {
                        int read = inputStream.read(fileReader);

                        if (read == -1) {
                            break;
                        }

                        outputStream.write(fileReader, 0, read);

                    }

                    outputStream.flush();

                    return true;
                } catch (IOException e) {
                    e.printStackTrace();
                    return false;
                } finally {
                    if (inputStream != null) {
                        inputStream.close();
                    }

                    if (outputStream != null) {
                        outputStream.close();
                    }
                }
            }
            return false;
        } catch (IOException e) {
            e.printStackTrace();
            return false;
        }
    }
/System.err: java.io.FileNotFoundException: /storage/emulated/0/Download/ArtHunter/immaginimusei/arte-scienza.jpg: open failed: EEXIST (File exists)
W/System.err:     at libcore.io.IoBridge.open(IoBridge.java:492)
        at java.io.FileOutputStream.<init>(FileOutputStream.java:236)
        at java.io.FileOutputStream.<init>(FileOutputStream.java:186)
        at com.theapplegeek.testdwonloadimgapp.MainActivity.writeResponseBody(MainActivity.java:93)
        at com.theapplegeek.testdwonloadimgapp.MainActivity$1.onResponse(MainActivity.java:47)
        at retrofit2.DefaultCallAdapterFactory$ExecutorCallbackCall$1.lambda$onResponse$0$DefaultCallAdapterFactory$ExecutorCallbackCall$1(DefaultCallAdapterFactory.java:89)
        at retrofit2.-$$Lambda$DefaultCallAdapterFactory$ExecutorCallbackCall$1$hVGjmafRi6VitDIrPNdoFizVAdk.run(Unknown Source:6)
        at android.os.Handler.handleCallback(Handler.java:938)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loop(Looper.java:245)
        at android.app.ActivityThread.main(ActivityThread.java:8004)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:631)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:978)
    Caused by: android.system.ErrnoException: open failed: EEXIST (File exists)
        at libcore.io.Linux.open(Native Method)
        at libcore.io.ForwardingOs.open(ForwardingOs.java:166)
        at libcore.io.BlockGuardOs.open(BlockGuardOs.java:254)
W/System.err:     at libcore.io.ForwardingOs.open(ForwardingOs.java:166)
        at android.app.ActivityThread$AndroidOs.open(ActivityThread.java:7865)
        at libcore.io.IoBridge.open(IoBridge.java:478)
        ... 13 more
<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE"/>
if(Environment.isExternalStorageManager())
{
    internal = new File("/sdcard");
    internalContents = internal.listFiles();
}
else
{
    Intent permissionIntent = new Intent(Settings.ACTION_MANAGE_ALL_FILES_ACCESS_PERMISSION);
    startActivity(permissionIntent);
}