Получить каталог приложений

81

Кто-нибудь знает, как мне получить путь к каталогу моего приложения? (например /data/data/my.app.lication/)

В настоящее время я использую этот метод: myActivity.getFilesDir().getParent();но мне кажется, что это обходной путь, когда есть более простое решение. Также побочным эффектом является создание filesкаталога, в котором нет необходимости.

Уточнение: Первое - спасибо за ответы. Я пытаюсь понять, существует ли уже метод, который это делает, а не для другого обходного пути.

МБыД
источник
@MByD: Из любопытства, что конкретно вы пытаетесь сделать? Вам не понадобится этот каталог. Например, если вы хотите работать с каталогом базы данных, используйте getDatabasePath(). Или, если вам нужен собственный каталог, независимый от чего-либо еще, используйте getDir().
CommonsWare
@CommonsWare - у меня есть общий объект, который не находится под моим контролем, который создает несколько папок в моей папке пакета, и мне нужно получить к ним доступ. Мне просто интересно, почему базовая папка каким-то образом недоступна.
MByD 03
1
@MyByD: Скажите, чтобы тот, кто написал этот общий объект, проверил его голову.
CommonsWare
1
@CommonsWare - Что в этом плохого? Кроме того, родители назвали меня MByD по какой-то причине, пожалуйста, не называйте меня MyByD;)
MByD
2
@MByD: Извините за опечатку в названии. Что касается общего объекта, если они ожидают, что вы будете напрямую манипулировать этими файлами, они должны как минимум предоставить вам методы или что-то еще для получения этих каталогов, вместо того, чтобы вы взламывали свое собственное решение. И наоборот, если они не ожидают, что вы будете напрямую манипулировать этими файлами, им понадобится какой-то API, чтобы вы могли делать то, что нужно, через их код. Если то, что вы пытаетесь сделать, выходит за пределы области действия общего объекта, возможно, вам не следует пытаться получить доступ к файлам.
CommonsWare

Ответы:

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

Если eclipse беспокоится о непойманном NameNotFoundException, вы можете использовать:

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
хотя я использую другое решение, я нашел ваше действительно "чистым"
MByD
2
Это дает вам путь к APK, sourceDirк сожалению, неправильное название. dataDirдолжно быть то, что вы ищете.
orip 01
2
Он возвращает каталог приложения, о котором и спрашивается. Попробуйте правильно прочитать вопрос, прежде чем голосовать против.
Филип Шеард,
Я попробовал эту реализацию, и eclipse сказал мне, что есть неперехваченное исключение: Тип необработанного исключения PackageManager.NameNotFoundException
m-ric
Смотрите мой ответ ниже, который представляет собой простой однострочник.
Джеймс Уолд
20

Я получил это

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

отсюда :

Давибк
источник
2
getFilesDir возвращает поддиректорию dataDir
njzk2
9
Найдите время, чтобы прочитать вопрос, на который вы отвечаете. Механизм getFilesDir () уже был предложен и отклонен как нежелательный в самом тексте вопроса. Кроме того, как указано njzk2, он не возвращает желаемый результат, если вы не возьмете его родительский каталог, как это сделано в вопросе.
Крис Стрэттон,
19

Просто используйте это в своем коде

 context.getApplicationInfo().dataDir
Рати
источник
Отлично работает на Android 5.1, спасибо! Красиво и просто.
Джошуа Пинтер
Это то же самое, что звонить android.os.Environment.getDataDirectory().getAbsolutePath()?
Pierre
10

Для текущего пакета приложений Android:

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

Для любого пакета:

public String getAnyDataDir(Context context, String packageName) throws Exception {
    return context.getPackageManager().getPackageInfo(packageName, 0).applicationInfo.dataDir;
}
Джаред Берроуз
источник
могу ли я обнаружить, что класс находится внутри пакета или нет?
Сунил Чаудхари
3

Если вы пытаетесь получить доступ к файлу, попробуйте openFileOutput()и openFileInput()методы , как описано здесь . Они автоматически открывают потоки ввода / вывода для указанного файла во внутренней памяти. Это позволяет вам полностью обойти каталог и Fileобъекты, что является довольно чистым решением.

Крис Томпсон
источник
Спасибо, но на самом деле я просто пытаюсь понять, есть ли функция, которая возвращает мой путь к каталогу приложения, я использую ее много, и мое текущее решение выглядит для меня довольно уродливым.
MByD 03
@MByd, ах. Я понял, извини, это не то, что ты искал!
Крис Томпсон
@MByD: Что вы имеете в виду, когда говорите: «Я часто им пользуюсь»? Вы делаете это во многих местах вашего кода ???
Squonk
@MisterSquank - Да. Кажется, он перейдет в класс util, но все же ...
MByD 03
Как и в случае с getFilesDir (), это не будет обращаться к желаемому пути, а скорее к подкаталогу внутри него.
Крис Стрэттон,
3

На основе решения @ jared-burrows. Для любого пакета, но с передачей Context в качестве параметра ...

public static String getDataDir(Context context) throws Exception {
    return context.getPackageManager()
            .getPackageInfo(context.getPackageName(), 0)
            .applicationInfo.dataDir;
}
Леонардо Кардосо
источник