android mkdirs 不工作
android mkdirs not working
我需要从 android 上的相机保存图像。
我在清单中使用了写外部存储权限,我正在使用这个代码
File dir = new File(Environment.getExternalStorageDirectory(), "Test");
if (!dir.exists() || !dir.isDirectory())
dir.mkdirs();
String path = dir.getAbsolutePath();
Log.d(TAG, path); //log show the path
File file = new File(dir.getAbsolutePath() + "/Pic.jpg");
Log.d(TAG, file.getAbsolutePath()); //again path is shown here
outStream = new FileOutputStream(file);
outStream.write(bytes);
outStream.close();
Log.d(TAG, "onPictureTaken - wrote bytes: " + bytes.length); //fail here
} catch (FileNotFoundException e) {
Log.d(TAG, "not done"); //error is here (this exception is thrown)
} catch (IOException e) {
Log.d(TAG, "not");
} finally { }
我也尝试了 mkdir() 而不是 mkdirs() 相同的结果。
知道代码中出了什么问题吗?
谢谢
您创建的是目录,不是文件。使用以下代码创建新文件
File file = new File(dir.getAbsolutePath() + "/Pic.jpg");
file.createNewFile()
试试这个。为棉花糖提供运行时权限,它在我的应用程序代码中完美运行:
private String getFilename(String strFileName) {
String filepath = Environment.getExternalStorageDirectory().getPath();
File fileBase = new File(filepath, "Test");
if (!fileBase.exists()) {
fileBase.mkdirs();
}
return (file.getAbsolutePath() + "/" + strFileName + file_exts[currentFormat]);
}
new File(getFilename(edt.getText().toString().trim()))
白痴我!我已经使用了 Manifest Permission 但是当在 phone 上安装应用程序时我没有授予存储权限!...我理解这个问题的否定...但我希望如果其他人面临同样的问题..检查你的phone 许可。不便之处,敬请见谅。
对于像我这样没有经验的人。我与这个问题作斗争,脱发有一段时间了。我的目标是 api 21(为了兼容性),它在棒棒糖上工作,但在棉花糖上它不会创建目录。我在清单中确实拥有 "uses" 权限,但它仍然无法正常工作。显然在 Marshmallow 中,当您使用 Android studio 安装时,它从不询问您是否应该授予它许可,它只是安静地失败,就像您拒绝它一样。您必须进入设置、应用程序、select 您的应用程序并打开权限开关。
如果您在 android M 上进行测试,您可能应该检查“设置”>“应用”>“权限”以查看是否授予了访问存储的权限。这救了我。
你有没有把
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
在您的 AndroidManifest 中?如果你使用 android M 你必须请求用户许可才能在 sd 上写入,看这里 example
有人像我一样在 Android10 尝试过。请在清单中使用以下 API:
<application android:requestLegacyExternalStorage="true" ... >
...
</application>
Google 的最新更新:
将应用更新为目标 Android 11 后,系统会忽略 requestLegacyExternalStorage 标志。
如果您已经允许 R/W 权限(也有运行时权限)但仍然不起作用,请在您的 AndroidManifest.xml
中添加下面提到的行
<申请
…………
…………
android:requestLegacyExternalStorage="真">
注意:如果您的目标是 Android 10+
,那么这必须是必需的
从 API 30
开始,您只能在 app-specific files
中填写
File dir = new File(context.getFilesDir(), "YOUR_DIR");
dir.mkdirs();
或在您应用的外部存储中Android/data
File dir = new File(myContext.getExternalFilesDir("FolderName"),"YOUR_DIR");
更新
这个答案提供了另一种解决方案
更新
另一种方法是在 manifest
中授予此权限
<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" />
喜欢这个回答
outputFile = new File(apkStorage + "/" + downloadFileName );
//在主文件中创建输出文件
//Create New File if not present
if (!outputFile.exists()) {
isExternalStorageWritable();
outputFile.getParentFile().mkdirs();
outputFile.createNewFile();
Log.e(TAG, "File Created");
OutputStream fos = new FileOutputStream(outputFile);//Get OutputStream for NewFile Location
InputStream fis = c.getInputStream();//Get InputStream for connection
byte[] buffer = new byte[1024];//Set buffer type
int len1 = 0;//init length
while ((len1 = fis.read(buffer)) >0) {
fos.write(buffer, 0, len1);//Write new file
}
//Close all connection after doing task
fos.close();
fis.close();
我写了这段用于创建文件的代码,但它在 android11
中不起作用
为 android API 29 及更高版本编写代码时,请在您的应用程序清单 (AndroidManifest.xml)
中使用以下权限
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE"/>
将您的代码调整为如下所示
ActivityCompat.requestPermissions(this, new String[]
{
Manifest.permission.READ_EXTERNAL_STORAGE,
Manifest.permission.WRITE_EXTERNAL_STORAGE
},
PackageManager.PERMISSION_GRANTED);
StrictMode.VmPolicy.Builder builder = new StrictMode.VmPolicy.Builder();
StrictMode.setVmPolicy(builder.build());
file = new File(Environment.getExternalStorageDirectory().getPath(), "TestDirectory/Document/");
if (!file.exists()) {
try {
file.mkdirs();
} catch (Exception e) {
e.printStackTrace();
}
}
我需要从 android 上的相机保存图像。 我在清单中使用了写外部存储权限,我正在使用这个代码
File dir = new File(Environment.getExternalStorageDirectory(), "Test");
if (!dir.exists() || !dir.isDirectory())
dir.mkdirs();
String path = dir.getAbsolutePath();
Log.d(TAG, path); //log show the path
File file = new File(dir.getAbsolutePath() + "/Pic.jpg");
Log.d(TAG, file.getAbsolutePath()); //again path is shown here
outStream = new FileOutputStream(file);
outStream.write(bytes);
outStream.close();
Log.d(TAG, "onPictureTaken - wrote bytes: " + bytes.length); //fail here
} catch (FileNotFoundException e) {
Log.d(TAG, "not done"); //error is here (this exception is thrown)
} catch (IOException e) {
Log.d(TAG, "not");
} finally { }
我也尝试了 mkdir() 而不是 mkdirs() 相同的结果。
知道代码中出了什么问题吗?
谢谢
您创建的是目录,不是文件。使用以下代码创建新文件
File file = new File(dir.getAbsolutePath() + "/Pic.jpg");
file.createNewFile()
试试这个。为棉花糖提供运行时权限,它在我的应用程序代码中完美运行:
private String getFilename(String strFileName) {
String filepath = Environment.getExternalStorageDirectory().getPath();
File fileBase = new File(filepath, "Test");
if (!fileBase.exists()) {
fileBase.mkdirs();
}
return (file.getAbsolutePath() + "/" + strFileName + file_exts[currentFormat]);
}
new File(getFilename(edt.getText().toString().trim()))
白痴我!我已经使用了 Manifest Permission 但是当在 phone 上安装应用程序时我没有授予存储权限!...我理解这个问题的否定...但我希望如果其他人面临同样的问题..检查你的phone 许可。不便之处,敬请见谅。
对于像我这样没有经验的人。我与这个问题作斗争,脱发有一段时间了。我的目标是 api 21(为了兼容性),它在棒棒糖上工作,但在棉花糖上它不会创建目录。我在清单中确实拥有 "uses" 权限,但它仍然无法正常工作。显然在 Marshmallow 中,当您使用 Android studio 安装时,它从不询问您是否应该授予它许可,它只是安静地失败,就像您拒绝它一样。您必须进入设置、应用程序、select 您的应用程序并打开权限开关。
如果您在 android M 上进行测试,您可能应该检查“设置”>“应用”>“权限”以查看是否授予了访问存储的权限。这救了我。
你有没有把
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
在您的 AndroidManifest 中?如果你使用 android M 你必须请求用户许可才能在 sd 上写入,看这里 example
有人像我一样在 Android10 尝试过。请在清单中使用以下 API:
<application android:requestLegacyExternalStorage="true" ... >
...
</application>
Google 的最新更新: 将应用更新为目标 Android 11 后,系统会忽略 requestLegacyExternalStorage 标志。
如果您已经允许 R/W 权限(也有运行时权限)但仍然不起作用,请在您的 AndroidManifest.xml
中添加下面提到的行<申请 ………… ………… android:requestLegacyExternalStorage="真"> 注意:如果您的目标是 Android 10+
,那么这必须是必需的从 API 30
开始,您只能在 app-specific files
File dir = new File(context.getFilesDir(), "YOUR_DIR");
dir.mkdirs();
或在您应用的外部存储中Android/data
File dir = new File(myContext.getExternalFilesDir("FolderName"),"YOUR_DIR");
更新
这个答案提供了另一种解决方案
更新
另一种方法是在 manifest
<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" />
喜欢这个回答
outputFile = new File(apkStorage + "/" + downloadFileName ); //在主文件中创建输出文件
//Create New File if not present
if (!outputFile.exists()) {
isExternalStorageWritable();
outputFile.getParentFile().mkdirs();
outputFile.createNewFile();
Log.e(TAG, "File Created");
OutputStream fos = new FileOutputStream(outputFile);//Get OutputStream for NewFile Location
InputStream fis = c.getInputStream();//Get InputStream for connection
byte[] buffer = new byte[1024];//Set buffer type
int len1 = 0;//init length
while ((len1 = fis.read(buffer)) >0) {
fos.write(buffer, 0, len1);//Write new file
}
//Close all connection after doing task
fos.close();
fis.close();
我写了这段用于创建文件的代码,但它在 android11
中不起作用为 android API 29 及更高版本编写代码时,请在您的应用程序清单 (AndroidManifest.xml)
中使用以下权限<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE"/>
将您的代码调整为如下所示
ActivityCompat.requestPermissions(this, new String[]
{
Manifest.permission.READ_EXTERNAL_STORAGE,
Manifest.permission.WRITE_EXTERNAL_STORAGE
},
PackageManager.PERMISSION_GRANTED);
StrictMode.VmPolicy.Builder builder = new StrictMode.VmPolicy.Builder();
StrictMode.setVmPolicy(builder.build());
file = new File(Environment.getExternalStorageDirectory().getPath(), "TestDirectory/Document/");
if (!file.exists()) {
try {
file.mkdirs();
} catch (Exception e) {
e.printStackTrace();
}
}