Pobierz katalog aplikacji

81

Czy ktoś wie, jak uzyskać ścieżkę do katalogu mojej aplikacji? (np. /data/data/my.app.lication/)

Obecnie używam tej metody: myActivity.getFilesDir().getParent();ale wydaje mi się, że jest to obejście, gdy istnieje prostsze rozwiązanie. Efektem ubocznym jest również utworzenie fileskatalogu, który nie jest potrzebny.

Wyjaśnienie: Po pierwsze - dzięki za odpowiedzi. Próbuję zrozumieć, czy istnieje już metoda, która to robi, a nie inne obejście.

MByD
źródło
@MByD: Co konkretnie próbujesz zrobić z ciekawości? Nie powinieneś potrzebować tego katalogu. Na przykład, jeśli chcesz pracować z katalogiem bazy danych, użyj getDatabasePath(). Lub, jeśli chcesz mieć własny katalog niezależny od wszystkiego innego, użyj getDir().
CommonsWare
@CommonsWare - Mam udostępniony obiekt, który nie jest pod moją kontrolą, który tworzy kilka folderów w folderze mojego pakietu i muszę uzyskać do nich dostęp. Zastanawiam się tylko, dlaczego folder podstawowy nie jest dostępny jakąś metodą.
MByD
1
@MyByD: Powiedz każdemu, kto napisał ten udostępniony obiekt, aby zbadał głowę.
CommonsWare
1
@CommonsWare - Co w tym złego? Poza tym moi rodzice nie bez powodu nazywali mnie MByD, proszę nie nazywaj mnie MyByD;)
MByD
2
@MByD: Przepraszamy za literówkę w nazwie. Jeśli chodzi o obiekt współdzielony, jeśli oczekują, że będziesz manipulować tymi plikami bezpośrednio, muszą przynajmniej podać metody lub coś, aby uzyskać te katalogi, a nie musisz hakować własne rozwiązanie. I odwrotnie, jeśli nie oczekują, że będziesz manipulować tymi plikami bezpośrednio, potrzebują jakiegoś interfejsu API, który pozwoli ci zrobić to, co trzeba zrobić za pomocą ich kodu. Jeśli to, co próbujesz zrobić, wykracza daleko poza zakres udostępnionego obiektu, być może nie powinieneś próbować uzyskać dostępu do plików.
CommonsWare

Odpowiedzi:

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

Jeśli zaćmienie martwi się o nie złapany NameNotFoundException, możesz użyć:

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
źródło
3
chociaż używam innego rozwiązania, znalazłem twoje naprawdę „czyste”
MByD
2
To daje ci ścieżkę APK, sourceDirjest niefortunnym błędnym nazwaniem. dataDirpowinno być tym, czego szukasz.
orip
2
Zwraca katalog aplikacji, o co chodzi w pytaniu. Przeczytaj poprawnie pytanie, zanim oddasz głos.
Philip Sheard
Wypróbowałem tę implementację i eclipse powiedziało mi, że istnieje nieprzechwycony wyjątek: Nieobsłużony typ wyjątku PackageManager.NameNotFoundException
m-ric
Zobacz moją odpowiedź poniżej, która jest prostą linijką.
James Wald,
20

mam to

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

stąd :

davibq
źródło
2
getFilesDir zwraca podkatalog dataDir
njzk2
9
Poświęć trochę czasu na przeczytanie pytania, na które odpowiadasz. Mechanizm getFilesDir () został już zaproponowany i odrzucony jako niepożądany w tekście samego pytania. Dodatkowo, jak wskazał njzk2, nie zwraca pożądanego wyniku, chyba że weźmiesz jego katalog nadrzędny, jak to zrobiono w pytaniu.
Chris Stratton,
19

Po prostu użyj tego w swoim kodzie

 context.getApplicationInfo().dataDir
RATHI
źródło
Działa świetnie na Androidzie 5.1, dzięki! Ładnie i prosto.
Joshua Pinter
Czy to to samo co dzwonienie android.os.Environment.getDataDirectory().getAbsolutePath()?
Pierre
10

W przypadku aktualnego pakietu aplikacji na Androida:

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

Dla każdego pakietu:

public String getAnyDataDir(Context context, String packageName) throws Exception {
    return context.getPackageManager().getPackageInfo(packageName, 0).applicationInfo.dataDir;
}
Jared Burrows
źródło
czy mogę stwierdzić, że klasa jest wewnątrz paczki, czy nie?
Sunil Chaudhary
3

Jeśli próbujesz uzyskać dostęp do pliku, wypróbuj metody openFileOutput()i openFileInput()opisane tutaj . Automatycznie otwierają strumienie wejścia / wyjścia do określonego pliku w pamięci wewnętrznej. Pozwala to Filecałkowicie ominąć katalog i obiekty, co jest całkiem czystym rozwiązaniem.

Chris Thompson
źródło
Dzięki, ale tak naprawdę próbuję tylko zrozumieć, czy istnieje funkcja, która zwraca ścieżkę do katalogu mojej aplikacji, często jej używam, a moje obecne rozwiązanie wygląda dla mnie dość brzydko.
MByD
@MByd, ah. Mam cię, przepraszam, że to nie było to, czego szukałeś!
Chris Thompson,
@MByD: Kiedy mówisz „Używam go często”, co masz na myśli? Robisz to w wielu miejscach w swoim kodzie ???
Squonk
@MisterSquank - Tak. Wygląda na to, że przejdzie do klasy
użytkowej
Podobnie jak w przypadku podejść getFilesDir (), nie spowoduje to uzyskania dostępu do żądanej ścieżki, ale raczej do jej podkatalogu.
Chris Stratton,
3

Oparty na rozwiązaniu @ jared-burrows. Dla dowolnego pakietu, ale przekazując Context jako parametr ...

public static String getDataDir(Context context) throws Exception {
    return context.getPackageManager()
            .getPackageInfo(context.getPackageName(), 0)
            .applicationInfo.dataDir;
}
Leonardo Cardoso
źródło