Ответ 1
Вы можете прочитать файл манифеста другого приложения:
PackageManager pm = getPackageManager();
List<ApplicationInfo> apps = pm.getInstalledApplications(PackageManager.GET_META_DATA | PackageManager.GET_SHARED_LIBRARY_FILES);
for(ApplicationInfo app : apps){
try {
ZipFile apk = new ZipFile(app.publicSourceDir);
ZipEntry manifest = apk.getEntry("AndroidManifest.xml");
if (manifest != null){
byte[] binaryXml = toByteArray(apk.getInputStream(manifest));
// decode binary Xml
}
apk.close();
} catch (IOException e) {
e.printStackTrace();
}
}
public static byte[] toByteArray(InputStream in) throws IOException {
try {
byte[] buf = new byte[1024*8];
try (ByteArrayOutputStream bos = new ByteArrayOutputStream()) {
int len;
while ((len = in.read(buf)) != -1) {
bos.write(buf, 0, len);
}
return bos.toByteArray();
}
} finally {
in.close();
}
}
"Проблема" заключается в том, что вы получите двоичный xml, который не является просто строкой, преобразованной в массив байтов; это сжатый формат для xml файлов.
Вам нужно распаковать этот массив, чтобы получить String
, затем вы можете его проанализировать, чтобы получить значение screenOrientation
.
Я нашел этот GIST, который выполняет задание, но в некоторых случаях он вызывает ошибку IndexOutOfBounds
... Самая сложная часть (декодирование binray xml), вам просто нужно исправить проблему с исключением.
Тогда вы получите String следующим образом:
String xml = AndroidXMLDecompress.decompressXML(binaryXml);