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(权限被拒绝)