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: 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);
}

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 :


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

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;
}

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.


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;
}
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.