Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/229.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何解决;“拒绝访问”;即使在运行时请求权限后也会出错_Java_Android_Text Files_Filewriter_Access Denied - Fatal编程技术网

Java 如何解决;“拒绝访问”;即使在运行时请求权限后也会出错

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

我是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" />
在写入文件之前,我在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在android
LOLLIPOP
之后,您可能需要使用FileProvider,有关详细信息,请查看我的。@KhaledLela
FileProvider
用于访问存储在私人位置并由其他应用程序拥有的文件。因为它的目的是访问公共场所,
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());
                        }
    }