似乎每当我使用MkDirs或单独保存文件(不创建目录)时,它都会失败。该应用程序确实具有写入和读取存储的权限,因为这已在主活动中进行了检查,并且如果未授予权限,该活动甚至不会启动。我在Pixel 2 XL的Android 8.1.0上运行此程序。使用DIRECTORY_DOWNLOADS和其他类似方法也无效。感觉像是权限或其他存储问题,但我不确定。

 public void onInput(MaterialDialog dialog, CharSequence input) {
                            inputNormal = textContent.getText().toString();

                            File rootFolder = new File(Environment.getExternalStorageDirectory().toString(), "Sorbet");
                            if (!rootFolder.exists()) {
                                rootFolder.mkdirs();
                            }
                            try {
                                File file = new File(rootFolder, input.toString()+".txt");
                                BufferedWriter writer = new BufferedWriter(new FileWriter(file, true));
                                writer.write(inputNormal);
                                writer.newLine();
                                writer.flush();
                                writer.close();
                            } catch (IOException e) {
                                e.printStackTrace();
                            }


对于上下文,这是我用来检查权限的代码。对话框显示为授予权限,并且该权限显示为该应用程序的系统设置中所授予的权限,这已完全正常。

if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M) {
        fab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                int permissionCheck = ContextCompat.checkSelfPermission(getApplicationContext(),
                        Manifest.permission.READ_EXTERNAL_STORAGE);
                if (permissionCheck == PackageManager.PERMISSION_DENIED) {
                    Snackbar errorBar = Snackbar.make(findViewById(R.id.content_main), getString(R.string.snackbar_error),
                            Snackbar.LENGTH_LONG)
                            .setAction(getString(R.string.allow_access), new View.OnClickListener() {

                                @Override
                                public void onClick(View v) {
                                    ActivityCompat.requestPermissions(MainActivity.this,
                                            new String[]{Manifest.permission.READ_EXTERNAL_STORAGE},
                                            STORAGE_PERMISSION_RC);
                                }
                            });
                    errorBar.show();
                }
                if (permissionCheck == PackageManager.PERMISSION_GRANTED) {
                    startActivity(NoteCreateIntent);
                }
            }
        });
    }
    else{
        fab.setOnClickListener(new View.OnClickListener(){
            @Override
            public void onClick(View v) {
                startActivity(NoteCreateIntent);
            }
        });
    }

最佳答案

我会暂时尝试切换您要从中放入文件的文件夹

Environment.getExternalStorageDirectory()




Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS)


这个目录(以及音乐,视频等目录)似乎总是定义明确的,而getExternalStorageDirectory随设备而异。

我怀疑只是没有返回正确的值。您应该尝试保存在其他目录中,以确保错误不是由于代码的其他部分引起的。

如果您无法保存到getExternalStorageDirectory文件夹,则该错误可能是代码的其他部分。

如果可以保存到downloads文件夹,则错误很可能是由于downloads返回的路径有些奇怪。



编辑

另外两个建议:


记录rootFolder的值。您需要三重检查以确保它是您应该认为的。请使用此值编辑问题。
getExternalStorageDirectory()返回一个布尔值,指示是否创建目录。该命令可能会失败,通常是在存在权限问题的情况下。您还应该记录该命令的返回值。例如,如果mkdirs返回false,则您知道问题出在哪里。

10-07 17:39