Cómo obtener el modo de permiso de archivo mediante programación en Java
Sé que es posible cambiar el modo de permiso de un archivo usando:
Runtime.getRuntime().exec( "chmod 777 myfile" );
.
- Cómo convertir una hora de GMT a EST
- Ocultar barra de estado de Android
- Programáticamente Creado Android ProgressBar (Círculo) Invisible En Xoom (Trabaja en Cualquier Parte!)
- Emulación de etiquetas RFID en el emulador de Android
- Echoprint codegen para Java / Android
Este ejemplo establece los bits de permiso en 777
. ¿Es posible establecer los bits de permiso a 777
mediante programación utilizando Java? ¿Se puede hacer esto a cada archivo?
- Aceleración de hardware OOM androide nativo heap
- ¿Cómo debo manejar los tiempos de espera del servidor y las respuestas de código de error a una entrada de http en la aplicación para Android?
- ¿Es posible establecer más de una comunicación bluetooth en android
- Cómo mantener un archivo jar externo, pero todavía uso de sus clases en mi proyecto de Android?
- Lectura de Android desde un flujo de entrada eficientemente
- Android JavaCV dilema, NoClassDefFoundError lanzado dentro del método 'dibujar' cuando se crea IplImage
- Filtrado de MatOfDMatch
- La adición de un día a un calendario en Android falla el 31
Uso de chmod en Android
Java no tiene soporte nativo para operaciones dependientes de la plataforma como chmod. Sin embargo, Android proporciona utilidades para algunas de estas operaciones a través de android.os.FileUtils. La clase FileUtils no forma parte del SDK público y, por lo tanto, no es compatible. Por lo tanto, utilizar esto en su propio riesgo:
public int chmod(File path, int mode) throws Exception { Class fileUtils = Class.forName("android.os.FileUtils"); Method setPermissions = fileUtils.getMethod("setPermissions", String.class, int.class, int.class, int.class); return (Integer) setPermissions.invoke(null, path.getAbsolutePath(), mode, -1, -1); } ... chmod("/foo/bar/baz", 0755); ...
Android hace que sea difícil interactuar con otras aplicaciones y sus datos excepto a través de Intents. Los intentos no funcionarán para los permisos porque dependen de la aplicación que recibe la Intención de hacer / proporcionar lo que desea; Probablemente no fueron diseñados para decirle a nadie los permisos de sus archivos. Hay maneras a su alrededor, pero sólo cuando las aplicaciones se deseen para operar en la misma JVM. Así que cada aplicación sólo puede cambiar su archivo. Para obtener más detalles en el permiso de archivo, consulte http://docs.oracle.com/javase/1.4.2/docs/guide/security/permissions.html
Como se comentó anteriormente, android.os.FileUtils
ha cambiado y la solución publicada por Ashraf ya no funciona. El siguiente método debería funcionar en todas las versiones de Android (aunque utiliza reflexión y si un fabricante realiza cambios importantes esto puede no funcionar).
public static void chmod(String path, int mode) throws Exception { Class<?> libcore = Class.forName("libcore.io.Libcore"); Field field = libcore.getDeclaredField("os"); if (!field.isAccessible()) { field.setAccessible(true); } Object os = field.get(field); Method chmod = os.getClass().getMethod("chmod", String.class, int.class); chmod.invoke(os, path, mode); }
Obviamente, tendrá que poseer el archivo para realizar cualquier cambio de permiso.
Aquí está una solución usando Apache Commons.IO FileUtils , y los métodos apropiados en objetos File .
for (File f : FileUtils.listFilesAndDirs(new File('/some/path'), TrueFileFilter.TRUE, TrueFileFilter.TRUE)) { if (!f.setReadable(true, false)) { throw new IOException(String.format("Failed to setReadable for all on %s", f)); } if (!f.setWritable(true, false)) { throw new IOException(String.format("Failed to setWritable for all on %s", f)); } if (!f.setExecutable(true, false)) { throw new IOException(String.format("Failed to setExecutable for all on %s", f)); } }
Este es el equivalente de chmod -R 0777 /some/path
. Ajuste las llamadas set{Read,Writ,Execut}able
para implementar otros modos. (Actualizaré felizmente esta respuesta si alguien publica el código apropiado para hacer esto.)