Android MkDirs 失败
Android MkDirs is Failing
好像每当我使用MkDirs 或自己保存文件(不创建目录)时,它都失败了。该应用程序确实具有写入和读取存储空间的权限,因为这已在主 activity 中检查过,如果未授予权限,activity 甚至不会启动。我在 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
没有 return 正确的值。您应该尝试保存在不同的目录中,以确保错误不是由代码的其他部分引起的。
如果您无法保存到 downloads
文件夹,则错误可能出现在代码的其他部分。
如果您可以保存到 downloads
文件夹,那么错误很可能是由于路径 return 由 getExternalStorageDirectory()
编辑的某些奇怪内容造成的。
编辑
另外两条建议:
记录 rootFolder 的值。您需要三重检查以确保它是您认为应该的样子。请使用此值编辑问题。
mkdirs
returns 一个布尔值,指示目录是否已创建。该命令可能会失败,通常是在存在权限问题时。您还应该记录该命令的 return 值。例如,如果 mkdirs
return 为假,那么您就知道问题出在哪里了。
问题已解决。这是 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()
}
}
好像每当我使用MkDirs 或自己保存文件(不创建目录)时,它都失败了。该应用程序确实具有写入和读取存储空间的权限,因为这已在主 activity 中检查过,如果未授予权限,activity 甚至不会启动。我在 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
没有 return 正确的值。您应该尝试保存在不同的目录中,以确保错误不是由代码的其他部分引起的。
如果您无法保存到 downloads
文件夹,则错误可能出现在代码的其他部分。
如果您可以保存到 downloads
文件夹,那么错误很可能是由于路径 return 由 getExternalStorageDirectory()
编辑的某些奇怪内容造成的。
编辑
另外两条建议:
记录 rootFolder 的值。您需要三重检查以确保它是您认为应该的样子。请使用此值编辑问题。
mkdirs
returns 一个布尔值,指示目录是否已创建。该命令可能会失败,通常是在存在权限问题时。您还应该记录该命令的 return 值。例如,如果mkdirs
return 为假,那么您就知道问题出在哪里了。
问题已解决。这是 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()
}
}