【问题标题】:Android Write to File Permission Denied [duplicate]Android写入文件权限被拒绝[重复]
【发布时间】: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>

【问题讨论】:

    标签: android


    【解决方案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 函数中工作吗?我发现这个线程很相似,但没有解决我的问题。 stackoverflow.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();
                  }
      

      【讨论】:

        猜你喜欢
        • 2023-04-01
        • 1970-01-01
        • 2015-11-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-08-12
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多