В настоящее время я создаю приложение для управления файлами, которое позволяет пользователю просматривать файловую систему своего устройства. Пользователь запускается в корневом каталоге /
своего устройства, но может просматривать любое местоположение, которое они хотят, например, внутреннюю флеш-память или SD-карту.
Одним из важнейших требований этого приложения является предоставление пользователю возможности создавать новые папки в любом месте. Функция, подобная этой, была бы очень полезной для приложения. Однако метод File#mkdir()
вообще не работает в каталоге SD-карты.
Я добавил соответствующие разрешения для файла манифеста. Я также написал тест, чтобы узнать, какие каталоги (все из которых существуют на моем устройстве Lollipop 5.0) позволяют создать новую папку. Из моих наблюдений File#mkdir()
работает только во внутреннем каталоге флэш-памяти.
Примечание: не путайте Environment#getExternalStorageDirectory()
с местоположением SD-карты, как объясняется в этой статье. Также на Lollipop 5.0 я считаю, что /storage/emulated/0/
и /storage/sdcard0/
относятся к внутренней флэш-памяти, а /storage/emulated/1/
и /storage/sdcard1/
относятся к SD-карте (что, по крайней мере, верно для устройства, с которым я тестирую).
Как я могу создавать новые файлы и папки в областях вне внешнего пути хранения на устройствах без привязки к устройствам?
манифеста:
...
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
...
Тест:
...
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final String NEW_FOLDER_NAME = "TestFolder";
testPath(new File(Environment.getExternalStorageDirectory(), NEW_FOLDER_NAME));
testPath(new File("/storage/emulated/0/", NEW_FOLDER_NAME));
testPath(new File("/storage/emulated/1/", NEW_FOLDER_NAME));
testPath(new File("/storage/sdcard0/Download/", NEW_FOLDER_NAME));
testPath(new File("/storage/sdcard1/Pictures/", NEW_FOLDER_NAME));
}
private void testPath(File path) {
String TAG = "Debug.MainActivity.java";
String FOLDER_CREATION_SUCCESS = " mkdir() success: ";
boolean success = path.mkdir();
Log.d(TAG, path.getAbsolutePath() + FOLDER_CREATION_SUCCESS + success);
path.delete();
}
}
Вывод:
/storage/emulated/0/TestFolder mkdir() success: true
/storage/emulated/0/TestFolder mkdir() success: true
/storage/emulated/1/TestFolder mkdir() success: false
/storage/sdcard0/Download/TestFolder mkdir() success: true
/storage/sdcard1/Pictures/TestFolder mkdir() success: false