Отримати каталог додатків


81

Хтось знає, як мені отримати шлях до мого каталогу додатків? (наприклад /data/data/my.app.lication/)

На даний момент я використовую цей метод: myActivity.getFilesDir().getParent();але мені здається, що це обхідне рішення, коли є простіше рішення. Крім того, побічним ефектом є створення filesкаталогу, який є непотрібним.

Пояснення: Перше - Дякуємо за повторювачів. Я намагаюся зрозуміти, чи вже існує метод, який це робить, а не для іншого обходу.


@MByD: З цікавості, що конкретно ти намагаєшся зробити? Ви не повинні мати потреби в цьому каталозі. Наприклад, якщо ви хочете працювати з каталогом бази даних, використовуйте getDatabasePath(). Або, якщо ви хочете, щоб ваш власний каталог не залежав ні від чого іншого, використовуйте getDir().
CommonsWare

@CommonsWare - У мене є спільний об’єкт, який не знаходиться під моїм контролем, і який створює кілька папок у моїй папці з пакетами, і мені потрібно отримати до них доступ. Мені просто цікаво, чому якимось способом не доступна базова папка.
MByD

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;

Якщо затемнення турбується про невпійманого 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має бути тим, що ви шукаєте.
орип

2
Він повертає каталог програми, саме про це запитували. Спробуйте прочитати питання правильно, перш ніж голосувати проти.
Філіп Ширд

Я спробував цю реалізацію, і eclipse сказав мені, що існує невпійманий виняток: необроблений виняток типу PackageManager.NameNotFoundException
m-ric

Дивіться мою відповідь нижче - простий лайнер.
James Wald 02


20

я отримав це

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

звідси :


2
getFilesDir повертає піддиректорію dataDir
njzk2

9
Будь ласка, знайдіть час, щоб прочитати питання, на яке ви відповідаєте. Механізм getFilesDir () вже був запропонований і відхилений як небажаний у тексті самого запитання. Крім того, як зазначає njzk2, він не повертає бажаного результату, якщо ви не берете його батьківський каталог, як це зроблено у питанні.
Chris Stratton

19

Просто використовуйте це у своєму коді

 context.getApplicationInfo().dataDir

Чудово працює на Android 5.1, дякую! Приємно і просто.
Джошуа Пінтер

Це те саме, що дзвонити android.os.Environment.getDataDirectory().getAbsolutePath()?
П’єр,

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

@MByd, ах. Я зрозумів, вибачте, це було не те, що ви шукали!
Кріс Томпсон,

@MByD: Коли ти кажеш "Я багато використовую", що ти маєш на увазі? Ви робите це у багатьох місцях свого коду ???
Squonk

@MisterSquank - Так. Здається, він збирається перейти до класу util, але все ж ...
MByD

Як і підхід getFilesDir (), він не буде отримувати доступ до бажаного шляху, а скоріше до його підкаталогу.
Chris Stratton

3

На основі рішення @ jared-burrows. Для будь-якого пакету, але передача контексту як параметра ...

public static String getDataDir(Context context) throws Exception {
    return context.getPackageManager()
            .getPackageInfo(context.getPackageName(), 0)
            .applicationInfo.dataDir;
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.