Cómo crear directorio automáticamente en tarjeta SD
Estoy intentando guardar mi archivo en la siguiente ubicación
FileOutputStream fos = new FileOutputStream("/sdcard/Wallpaper/"+fileName);
Pero estoy recibiendo la excepción java.io.FileNotFoundException
Sin embargo, cuando pongo el camino como "/sdcard/"
funciona.
Ahora estoy asumiendo que no soy capaz de crear directorio automáticamente de esta manera.
- Subir archivos desde android a wcf
- Subir archivos grandes desde android a c # WCF Rest Service
- No se pudo actualizar un archivo en la carpeta de recursos de la aplicación de Android
- Android: ¿cómo obtener una lista drectory ordenada por nombre o por fecha descendente?
- Adjuntar archivo del almacenamiento interno al correo electrónico
¿Puede alguien sugerir cómo crear un directory and sub-directory
usando código?
- Guardar archivo en el teléfono en lugar de tarjeta SD
- ¿Cómo dejo que un usuario suba archivos al almacenamiento interno?
- ¿Cómo obtener acceso a todas las tarjetas SD, utilizando la nueva Lollipop API?
- Problema de lista de archivos de Android 4.4
- En aplicaciones de Android, ¿cuál es el papel de "R.java"?
- Cómo leer un archivo de texto seleccionado de sdcard en android
- Abrir archivo PDF de Android
- Java File.lastModified devuelve cambios de valor si cambia el huso horario?
Si crea un objeto File que envuelve el directorio de nivel superior, puede llamar al método mkdirs () para crear todos los directorios necesarios. Algo como:
// create a File object for the parent directory File wallpaperDirectory = new File("/sdcard/Wallpaper/"); // have the object build the directory structure, if needed. wallpaperDirectory.mkdirs(); // create a File object for the output file File outputFile = new File(wallpaperDirectory, filename); // now attach the OutputStream to the file object, instead of a String representation FileOutputStream fos = new FileOutputStream(outputFile);
Nota: Podría ser aconsejable usar Environment.getExternalStorageDirectory () para obtener el directorio "Tarjeta SD", ya que esto podría cambiar si aparece un teléfono que tiene algo distinto de una tarjeta SD (como flash incorporado, IPhone). De cualquier manera, debe tener en cuenta que debe comprobar para asegurarse de que realmente está allí como la tarjeta SD puede ser eliminado.
ACTUALIZACIÓN: Desde el Nivel 4 de API (1.6) también tendrá que solicitar el permiso. Algo así (en el manifiesto) debería funcionar:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
Tenía el mismo problema y sólo quería añadir que AndroidManifest.xml también necesita este permiso:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
Esto es lo que funciona para mí.
uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"
En su manifiesto y el código abajo
public static boolean createDirIfNotExists(String path) { boolean ret = true; File file = new File(Environment.getExternalStorageDirectory(), path); if (!file.exists()) { if (!file.mkdirs()) { Log.e("TravellerLog :: ", "Problem creating Image folder"); ret = false; } } return ret; }
En realidad usé parte de @fiXedd asnwer y funcionó para mí:
//Create Folder File folder = new File(Environment.getExternalStorageDirectory().toString()+"/Aqeel/Images"); folder.mkdirs(); //Save the path as a string value String extStorageDirectory = folder.toString(); //Create New file and name it Image2.PNG File file = new File(extStorageDirectory, "Image2.PNG");
Asegúrese de que está utilizando mkdirs () no mkdir () para crear la ruta completa
Con la API 8 y superior, la ubicación de la tarjeta SD ha cambiado. @ La respuesta de fiXedd es buena, pero para un código más seguro, debes usar Environment.getExternalStorageState()
para comprobar si el medio está disponible. A continuación, puede utilizar getExternalFilesDir()
para navegar hasta el directorio que desee (suponiendo que esté utilizando API 8 o superior).
Puede leer más en la documentación del SDK .
Asegúrese de que el almacenamiento externo esté presente: http://developer.android.com/guide/topics/data/data-storage.html#filesExternal
private boolean isExternalStoragePresent() { boolean mExternalStorageAvailable = false; boolean mExternalStorageWriteable = false; String state = Environment.getExternalStorageState(); if (Environment.MEDIA_MOUNTED.equals(state)) { // We can read and write the media mExternalStorageAvailable = mExternalStorageWriteable = true; } else if (Environment.MEDIA_MOUNTED_READ_ONLY.equals(state)) { // We can only read the media mExternalStorageAvailable = true; mExternalStorageWriteable = false; } else { // Something else is wrong. It may be one of many other states, but // all we need // to know is we can neither read nor write mExternalStorageAvailable = mExternalStorageWriteable = false; } if (!((mExternalStorageAvailable) && (mExternalStorageWriteable))) { Toast.makeText(context, "SD card not present", Toast.LENGTH_LONG) .show(); } return (mExternalStorageAvailable) && (mExternalStorageWriteable); }
Me enfrenté al mismo problema. Hay dos tipos de permisos en Android:
- Peligroso (acceso a contactos, escritura en almacenamiento externo …)
- Normal (los permisos normales son aprobados automáticamente por Android mientras que los permisos peligrosos deben ser aprobados por los usuarios de Android).
Esta es la estrategia para obtener permisos peligrosos en Android 6.0
- Compruebe si tiene el permiso concedido
- Si ya se ha concedido el permiso a su aplicación, continúe y realice normalmente.
- Si su aplicación aún no tiene el permiso, pida al usuario que apruebe
- Escucha la aprobación del usuario en
onRequestPermissionsResult
Aquí está mi caso: Tengo que escribir en el almacenamiento externo.
En primer lugar, compruebo si tengo el permiso:
... private static final int REQUEST_WRITE_STORAGE = 112; ... boolean hasPermission = (ContextCompat.checkSelfPermission(activity, Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED); if (!hasPermission) { ActivityCompat.requestPermissions(parentActivity, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, REQUEST_WRITE_STORAGE); }
A continuación, compruebe la aprobación del usuario:
@Override public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); switch (requestCode) { case REQUEST_WRITE_STORAGE: { if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { //reload my activity with permission granted or use the features what required the permission } else { Toast.makeText(parentActivity, "The app was not allowed to write to your storage. Hence, it cannot function properly. Please consider granting it this permission", Toast.LENGTH_LONG).show(); } } } }
Yo estaba enfrentando el mismo problema, incapaz de crear el directorio en Galaxy S, pero fue capaz de crear con éxito en Nexus y Samsung Droid. Cómo lo fijé era agregando la línea siguiente del código:
File dir = new File(Environment.getExternalStorageDirectory().getPath()+"/"+getPackageName()+"/"); dir.mkdirs();
No olvide asegurarse de que no tiene caracteres especiales en sus nombres de archivo / carpeta. Me sucedió con ":" cuando estaba estableciendo nombres de carpeta usando variables (s)
Caracteres no permitidos en los nombres de archivo / carpeta
Unesdoc.unesco.org unesdoc.unesco.org
U puede encontrar este código útil en tal caso.
El siguiente código elimina todos los ":" y los reemplaza con "-"
//actualFileName = "qwerty:asdfg:zxcvb" say... String[] tempFileNames; String tempFileName =""; String delimiter = ":"; tempFileNames = actualFileName.split(delimiter); tempFileName = tempFileNames[0]; for (int j = 1; j < tempFileNames.length; j++){ tempFileName = tempFileName+" - "+tempFileNames[j]; } File file = new File(Environment.getExternalStorageDirectory(), "/MyApp/"+ tempFileName+ "/"); if (!file.exists()) { if (!file.mkdirs()) { Log.e("TravellerLog :: ", "Problem creating Image folder"); } }
File sdcard = Environment.getExternalStorageDirectory(); File f=new File(sdcard+"/dor"); f.mkdir();
Esto creará una carpeta llamada dor en su sdcard. A continuación, para buscar el archivo de eg- filename.json que se inserta manualmente en la carpeta dor . Me gusta:
File file1 = new File(sdcard,"/dor/fitness.json"); ....... .....
<Uses-permission android: name = "android.permission.WRITE_EXTERNAL_STORAGE" />
Y no olvide añadir código en el manifiesto
//Create File object for Parent Directory File wallpaperDir = new File(Environment.getExternalStorageDirectory().getAbsoluteFile() +File.separator + "wallpaper"); if (!wallpaperDir.exists()) { wallpaperDir.mkdir(); } File out = new File(wallpaperDir, wallpaperfile); FileOutputStream outputStream = new FileOutputStream(out);
Completando el puesto de Vijay …
Manifiesto
uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"
Función
public static boolean createDirIfNotExists(String path) { boolean ret = true; File file = new File(Environment.getExternalStorageDirectory(), path); if (!file.exists()) { if (!file.mkdirs()) { Log.e("TravellerLog :: ", "Problem creating Image folder"); ret = false; } } return ret; }
Uso
createDirIfNotExists("mydir/"); //Create a directory sdcard/mydir createDirIfNotExists("mydir/myfile") //Create a directory and a file in sdcard/mydir/myfile.txt
Puede comprobar si hay errores
if(createDirIfNotExists("mydir/")){ //Directory Created Success } else{ //Error }
Esto hará que la carpeta en sdcard con nombre de carpeta que usted proporciona.
File file = new File(Environment.getExternalStorageDirectory().getAbsolutePath() + "/Folder name"); if (!file.exists()) { file.mkdirs(); }
Puede utilizar / sdcard / en lugar de Environment.getExternalStorageDirectory ()
private static String DB_PATH = "/sdcard/Android/data/com.myawesomeapp.app/"; File dbdir = new File(DB_PATH); dbdir.mkdirs();
ivmage.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub Intent i = new Intent( Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI); startActivityForResult(i, RESULT_LOAD_IMAGE_ADD); } });`
- Android Studio Gradle acelerar la construcción
- Cómo configurar el tinte para una vista de imagen mediante programación en android?