Android create folder in internal root directory - java

I need to create a folder in internal memory root directory and create a file inside it, but cannot find the below code working.
String path = Environment.getRootDirectory().toString();
File mFolder = new File(path,"Folder");
if (!mFolder.exists()) {
boolean res = mFolder.mkdir();
}
And mkdir always return false. I already found getDataDirectory() and getFilesDir() but that I doesn't required. I need to create a directory where the internal memory root location(location we see first when we open internal memory)
Edit:
Root folder I mean the first location we see on internal memory open using file browser. Where I can see Download ,Pictures ,Android etc..

You should use getExternalStorageDirectory() and you should ask for write permissions to it.
But note getExternalStorageDirectory() was deprecated on android 29, that means you should use getExternalFilesDir(), getExternalCacheDir(), or getExternalMediaDir() instead if you target a newer android version depending on the contents of your files.
And you should ask for write permissions on the manifest (for old android versions, Build.VERSION.SDK_INT < 23) and ask for them on run time (for newer android versions, Build.VERSION.SDK_INT >= 23)
To check if the user has granted permission of external storage:
if (checkSelfPermission(android.Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) {
Log.v(TAG,"Permission granted");
//File write logic here
return true;
}
If the permission is not granted you should ask for it:
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, REQUEST_CODE);
and implement OnRequestPermissionResult to get the result callback.
All this info and more code can be found here https://developer.android.com/training/permissions/requesting

Try below code
File file = new File(Environment.getExternalStorageDirectory() + "/Folder");
if (!file.exists()) {
boolean res = file.mkdirs();
}
But Environment.getExternalStorageDirectory() It's deprecated for Android Q.
I hope this can help you!
Thank You.

I think you can't create a directory inside the internal storage of the device. Except you've a root access for the app.
You can only create the directory inside your app private folder within the following path String path = getFilesDir().
you can use like this below -
File mydir = context.getDir("mydirectory", Context.MODE_PRIVATE); //Creating an internal dir;
File fileWithinMyDir = new File(mydir, "myAwesomeFile"); //Getting a file within the dir.
FileOutputStream out = new FileOutputStream(fileWithinMyDir); //Use the stream as usual to write into the file.
getDir(StringName, int mode) method to create or access directories in internal storage.
For more information you can read about this - create directory

mkdir()creates only the demanded directory and will return false if some of the parent directories doesn't exist. Try checking if the directories exist(or why not) or use mkdirs() which additionally creates the missing directiories

Related

How to create a hidden folder i.e .MyFolder [(dot)MyFolder] in DCIM directory (Scoped Storage) Android Q

I want to create a hidden folder i.e .MyFolder [(dot)MyFolder] in DCIM directory. Here is my code:-
final String relativeLocation = Environment.DIRECTORY_DCIM+File.separator+".MyFolder/images";
ContentValues contentValues = new ContentValues();
contentValues.put(MediaStore.MediaColumns.DISPLAY_NAME,positionOfPager+".jpeg");
contentValues.put(MediaStore.MediaColumns.MIME_TYPE,"image/*");
contentValues.put(MediaStore.MediaColumns.RELATIVE_PATH,relativeLocation);
imageUri = context.getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,contentValues);
fos = (FileOutputStream) context.getContentResolver().openOutputStream(Objects.requireNonNull(imageUri));
inImage.compress(Bitmap.CompressFormat.JPEG,100,fos);
The problem here is that a folder is create with Hyphen symbol "_.MyFolder" i.e.[(Hypen)(dot)MyFolder] due to which the folder is not hidden. My app is creating lots of images which i dont want to show up in gallery to bother the user. Please help me out
Note:- I am implementing the code for scoped storage android 11
File file = new File(
Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM), ".MyFolder/images");
if ( ! file.existst() )
if ( !file.mkdirs() )
return;
Both on 10 and 11 you can use this code.
You can also create your files in this folder using classic file system paths.
No need for MediaStore. Worse: As soon as you use the MediaStore the MediaStore knows about your files and hence Gallery apps that use the MediaStore to list files.
For an Android Q device add android:requestLegacyExternalStorage="true" to application tag in manifest file.
But.... this hidden folder stuff will not prevent the media scanner to scan your files after some time. Also a .nomedia file will often not do now adays.

android : how to create new Directory in my package path

How can I make a new directory in the package that's stored in
storage/emulated/0/Android/data/getPackageName()/files/new-folder-name
so I can store converted videos and some pictures for my application?
I want to get the path of the installed package name and set it hardcore ;
If it's in the external storage, you can access a directory which is part of your app in a few ways:
Internal storage via Context#getDir(name, mode) if the files aren't big. This is always guaranteed
External storage via Context#getExternalFilesDir(name). This is not always guaranteed to be present.
Then from there you can create a new directory by:
File externalFilesDir = context.getExternalFilesDir("");
File file = new File(externalFilesDir, name);
//Create the new directory
boolean result = file.mkdir();
This way I detect the Dir of the App and use it to save files and so on.
AppName.getAppContext().getFilesDir();
or
AppName.getAppContext().getExternalFilesDir(null);
Don't forget to check for existence of the Dir.
getExternalFilesDir(Environment.DIRECTORY_DCIM).getPath() +
File.separator;

Android How to get the root directory from a file (path)

How do I get the root directory of any path. If i have file path
/storage/emulated/0/Android/media/com.google.android.talk/Ringtones/, what is the best way for me to return the root directory "storage".
Is the file path always in "/" format, is that safe to split the path based on the character "/" or is there a built in function that I can call?
I need to create a method to return the root files of all the audio files on the android phone.
Here are some paths that I have and I want to start with the root directory and then browse each directory with audio files, so is there any build in method that I can call that will return the first directory?
/storage/emulated/0/media/audio/ringtones/abc.mp3
/storage/emulated/0/Music/Various Artists/music.mp3
/storage/emulated/0/new/Artists/test.mp3
Thanks.
What you are suggesting would work. One way would be to use substring with indexOf.
rootPath = string.substring(0, string.indexOf("/"));
You can access the root folder from ".apk" as follows:
java.io.File dir = new java.io.File("/storage/emulated/0");
and, can create subfolders with:
void CreateDir() throws IOException {
java.io.File dir = new java.io.File("/storage/emulated/0/MyApplication");
dir.mkdir();
}
Normally, you must have write permissions to do this:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
But the problem starts with Android 10 (API level 29) and newer. Each path is null.
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.

Android File not being copied to SD card

I'm trying to copy a file that is located in the External storage directory into a directory that is in my SD Card. However, when I check to see if the file has successfully been copied, the file is not even created in the SD Card.
Am I missing something? Here is the code I have:
String sourcePath = Environment.getExternalStorageDirectory().getPath() + newFileName;
File source = new File(Environment.getExternalStorageDirectory().getPath(), newFileName);
String destinationPath = "/storage/external_SD";
File destination = new File(destinationPath, newFileName);
try {
if(!destination.exists()){
destination.mkdir();
}
FileUtils.copyFile(source, destination);
} catch (IOException e) {
e.printStackTrace();
}
The copyFile method is from an Apache library. Here is the link for it: https://commons.apache.org/proper/commons-io/apidocs/org/apache/commons/io/FileUtils.html
However, when I check to see if the file has successfully been copied, the file is not even created in the sd Card.
You do not have arbitrary filesystem-level access to removable storage on Android 4.4+.
Is there a work around for this?
That depends on what your objective is.
If you insist that you must be able to write to that specific path on arbitrary user devices... then, no, there is no supported workaround. After all, there is no /storage/external_SD on the vast majority of Android devices. Where and how device manufacturers choose to mount removable media is up to them and is an implementation detail that will vary.
If you relax that restriction, but insist that you must be able to write a file to the root directory of removable storage on arbitrary user devices... then, no, there is no supported workaround today. The N Developer Preview has a "Scoped Directory Access" feature that should allow this, but it will be several years before you can assume that an arbitrary user device will be running that version of Android or higher. Also, you do not get actual filesystem access, but rather a Uri (see the Storage Access Framework option, below).
Now, if you are more flexible about the precise location, you have other options:
You can use getExternalFilesDirs(), getExternalCacheDirs(), and getExternalMediaDirs(), all methods on Context. Note the plural form. If those return 2+ entries, the second and subsequent ones are locations on removable storage that you can read from and write to, no permissions required. However, you do not get to choose the exact path. And if the device has 2+ removable storage volumes, I'm not quite certain how you would help the user tell them apart.
You can use the Storage Access Framework and let the user choose where to put the file. The user is welcome to choose removable storage... or not. You get a Uri back, which you can use with ContentResolver and openOutputStream() to write your content. You can also take persistable Uri permissions so you can work with that file again in the future, assuming the user doesn't move or delete it behind your back.
If you want to copy to external storage then you need
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
The destinationPath you mentioned may not be accessible as it may belong to the private system folders or some other application folders. You can however use public folders like Pictures,Music, Videos,Downloads,etc. or create sub folders inside them -
String sourcePath = Environment.getExternalStorageDirectory().getPath() + newFileName;
File source = new File(Environment.getExternalStorageDirectory().getPath(), newFileName);
File destinationPath = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS, "/external_SD");
try {
if(!destinationPath.exists()){
destinationPath.mkdir();
}
File destination = new File(destinationPath, newFileName);
FileUtils.copyFile(source, destination);
} catch (IOException e) {
e.printStackTrace();
}

Make directory in android

Im trying to build a directory called "images" on the SD card on android. This is my code but its not working? Can anyone give me some advice?
File picDirectory = new File("mnt/sdcard/images");
picDirectory.mkdirs();
Update: Since Android 10,11 Storage updates, Google has restricted Storage access through standard programming language file operations.
For applications targeting only Android 10 (API 29) and above, you need to declare "requestLegacyExternalStorage="true" " in your android manifest file to use programming language based file operations.
<application
android:requestLegacyExternalStorage="true"
....>
==========
You want to be sure you are correctly finding the address of your SDCard, you can't be sure its always at any particular address. You will want to do the following!
File directory = new File(Environment.getExternalStorageDirectory()+File.separator+"images");
directory.mkdirs();
Let me know if this works for you!
You will also need the following line in your AndroidManifest.xml
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
I use this to know the result:
File yourAppDir = new File(Environment.getExternalStorageDirectory()+File.separator+"yourAppDir");
if(!yourAppDir.exists() && !yourAppDir.isDirectory())
{
// create empty directory
if (yourAppDir.mkdirs())
{
Log.i("CreateDir","App dir created");
}
else
{
Log.w("CreateDir","Unable to create app dir!");
}
}
else
{
Log.i("CreateDir","App dir already exists");
}
you can use this :
File directory = new File(Environment.getExternalStorageDirectory() + "/images");
directory.mkdirs();
Environment.getExternalStorageDirectory() is deprecated. So you should use this:
File directory = new File(this.getExternalFilesDir(null).getAbsolutePath() + "/YourDirectoryName");
directory.mkdirs();
One thing that is worth noting is if you always get false from the mkdirs(), try to unplug your device from pc, and see if it could create folders. At least I tried, it worked for me, currently I'm looking for ways to fix this problem.
To create specific root directory and its sub folder i use this code
String root = Environment.getExternalStorageDirectory().toString();//get external storage
File myDir = new File(root + "/grocery"+"/photo/technostark");//create directory and subfolder
File dir=new File(root + "/grocery"+"/data");//create subfolder
myDir.mkdirs();
dir.mkdirs();
To create file inside sd card you have to use Environment.getExternalStorageDirectory()
/**
* Creates a new directory inside external storage if not already exist.
*
* #param name The directory name
*/
public static void createNewDirectory(String name) {
// create a directory before creating a new file inside it.
File directory = new File(Environment.getExternalStorageDirectory(), name);
if (!directory.exists()) {
directory.mkdirs();
}
}
Following two important parameter which helps you to create directory
1. directory.mkdirs() :
Creates the directory named by this file, creating missing parent
directories if necessary.
2. directory.mkdir() :
Creates the directory named by this file, assuming its parents exist.
For more you can how getExternalStorageDirectory() works please see link
This should help.
First get the path of the external storage:
File root=Environment.getExternalStorageDirectory();
Then:
File picDirectory = new File(root.getAbsolutePath(), "mnt/sdcard/images");
picDirectory.mkdirs();

Categories