Anwendungsverzeichnis abrufen

81

Weiß jemand, wie ich den Pfad meines Anwendungsverzeichnisses erhalte? (zB /data/data/my.app.lication/)

Momentan verwende ich diese Methode: myActivity.getFilesDir().getParent();aber es scheint mir eine Problemumgehung zu sein, wenn es eine einfachere Lösung gibt. Der Nebeneffekt ist auch die Erstellung des filesVerzeichnisses, das nicht benötigt wird.

Klarstellung: Zuerst - Danke für die Antworten. Ich versuche zu verstehen, ob es bereits eine Methode gibt, die dies tut, und nicht für eine andere Problemumgehung.

MByD
quelle
@MByD: Was genau versuchst du aus Neugier? Sie sollten dieses Verzeichnis nicht benötigen. Wenn Sie beispielsweise mit dem Datenbankverzeichnis arbeiten möchten, verwenden Sie getDatabasePath(). Oder verwenden Sie, wenn Sie Ihr eigenes Verzeichnis unabhängig von anderen Elementen möchten getDir().
CommonsWare
@CommonsWare - Ich habe ein freigegebenes Objekt, das nicht unter meiner Kontrolle steht und mehrere Ordner unter meinem Paketordner erstellt, und ich muss darauf zugreifen. Ich frage mich nur, warum der Basisordner nicht auf irgendeine Weise verfügbar ist.
MByD
1
@MyByD: Sagen Sie jedem, der dieses gemeinsame Objekt geschrieben hat, dass er seinen Kopf untersuchen lassen soll.
CommonsWare
1
@ CommonsWare - Was ist daran so falsch? Auch meine Eltern nannten mich MByD aus einem Grund, bitte nennen Sie mich nicht MyByD;)
MByD
2
@ MByD: Entschuldigung für den Tippfehler. In Bezug auf das freigegebene Objekt müssen sie, wenn sie erwarten, dass Sie diese Dateien direkt bearbeiten, zumindest Methoden oder etwas angeben, um diese Verzeichnisse abzurufen, anstatt dass Sie Ihre eigene Lösung hacken müssen. Wenn sie hingegen nicht erwarten, dass Sie diese Dateien direkt bearbeiten, benötigen sie eine API, mit der Sie über ihren Code das tun können, was erforderlich ist. Wenn das, was Sie versuchen, weit außerhalb des Bereichs des freigegebenen Objekts liegt, sollten Sie möglicherweise nicht versuchen, auf die Dateien zuzugreifen.
CommonsWare

Antworten:

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

Wenn sich Eclipse Sorgen um einen Ungefangenen macht NameNotFoundException, können Sie Folgendes verwenden:

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
quelle
3
Obwohl ich eine andere Lösung verwende, fand ich Ihre wirklich "sauber"
MByD
2
Dies bringt Ihnen den APK-Pfad, sourceDirist eine unglückliche Fehlbenennung. dataDirsollte das sein, wonach du suchst.
Orip
2
Es gibt das Verzeichnis der Anwendung zurück, nach dem die Frage gestellt wurde. Versuchen Sie, die Frage richtig zu lesen, bevor Sie die Leute abstimmen.
Philip Sheard
Ich habe diese Implementierung ausprobiert und Eclipse hat mir mitgeteilt, dass es eine nicht erfasste Ausnahme gibt: Nicht behandelter Ausnahmetyp PackageManager.NameNotFoundException
m-ric
Siehe meine Antwort unten, die ein einfacher Einzeiler ist.
James Wald
20

Ich schaff das

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

von hier :

Davibq
quelle
2
getFilesDir gibt ein Unterverzeichnis von dataDir zurück
njzk2
9
Bitte nehmen Sie sich Zeit, um die Frage zu lesen, die Sie beantworten. Der Mechanismus getFilesDir () wurde bereits im Text der Frage selbst vorgeschlagen und als unerwünscht abgelehnt. Wie von njzk2 hervorgehoben, gibt es außerdem nicht das gewünschte Ergebnis zurück, es sei denn, Sie verwenden das übergeordnete Verzeichnis, wie in der Frage beschrieben.
Chris Stratton
19

Verwenden Sie dies einfach in Ihrem Code

 context.getApplicationInfo().dataDir
RATHI
quelle
Funktioniert hervorragend auf Android 5.1, danke! Schön und einfach.
Joshua Pinter
Ist das dasselbe wie anrufen android.os.Environment.getDataDirectory().getAbsolutePath()?
Pierre
10

Für das aktuelle Android-Anwendungspaket:

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

Für jedes Paket:

public String getAnyDataDir(Context context, String packageName) throws Exception {
    return context.getPackageManager().getPackageInfo(packageName, 0).applicationInfo.dataDir;
}
Jared Burrows
quelle
Kann ich feststellen, dass sich eine Klasse in einem Paket befindet oder nicht?
Sunil Chaudhary
3

Wenn Sie versuchen , Zugriff auf eine Datei zu erhalten, versuchen die openFileOutput()und openFileInput()Verfahren , wie sie hier . Sie öffnen automatisch Eingabe- / Ausgabestreams für die angegebene Datei im internen Speicher. Auf diese Weise können Sie das Verzeichnis und die FileObjekte insgesamt umgehen, was eine ziemlich saubere Lösung ist.

Chris Thompson
quelle
Danke, aber eigentlich versuche ich nur zu verstehen, ob es eine Funktion gibt, die meinen Anwendungsverzeichnispfad zurückgibt. Ich benutze sie häufig und meine aktuelle Lösung sieht für mich ziemlich hässlich aus.
MByD
@ MByd, ah. Tut mir leid, es war nicht das, wonach du gesucht hast!
Chris Thompson
@MByD: Wenn du sagst "Ich benutze es oft", was meinst du damit? Du machst es an vielen Stellen in deinem Code ???
Squonk
@MisterSquank - Ja. Es scheint, als würde es in die Util-Klasse gehen, aber immer noch ...
MByD
Wie bei den getFilesDir () -Ansätzen wird hierdurch nicht auf den gewünschten Pfad zugegriffen, sondern auf ein darin enthaltenes Unterverzeichnis.
Chris Stratton
3

Basierend auf der Lösung von @ jared-burrows. Für jedes Paket, aber Übergabe von Context als Parameter ...

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