Android写入文件权限被拒绝[重复]

Posted

技术标签:

【中文标题】Android写入文件权限被拒绝[重复]【英文标题】:Android Write to File Permission Denied [duplicate] 【发布时间】:2019-09-18 08:52:59 【问题描述】:

我正在尝试写入 android 中的文件,但我不断收到此错误:

java.io.FileNotFoundException: /storage/emulated/0/Notes/TestFile.txt(权限被拒绝)

搜索此站点可以简单地解决此问题,即将 WRITE_EXTERNAL_STORAGE 添加到应用程序清单文件中,但这对我不起作用。我不断收到同样的错误。

写入文件的代码:

try 
                File root = new File(Environment.getExternalStorageDirectory(), "Notes");
                if (!root.exists()) 
                    root.mkdirs();
                
                File gpxfile = new File(root, "TestFile.txt");
                FileWriter writer = new FileWriter(gpxfile);
                writer.append("Hello World");
                writer.flush();
                writer.close();
                Toast.makeText(getApplicationContext(), "Saved", Toast.LENGTH_SHORT).show();
             catch (IOException e) 
                e.printStackTrace();
            

AndroidManifest.xml:

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

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

<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"
        android:label="@string/app_name"
        android:theme="@style/AppTheme.NoActionBar">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

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

【问题讨论】:

【参考方案1】:

您在AndroidManifest.xml 中提到了权限,但尚未从用户那里获得权限。您需要通过Android 活动中的用户授予WRITE_EXTERNAL_STORAGE 权限。

if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) 
            ActivityCompat.requestPermissions(this, new String[]Manifest.permission.WRITE_EXTERNAL_STORAGE, 1);
        

下次启动Activity 时,授予它权限,然后您就可以访问外部存储了。请注意,这只会提供写访问权限,而不是读访问权限。

【讨论】:

我收到此代码错误:“错误:不兼容的类型。 无法转换为 Context”和“错误:不兼容的类型。 无法转换为 Activity”。知道我可以用什么替换“this”以使其在我的 onClick 函数中工作吗?我发现这个线程很相似,但没有解决我的问题。 ***.com/questions/27704006/… 是的,你可以用 getContext() 或 getApplicationContext() 替换 'this'【参考方案2】:

如果您的目标 sdk 等于或大于 mashmallow 版本,您必须请求运行时权限

你可以在这里查看

https://developer.android.com/training/permissions/requesting

【讨论】:

【参考方案3】:

已修复,我必须在我写入文件的上方使用此代码请求权限:

            ActivityCompat.requestPermissions(MainActivity.this,
                    new String[]Manifest.permission.READ_EXTERNAL_STORAGE,
                    1);

            ActivityCompat.requestPermissions(MainActivity.this,
                    new String[]Manifest.permission.WRITE_EXTERNAL_STORAGE,
                    1);

完整的代码如下所示,用于在按钮单击函数中写入文件:

          ActivityCompat.requestPermissions(MainActivity.this,
                    new String[]Manifest.permission.READ_EXTERNAL_STORAGE,
                    1);

            ActivityCompat.requestPermissions(MainActivity.this,
                    new String[]Manifest.permission.WRITE_EXTERNAL_STORAGE,
                    1);




            try 
                File root = new File(Environment.getExternalStorageDirectory(), "Notes");
                if (!root.exists()) 
                    root.mkdirs();
                
                File gpxfile = new File(root, "TestFile.txt");
                FileWriter writer = new FileWriter(gpxfile);
                writer.append("Hello World");
                writer.flush();
                writer.close();
                Toast.makeText(getApplicationContext(), "Saved", Toast.LENGTH_SHORT).show();
             catch (IOException e) 
                e.printStackTrace();
            

【讨论】:

以上是关于Android写入文件权限被拒绝[重复]的主要内容,如果未能解决你的问题,请参考以下文章

尝试在 Android 中将文件写入 sdcard 时出现 FileNotFoundException(权限被拒绝)

尝试使用 FileLock、Python 写入文件时权限被拒绝

写入日志文件时Laravel 5权限被拒绝

写入我要提取的文件时,Git 给了我“权限被拒绝”错误

无法在 mod_wsgi 应用程序中写入文件:权限被拒绝

JSch SFTP 放入 IBM z/OS 失败:无法写入文件;嵌套异常为 3:权限被拒绝