我可以在Android中获得其他应用程序的可用屏幕方向吗?

时间:2017-08-28 06:34:47

标签: android android-activity screen-orientation

我计划在Android中开发屏幕定位服务,以允许在某些手机中颠倒肖像。例如我的是Nexus6,不能从自动旋转上下颠倒

我正在使用其他旋转控制应用。它缺少我需要的一个功能

我想允许来自传感器的力旋转。但是应用程序的首选方向限制为纵向或横向。如果应用程序设计为纵向模式,它可以是0或180度而不是90或270,反之亦然

我使用的所有应用都无法设置。当传感器向下对齐并且结果非常难看时,它会强制横向应用程序为纵向

要做到这一点,我认为我需要得到ApplicationInfo或类似的东西,并获得应用程序在其清单中设置的“android:screenOrientation”的值

有可能吗?

PS。这是我想要开发的服务样本

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

2 个答案:

答案 0 :(得分:4)

您可以阅读其他应用的清单文件:

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);

答案 1 :(得分:1)

在Activity中的AndroidMaifest中使用此功能 机器人:screenOrientation = “传感器”