【问题标题】:Android MkDirs is FailingAndroid MkDirs 失败
【发布时间】:2018-09-27 14:11:33
【问题描述】:

似乎每当我使用 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);
            }
        });
    }

【问题讨论】:

  • 请发布您遇到的确切错误。
  • @bremen_matt 没有错误。 LogCat 中什么都没有,没有崩溃,什么都没有。该目录只是没有被创建。奇怪的是,它曾经可以在我的 Pixel 1 上运行,但不再在我的 Pixel 2 XL、我的任何模拟器或我测试过的任何其他设备上运行
  • rootFolder.mkdirs();。检查返回值并进行相应处理:if(!rootFolder.mkdirs()){Toast ( ... could not create directory ....); return;}.;
  • Environment.getExternalStorageDirectory().toString() 那应该只是Environment.getExternalStorageDirectory()
  • 权限?您是否要求写入外部存储?写?

标签: java android mkdir


【解决方案1】:

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

Environment.getExternalStorageDirectory()

Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS)

这个目录(连同音乐、视频等目录)似乎总是定义明确,而 getExternalStorageDirectory 因设备而异。

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

如果您无法保存到downloads 文件夹,则错误可能出现在代码的其他部分。

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


编辑

另外两个建议:

  1. 记录 rootFolder 的值。您需要三重检查以确保它是您认为应该是的。请使用此值编辑问题。

  2. mkdirs 返回一个布尔值,指示目录是否已创建。该命令可能会失败,通常是在存在权限问题的情况下。您还应该记录该命令的返回值。例如,如果mkdirs 返回 false,那么您就知道问题出在哪里。

【讨论】:

  • 不幸的是,这也没有奏效。该文件未显示在 DIRECTORY_DOWNLOADS 中。会不会是权限问题?
  • 我建议再做两件事。首先,记录rootFolder 的值。您需要三重检查以确保它是您认为应该是的。将使用此值编辑问题。其次,mkdirs 返回一个布尔值,指示目录是否已创建。该命令可能会失败,通常是在存在权限问题的情况下。您还应该记录该命令的返回值
  • 问题是我没有要求 WRITE_EXTERNAL。我假设要求读取外部或整个权限组自动授予此权限。但是,它没有。
【解决方案2】:

问题已解决。这是 Android 的权限问题。为了写文件,你必须明确地要求 WRITE_EXTERNAL_STORAGE,这是我不理会的。

if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M) {
        val permissionCheck = ContextCompat.checkSelfPermission(applicationContext,
                Manifest.permission.WRITE_EXTERNAL_STORAGE)

        //Granted Permission
        if (permissionCheck == PackageManager.PERMISSION_GRANTED) {
            val sorbetDirectory = File(Environment.getExternalStorageDirectory().path + "/Sorbet")
            sorbetDirectory.mkdirs()
        }

        //Denied Permission
        if (permissionCheck == PackageManager.PERMISSION_DENIED) {
            MaterialDialog.Builder(this)
                    .title(com.marlonjones.sorbet.R.string.titleP)
                    .content(com.marlonjones.sorbet.R.string.perm_content)
                    .positiveText(com.marlonjones.sorbet.R.string.ok)
                    .onPositive { dialog, which ->
                        ActivityCompat.requestPermissions(this@MainActivity,
                                arrayOf(Manifest.permission.WRITE_EXTERNAL_STORAGE),
                                STORAGE_PERMISSION_RC)
                    }
                    .show()
        }

    }

【讨论】:

  • 您不应该将此作为答案发布。当然不是你的答案。我已经告诉过我必须做什么。
  • 然后发布一个答案,他可以将其标记为正确。他不能标记一个看不见的答案
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-22
  • 1970-01-01
  • 2015-06-04
  • 2017-09-22
  • 1970-01-01
相关资源
最近更新 更多