如何在运行时请求权限后解决“拒绝访问”错误

问题描述 投票:0回答:2

我是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方法中使用此代码。

java android text-files filewriter access-denied
2个回答
2
投票

在几乎所有操作系统中,每个文件/文件夹都拥有所有权/权限,并且基于尝试访问它的用户,它允许或完全拒绝用户(显示为Permission Denied)。文件夹/data/是Android系统自己拥有的私人文件夹。即使已授予存储权限,任何试图访问它的应用都将被拒绝。应用程序允许某些位置读取和写入。使用Environment.getExternalStoragePublicDirectory(DIRECTORY_DOWNLOADS)而不是Environment.getDataDirectory()。检查以下链接中的内部和外部文件存储部分:Data and file storage overview


0
投票

您需要访问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());
                        }
    }
© www.soinside.com 2019 - 2024. All rights reserved.