Obtener directorio de aplicaciones

81

¿Alguien sabe cómo obtengo la ruta del directorio de mi aplicación? (por ejemplo /data/data/my.app.lication/)

Actualmente estoy usando este método: myActivity.getFilesDir().getParent();pero me parece una solución cuando hay una solución más simple. Además, el efecto secundario es la creación del filesdirectorio, que no es necesario.

Aclaración: Primero, gracias por las respuestas. Intento entender si ya existe un método que lo haga, no para otra solución.

MByD
fuente
@MByD: Por curiosidad, ¿qué estás tratando de hacer específicamente? No debería necesitar ese directorio. Por ejemplo, si desea trabajar con el directorio de la base de datos, use getDatabasePath(). O, si desea tener su propio directorio independiente de cualquier otra cosa, utilice getDir().
CommonsWare
@CommonsWare: tengo un objeto compartido que no está bajo mi control y que crea varias carpetas en la carpeta de mi paquete y necesito acceder a ellas. Me pregunto por qué la carpeta base no está disponible por algún método.
MByD
1
@MyByD: Dile a quien haya escrito ese objeto compartido que se examine la cabeza.
CommonsWare
1
@CommonsWare - ¿Qué tiene de malo eso? Además, mis padres me llamaron MByD por una razón, por favor no me llamen MyByD;)
MByD
2
@MByD: Perdón por el error tipográfico en el nombre. Con respecto al objeto compartido, si esperan que manipule esos archivos directamente, como mínimo deben proporcionarle métodos o algo para obtener esos directorios, en lugar de que tenga que piratear su propia solución. Por el contrario, si no esperan que manipule esos archivos directamente, entonces necesitan una API que le permita hacer lo que necesita hacer a través de su código. Si lo que está intentando hacer está fuera del alcance del objeto compartido, entonces quizás no debería intentar acceder a los archivos.
CommonsWare

Respuestas:

90
PackageManager m = getPackageManager();
String s = getPackageName();
PackageInfo p = m.getPackageInfo(s, 0);
s = p.applicationInfo.dataDir;

Si eclipse se preocupa por un no detectado NameNotFoundException, puede usar:

PackageManager m = getPackageManager();
String s = getPackageName();
try {
    PackageInfo p = m.getPackageInfo(s, 0);
    s = p.applicationInfo.dataDir;
} catch (PackageManager.NameNotFoundException e) {
    Log.w("yourtag", "Error Package name not found ", e);
}
Philip Sheard
fuente
3
aunque utilizo una solución diferente, encontré la suya realmente "limpia"
MByD
2
Esto le da la ruta del APK, sourceDires un nombre erróneo desafortunado. dataDirdebería ser lo que estás buscando.
orip
2
Devuelve el directorio de la aplicación, que es lo que solicitó la pregunta. Intente leer la pregunta correctamente antes de votar en contra.
Philip Sheard
Probé esta implementación y eclipse me dijo que hay una excepción no detectada: tipo de excepción no controlada PackageManager.NameNotFoundException
m-ric
Vea mi respuesta a continuación, que es una simple línea.
James Wald
20

tengo esto

String appPath = App.getApp().getApplicationContext().getFilesDir().getAbsolutePath();

desde aqui :

davibq
fuente
2
getFilesDir devuelve un subdirectorio de dataDir
njzk2
9
Tómese un tiempo para leer la pregunta que está respondiendo. El mecanismo getFilesDir () ya fue propuesto y rechazado como indeseable en el texto de la pregunta. Además, como lo señaló njzk2, no devuelve el resultado deseado a menos que tome su directorio principal, como se hizo en la pregunta.
Chris Stratton
19

Solo usa esto en tu código

 context.getApplicationInfo().dataDir
RATHI
fuente
Funciona muy bien en Android 5.1, ¡gracias! Agradable y sencillo.
Joshua Pinter
¿Es lo mismo que llamar android.os.Environment.getDataDirectory().getAbsolutePath()?
Pierre
10

Para el paquete de aplicaciones de Android actual:

public String getDataDir(Context context) throws Exception {
    return context.getPackageManager().getPackageInfo(context.getPackageName(), 0).applicationInfo.dataDir;
}

Para cualquier paquete:

public String getAnyDataDir(Context context, String packageName) throws Exception {
    return context.getPackageManager().getPackageInfo(packageName, 0).applicationInfo.dataDir;
}
Jared Burrows
fuente
¿Puedo encontrar que una clase está dentro de un paquete o no?
Sunil Chaudhary
3

Si está intentando obtener acceso a un archivo, pruebe los métodos openFileOutput()y openFileInput()como se describe aquí . Abren automáticamente flujos de entrada / salida al archivo especificado en la memoria interna. Esto le permite omitir el directorio y los Fileobjetos por completo, lo cual es una solución bastante limpia.

Chris Thompson
fuente
Gracias, pero en realidad solo estoy tratando de entender si hay una función que devuelve la ruta del directorio de mi aplicación, la estoy usando mucho y mi solución actual me parece bastante fea.
MByD
@MByd, ah. ¡Lo tengo, lo siento, no fue lo que estabas buscando!
Chris Thompson
@MByD: Cuando dices "Lo uso mucho", ¿a qué te refieres? ¿Lo haces en muchos lugares de tu código ???
Squonk
@MisterSquank - Sí. Parece que se moverá a la clase util, pero aún así ...
MByD
Al igual que con los enfoques getFilesDir (), esto no accederá a la ruta deseada sino a un subdirectorio dentro de ella.
Chris Stratton
3

Basado en la solución de @jared-burrows. Para cualquier paquete, pero pasando Context como parámetro ...

public static String getDataDir(Context context) throws Exception {
    return context.getPackageManager()
            .getPackageInfo(context.getPackageName(), 0)
            .applicationInfo.dataDir;
}
Leonardo Cardoso
fuente