Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/187.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 安卓MkDirs正在失败_Java_Android_Mkdir - Fatal编程技术网

Java 安卓MkDirs正在失败

Java 安卓MkDirs正在失败,java,android,mkdir,Java,Android,Mkdir,似乎每当我使用MkDirs或单独保存文件(不创建目录)时,它都会失败。应用程序确实具有写入和读取存储的权限,因为这已在主活动中选中,如果未授予权限,活动甚至不会启动。我在安卓8.1.0上用像素2 XL运行这个。使用目录下载和其他类似的方法也不起作用。这感觉像是权限或其他存储问题,但我不太确定 public void onInput(MaterialDialog dialog, CharSequence input) { inputNorm

似乎每当我使用MkDirs或单独保存文件(不创建目录)时,它都会失败。应用程序确实具有写入和读取存储的权限,因为这已在主活动中选中,如果未授予权限,活动甚至不会启动。我在安卓8.1.0上用像素2 XL运行这个。使用目录下载和其他类似的方法也不起作用。这感觉像是权限或其他存储问题,但我不太确定

 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()

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

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

如果无法保存到
下载
文件夹,则代码的其他部分可能会出错

如果可以保存到
downloads
文件夹,则错误很可能是由于
getExternalStorageDirectory()
返回的路径有问题


编辑 还有两项建议:

  • 记录rootFolder的值。你需要三次检查,以确保它是你认为应该的。请使用此值编辑问题

  • mkdirs
    返回一个布尔值,指示是否创建了目录。通常,如果存在权限问题,该命令可能会失败。您还应该记录该命令的返回值。例如,如果
    mkdirs
    返回false,则您知道问题所在


  • 问题已经解决。这是Android的权限问题。为了编写文件,您必须明确要求使用write\u外部存储,我对此不屑一顾

    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()
            }
    
        }
    

    请将您得到的确切错误发布。@bremen_matt没有错误。LogCat中没有,没有碰撞,没有。只是没有创建目录而已。奇怪的是,它曾经在我的Pixel 1上工作,但在Pixel 2 XL、我的任何模拟器或我用
    rootFolder.mkdirs()测试过的任何其他设备上不再工作。检查返回值并相应地处理:
    如果(!rootFolder.mkdirs()){Toast(…无法创建目录…);返回;}
    Environment.getExternalStorageDirectory().toString()
    应该是
    Environment.getExternalStorageDirectory()
    仅限。权限?您是否要求写入外部存储?写?不幸的是,这也不起作用。该文件未显示在目录\u下载中。这可能是权限问题吗?我还建议两件事。首先,记录
    rootFolder
    的值。你需要三次检查,以确保它是你认为应该的。使用此值编辑问题将非常困难。其次,
    mkdirs
    返回一个布尔值,指示是否创建了目录。通常,如果存在权限问题,该命令可能会失败。您还应该记录该命令的返回值问题是我没有要求外部写入。我假设请求读取外部或整个权限组会自动授予对此的权限。然而,事实并非如此。你不应该将此作为答案发布。当然不是你的答案。我已经告诉了他应该做什么,然后贴出答案,他可以把它标记为正确。他看不见答案
    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()
            }
    
        }