Доступ к Android: атрибут манифеста installLocation - PullRequest
6 голосов
/ 18 июня 2010

Я пытаюсь написать приложение для Android 2.2, которое найдет установленные приложения, которые можно переместить на SD-карту. Разрешение на это кодируется в файле AndroidManifest.xml в качестве атрибута корневого уровня " android: installLocation ". PackageInfo , кажется, имеет интерфейс для всего, кроме этого атрибута. Я могу открыть установленный apk и извлечь файл AndroidManifest.xml, но, похоже, он находится в каком-то двоичном формате кодировки, для которого некоторые случайные интернет-пользователи написали декодер, но это похоже на огромную работу.

Есть ли интерфейс, который мне не хватает?

Ответы [ 4 ]

12 голосов
/ 07 июля 2010

Как оказалось, хотя прямого вызова API для получения installLocation нет, я также не должен анализировать двоичный XML вручную, так как предоставленный XmlResourceParser работает с ним.Я думаю, там есть switch с одним case, который, вероятно, должен быть просто if.Ну что ж.Вы получаете точку.

0 голосов
/ 26 февраля 2015

Вы можете получить доступ к этому атрибуту в следующем примере:

PackageInfo packageInfo = context.getPackageManager().getPackageInfo(mPackageName, 0);
if (packageInfo.installLocation != PackageInfo.INSTALL_LOCATION_INTERNAL_ONLY) {
    .....
}

http://developer.android.com/reference/android/content/pm/PackageInfo.html#installLocation
был введен в API 21

Но это поле существует даже в Android 2.3 http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/2.3_r1/android/content/pm/PackageInfo.java/

0 голосов
/ 09 февраля 2012

В более старых API от 2007 года в классе PackageInfo были открытые поля, которые давали всю информацию о internalLocation и другую соответствующую информацию. По соображениям безопасности, я думаю, они избавились от этих удобных полей.

0 голосов
/ 19 июня 2010

Учитывая, что все остальные прямые атрибуты тега манифеста доступны в PackageInfo, я думаю, что вы правы, чтобы найти его там.

Я знаю, что его нет в документе, но вы все равно пробовали? Что-то вроде

PackageInfo pkg = ...;
String loc = pkg.installLocation();

Я знаю, что это, вероятно, очень наивно, учитывая, что документ может быть даже сгенерирован автоматически - и я не осмелился бы предложить это, если бы я мог попробовать это сам (завис на API 7 в настоящее время из-за отсталой ОС, которая больше не поддерживается в 8 )

Если это не сработает, я боюсь, что они просто упустили это из виду - я не могу представить, что они внезапно поместили бы это в другом месте. В этом случае вы, вероятно, застрянете при анализе самих манифестов.

...