首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Android MkDirs失败了

Android MkDirs失败了
EN

Stack Overflow用户
提问于 2018-04-17 14:38:28
回答 2查看 1K关注 0票数 1

看起来,每当我使用MkDirs或单独保存文件(不创建目录)时,它就会失败。该应用程序确实拥有读写存储的权限,因为这是在主活动中签入的,如果未授予许可,该活动甚至不会启动。我在Android8.1.0上运行于Pixel2XL上。使用DIRECTORY_DOWNLOADS和其他类似的方法也不起作用。这感觉像是权限或其他存储问题,但我不太确定。

代码语言:javascript
复制
 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();
                            }

对于上下文,下面是我用来检查权限的代码。这是完全工作的,因为对话框显示要授予权限,权限显示为应用程序的系统设置中授予的权限。

代码语言:javascript
复制
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);
            }
        });
    }
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-04-21 02:00:07

这个问题已经解决了。这是Android的许可问题。为了编写文件,您必须显式地请求WRITE_EXTERNAL_STORAGE,这是我所不接受的。

代码语言:javascript
复制
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()
        }

    }
票数 0
EN

Stack Overflow用户

发布于 2018-04-17 14:50:15

我会尝试,只是暂时的,切换文件夹,你要把文件从

代码语言:javascript
复制
Environment.getExternalStorageDirectory()

代码语言:javascript
复制
Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS)

这个目录(以及音乐、视频等目录)似乎总是定义良好,而getExternalStorageDirectory则因设备而异。

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

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

如果您可以保存到downloads文件夹中,那么错误很可能是由于getExternalStorageDirectory()返回的路径奇怪所致。

编辑

还有两项建议:

  1. 记录rootFolder的值。你需要三次检查,以确保它是你认为应该的。请用此值编辑问题。
  2. mkdirs返回一个布尔值,指示是否创建了该目录。该命令可能会失败,通常是在出现权限问题时。您还应该记录该命令的返回值。例如,如果mkdirs返回false,那么您就知道问题所在了。
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49880997

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档