Java 如何解决;“拒绝访问”;即使在运行时请求权限后也会出错
我是Android新手,我正试图在Android设备的内部存储器中编写一个文本文件。 但我得到了这个例外 java.io.FileNotFoundException:/data/Afile.txt(权限 拒绝) 我试图缩小问题的范围,我发现这是权限的问题,所以我在清单文件中使用这些权限Java 如何解决;“拒绝访问”;即使在运行时请求权限后也会出错,java,android,text-files,filewriter,access-denied,Java,Android,Text Files,Filewriter,Access Denied,我是Android新手,我正试图在Android设备的内部存储器中编写一个文本文件。 但我得到了这个例外 java.io.FileNotFoundException:/data/Afile.txt(权限 拒绝) 我试图缩小问题的范围,我发现这是权限的问题,所以我在清单文件中使用这些权限 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permis
<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" />
在写入文件之前,我在button click事件中调用了这个函数。
而且还用在了
一次创建
方法
但我仍然收到“拒绝访问”错误
请帮助我该怎么做以及如何解决这个问题
下面是在内部存储器中写入文件的代码
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();
}
}
我想保存在任何更明显的文件夹,如“下载或DCIM”访问它很容易,但找不到任何方法,所以我写在“数据”文件夹这个文件
我在按钮的onClick方法中使用此代码。您需要在
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());
}
}
在几乎所有的操作系统中,每个文件/文件夹都有所有权/权限,根据试图访问它的用户,它要么允许用户访问,要么完全拒绝用户访问(显示为
拒绝权限
)。文件夹/data/
是Android系统本身拥有的私有文件夹。任何试图访问它的应用程序都将被拒绝,即使已授予存储权限。应用程序允许读取和写入某些位置。使用Environment.getExternalStoragePublicDirectory(目录\u下载)
而不是Environment.getDataDirectory()
。查看以下链接中的“内部和外部文件存储”部分,了解如何执行此操作:谢谢。让我试试这个。在哪里调用这个方法onRequestPermissionsResult
您不需要调用它。在您调用checkDiskPermission()后,它将被调用代码>方法,但它没有。我试过了,但没用。仅else{Toast.makeText(this,“Has Permissions”,Toast.LENGTH_LONG).show();}
checkDiskPermission()的这部分代码>正在执行检查我编辑的答案。因为您只允许了一次权限,所以它将保存在应用程序存储中,并且不会被要求获得权限,但是如果您卸载应用程序并再次安装,它将再次要求。谢谢。您能指导我如何使用内部存储中的下载文件夹吗?刚刚更新了使用下载文件夹的答案。如果您仍然需要帮助,请告诉我。@ahasbini在androidLOLLIPOP
之后,您可能需要使用FileProvider,有关详细信息,请查看我的。@KhaledLelaFileProvider
用于访问存储在私人位置并由其他应用程序拥有的文件。因为它的目的是访问公共场所,FileProvider
是不必要的。@ahasbini你能不能把我的问题投上去我不知道为什么有人投了反对票。
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());
}
}