我是Android新手,我试图在Android设备的内部存储中编写一个文本文件。但我得到了这个例外。
java.io.FileNotFoundException:/data/Afile.txt(权限被拒绝)
我尝试缩小问题范围,我发现这是权限问题所以我在清单文件中使用这些权限。
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
但问题没有解决,然后我发现从高级版本比API级别23我们要求在运行时期间的权限,所以我在运行时使用此函数来请求在内部存储中写入文件的权限。
private void checkDiskPermission ()
{
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED
&& ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED
&& ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
Toast.makeText(this, "No Permissions" , Toast.LENGTH_LONG).show();
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION}, 0);
}
else
{
Toast.makeText(this, "Has Permissions" , Toast.LENGTH_LONG).show();
}
}
在写入文件之前,我在按钮单击事件中调用了此函数。并且也在它中使用它
的onCreate
方法分开。
但我仍然得到“访问被拒绝”错误。
请帮助我该怎么做以及如何解决这个问题。
以下是在内部存储中写入文件的代码。
我想将它保存在任何更明显的文件夹中像“下载或DCIM”轻松访问它但无法找到任何方法,所以我在“data”文件夹中写入此文件。
try {
checkDiskPermission();
File path = Environment.getDataDirectory();
if(!path.exists())
{
path.mkdirs();
}
File myfile = new File(path, "Afile.txt");
FileWriter writer = new FileWriter(myfile);
writer.append("Hello This is sample test!");
writer.flush();
writer.close();
toast = Toast.makeText(getApplicationContext(), "Successful", Toast.LENGTH_SHORT);
query.setText(path.toString());
} catch (Exception ex) {
toast = Toast.makeText(getApplicationContext(), "Failed", Toast.LENGTH_SHORT);
query.setText("Catch " + ex.toString());
}
我在按钮的onClick方法中使用此代码。
在几乎所有操作系统中,每个文件/文件夹都拥有所有权/权限,并且基于尝试访问它的用户,它允许或完全拒绝用户(显示为Permission Denied
)。文件夹/data/
是Android系统自己拥有的私人文件夹。即使已授予存储权限,任何试图访问它的应用都将被拒绝。应用程序允许某些位置读取和写入。使用Environment.getExternalStoragePublicDirectory(DIRECTORY_DOWNLOADS)
而不是Environment.getDataDirectory()
。检查以下链接中的内部和外部文件存储部分:Data and file storage overview
您需要访问checkDiskPermission
结果中的文件夹和文件,而不是它。只需在调用checkDiskPermission
后剪切代码并在下面的方法中移动它们:
private void checkDiskPermission ()
{
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED
&& ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED
&& ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
Toast.makeText(this, "No Permissions" , Toast.LENGTH_LONG).show();
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION}, 0);
}
else
{
accessFilesAndFolders();
}
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions,@NonNull int[] grantResults) {
//move the accessing files and creating folders all here.
accessFilesAndFolders();
}
void accessFilesAndFolders(){
try {
File path = Environment.getDataDirectory();
if(!path.exists())
{
path.mkdirs();
}
File myfile = new File(path, "Afile.txt");
enter code here
FileWriter writer = new FileWriter(myfile);
writer.append("Hello This is sample test!");
writer.flush();
writer.close();
toast = Toast.makeText(getApplicationContext(), "Successful", Toast.LENGTH_SHORT);
query.setText(path.toString());
} catch (Exception ex) {
toast = Toast.makeText(getApplicationContext(), "Failed", Toast.LENGTH_SHORT);
query.setText("Catch " + ex.toString());
}
}