简体   繁体   中英

W/System.err: java.io.IOException: Permission denied when writing file

I'm trying to create a file to store the data collected by AudioRecord. But when I do that, android studio show me that:

 04-09 21:23:47.665 28293-28293/com.example.gongk.testfmcwv3 W/art: Before 
    Android 4.1, method android.graphics.PorterDuffColorFilter android.support.graphics.drawable.VectorDrawableCompat.updateTintFilter(android.graphics.PorterDuffColorFilter, android.content.res.ColorStateList, android.graphics.PorterDuff$Mode) would have incorrectly overridden the package-private method in android.graphics.drawable.Drawable
04-09 21:23:47.845 28293-28293/com.example.gongk.testfmcwv3 W/System.err: java.io.IOException: Permission denied
04-09 21:23:47.846 28293-28293/com.example.gongk.testfmcwv3 W/System.err:     at java.io.UnixFileSystem.createFileExclusively0(Native Method)
04-09 21:23:47.846 28293-28293/com.example.gongk.testfmcwv3 W/System.err:     at java.io.UnixFileSystem.createFileExclusively(UnixFileSystem.java:280)
04-09 21:23:47.846 28293-28293/com.example.gongk.testfmcwv3 W/System.err:     at java.io.File.createNewFile(File.java:948)
04-09 21:23:47.846 28293-28293/com.example.gongk.testfmcwv3 W/System.err:     at com.example.gongk.testfmcwv3.MainActivity.init(MainActivity.java:82)
04-09 21:23:47.846 28293-28293/com.example.gongk.testfmcwv3 W/System.err:     at com.example.gongk.testfmcwv3.MainActivity.onCreate(MainActivity.java:63)
04-09 21:23:47.846 28293-28293/com.example.gongk.testfmcwv3 W/System.err:     at android.app.Activity.performCreate(Activity.java:6912)
04-09 21:23:47.846 28293-28293/com.example.gongk.testfmcwv3 W/System.err:     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1126)
04-09 21:23:47.846 28293-28293/com.example.gongk.testfmcwv3 W/System.err:     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2900)
04-09 21:23:47.846 28293-28293/com.example.gongk.testfmcwv3 W/System.err:     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3008)
04-09 21:23:47.846 28293-28293/com.example.gongk.testfmcwv3 W/System.err:     at android.app.ActivityThread.-wrap14(ActivityThread.java)
04-09 21:23:47.846 28293-28293/com.example.gongk.testfmcwv3 W/System.err:     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1650)
04-09 21:23:47.846 28293-28293/com.example.gongk.testfmcwv3 W/System.err:     at android.os.Handler.dispatchMessage(Handler.java:102)
04-09 21:23:47.846 28293-28293/com.example.gongk.testfmcwv3 W/System.err:     at android.os.Looper.loop(Looper.java:154)
04-09 21:23:47.846 28293-28293/com.example.gongk.testfmcwv3 W/System.err:     at android.app.ActivityThread.main(ActivityThread.java:6688)
04-09 21:23:47.846 28293-28293/com.example.gongk.testfmcwv3 W/System.err:     at java.lang.reflect.Method.invoke(Native Method)
04-09 21:23:47.846 28293-28293/com.example.gongk.testfmcwv3 W/System.err:     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1468)
04-09 21:23:47.846 28293-28293/com.example.gongk.testfmcwv3 W/System.err:     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1358)
04-09 21:23:47.866 28293-28300/com.example.gongk.testfmcwv3 W/art: Suspending all threads took: 5.158ms

My AndroidManifest.xml:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.gongk.testfmcwv3">

    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.RECORD_AUDIO" />
    <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">

        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

    </application>

</manifest>

java code:

file = new File(Environment.getExternalStorageDirectory(),"TestFMCWR");
        if (file.exists()) file.delete();
        try {
            file.createNewFile();
        } catch (IOException e) {
            e.printStackTrace();
        }

I can't figure out why the permission is not work.

如果您的目标 api 级别 >=29 或者您使用的是 android 10,那么请在应用程序标签的应用程序清单文件中添加以下行

android:requestLegacyExternalStorage="true"

Try this,

    private Context mContext=YourActivity.this;

    private static final int REQUEST = 112;


    if (Build.VERSION.SDK_INT >= 23) {
        String[] PERMISSIONS = {android.Manifest.permission.READ_EXTERNAL_STORAGE,android.Manifest.permission.WRITE_EXTERNAL_STORAGE};
        if (!hasPermissions(mContext, PERMISSIONS)) {
            ActivityCompat.requestPermissions((Activity) mContext, PERMISSIONS, REQUEST );
        } else {
            //do here
        }
    } else {
         //do here
    }

get Permissions Result

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        switch (requestCode) {
            case REQUEST: {
                if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                        //do here
                } else {
                    Toast.makeText(mContext, "The app was not allowed to read your store.", Toast.LENGTH_LONG).show();
                }
            }
        }
    }

check permissions for marshmallow

    private static boolean hasPermissions(Context context, String... permissions) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && context != null && permissions != null) {
            for (String permission : permissions) {
                if (ActivityCompat.checkSelfPermission(context, permission) != PackageManager.PERMISSION_GRANTED) {
                    return false;
                }
            }
        }
        return true;
    }

Manifest

    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

I was experiencing this same issue. In other words, my manifest appeared to have all the correct permissions, and I was running without issues on API level 22. When I installed on a device with API level 25, my camera feature stopped working. I could see in the logs that I was getting your same exception as OP.

This was solved by going into the app's settings on the device and allowing "Storage" permission. No code changes needed.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM