无法在 android 内部存储中创建文件夹
Unable to create folder in android internal storage
我正在尝试在 phone 的内部存储中创建一个文件夹,但无论我做什么都无法创建它
我尝试过的事情:
正在从计算机上拔下 phone
为 API 23+
在清单中和以编程方式设置权限
我能找到的文件夹的每个变体:
Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS)
Environment.getDataDirectory()
等..
在每篇文章或文章的变体中搜索类似问题
尝试了 mkdir() 和 mkdirs() 的两种变体
选中phone如果文件夹存在
此代码也绑定到一个按钮,因此在我第二次按下它时应该已经授予了权限请求。
File sdir = new File (Environment.getExternalStorageDirectory().getpath(), "/DBTEST/");
String[] PERMISSIONS_STORAGE = {
Manifest.permission.WRITE_EXTERNAL_STORAGE
};
ActivityCompat.requestPermissions(MainActivity.this, PERMISSIONS_STORAGE, 1);
System.out.println("DIRECTORY CREATED: " + sdir.mkdirs());
System.out.println("EXISTS: " + sdir.exists());
System.out: DIRECTORY CREATED: false
System.out: EXISTS: false
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="com.example.testM">
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
尝试更改此行:
File sdir = new File (Environment.getExternalStorageDirectory().getpath(), "/DBTEST/");
到
File sdir = new File (Environment.getExternalFilesDir(null) + "/DBTEST/");
根据开发者文档:
getExternalStorageDirectory() -
This method was deprecated in API level 29.
To improve user privacy, direct access to shared/external storage devices is deprecated. When an app targets Build.VERSION_CODES.Q, the path returned from this method is no longer directly accessible to apps. Apps can continue to access content stored on shared/external storage by migrating to alternatives such as Context#getExternalFilesDir(String), MediaStore, or Intent#ACTION_OPEN_DOCUMENT.
getExternalFilesDir(null)
将 return 您的应用程序存储文件夹位于(内部存储)/Android/data/your.app.name/file/
如果您想访问某些 OS 定义的文件夹,您只需传递此处定义的环境常量:
这里
https://developer.android.com/reference/android/os/Environment
在 "Fields" 部分下。
例如。下载量为:getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS)
这是 Android-Q 中引入的隐私限制。当应用程序以 API 29 为目标并且从 getExternalStorageDirectory 方法返回的路径不再可供应用程序直接访问时,直接访问 shared/external 存储设备将被弃用。使用特定于应用程序的目录写入和读取文件。
默认情况下,针对 Android 10 及更高版本的应用会提供 scoped access into external storage 或分区存储。此类应用可以在外部存储设备中查看以下类型的文件,而无需请求任何与存储相关的用户权限:
- 应用特定目录中的文件,使用 getExternalFilesDir().
访问
- 应用从 media store 创建的照片、视频和音频剪辑。
我正在尝试在 phone 的内部存储中创建一个文件夹,但无论我做什么都无法创建它
我尝试过的事情:
正在从计算机上拔下 phone
为 API 23+
在清单中和以编程方式设置权限
我能找到的文件夹的每个变体: Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS) Environment.getDataDirectory() 等..
在每篇文章或文章的变体中搜索类似问题
尝试了 mkdir() 和 mkdirs() 的两种变体
选中phone如果文件夹存在
此代码也绑定到一个按钮,因此在我第二次按下它时应该已经授予了权限请求。
File sdir = new File (Environment.getExternalStorageDirectory().getpath(), "/DBTEST/");
String[] PERMISSIONS_STORAGE = {
Manifest.permission.WRITE_EXTERNAL_STORAGE
};
ActivityCompat.requestPermissions(MainActivity.this, PERMISSIONS_STORAGE, 1);
System.out.println("DIRECTORY CREATED: " + sdir.mkdirs());
System.out.println("EXISTS: " + sdir.exists());
System.out: DIRECTORY CREATED: false
System.out: EXISTS: false
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="com.example.testM">
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
尝试更改此行:
File sdir = new File (Environment.getExternalStorageDirectory().getpath(), "/DBTEST/");
到
File sdir = new File (Environment.getExternalFilesDir(null) + "/DBTEST/");
根据开发者文档:
getExternalStorageDirectory() - This method was deprecated in API level 29. To improve user privacy, direct access to shared/external storage devices is deprecated. When an app targets Build.VERSION_CODES.Q, the path returned from this method is no longer directly accessible to apps. Apps can continue to access content stored on shared/external storage by migrating to alternatives such as Context#getExternalFilesDir(String), MediaStore, or Intent#ACTION_OPEN_DOCUMENT.
getExternalFilesDir(null)
将 return 您的应用程序存储文件夹位于(内部存储)/Android/data/your.app.name/file/
如果您想访问某些 OS 定义的文件夹,您只需传递此处定义的环境常量:
这里
https://developer.android.com/reference/android/os/Environment
在 "Fields" 部分下。
例如。下载量为:getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS)
这是 Android-Q 中引入的隐私限制。当应用程序以 API 29 为目标并且从 getExternalStorageDirectory 方法返回的路径不再可供应用程序直接访问时,直接访问 shared/external 存储设备将被弃用。使用特定于应用程序的目录写入和读取文件。
默认情况下,针对 Android 10 及更高版本的应用会提供 scoped access into external storage 或分区存储。此类应用可以在外部存储设备中查看以下类型的文件,而无需请求任何与存储相关的用户权限:
- 应用特定目录中的文件,使用 getExternalFilesDir(). 访问
- 应用从 media store 创建的照片、视频和音频剪辑。