Могу ли я получить другую ориентацию экрана на экране в андроиде?

У меня есть план разработки службы ориентации экрана в андроиде, чтобы можно было переворачивать портрет в каком-то телефоне. Например, шахта Nexus6 не может вращаться вверх ногами от автоматического вращения

Я использовал другое приложение управления поворотом. И мне не хватает одной функции, которая мне нужна

Я хочу разрешить вращение силы от датчика. Но ограничивайте ориентацию портрета или пейзажа предпочтительной ориентацией приложения. Если дизайн приложения для портретного режима может идти 0 или 180 градусов, но не 90 или 270 и наоборот,

Все приложение, которое я использовал, не может быть таким. Это вынуждает ландшафтное приложение быть портретом, когда датчик выравнивается вниз, и результат был таким уродливым.

Для этого я думаю, что мне нужно получить ApplicationInfo или что-то подобное и получить значение "android: screenOrientation", которое было установлено в манифесте

Возможно ли это?

пс. Это образец сервиса, который я хочу разработать

https://play.google.com/store/apps/details?id=com.pranavpandey.rotation&hl=en

Ответ 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);

Ответ 2

Используйте это в AndroidMaifest в действии Android: screenOrientation = "датчик"