在安卓系统中,我能否获取其他应用程序可用的屏幕方向?

11

我有一个计划,在Android系统中开发屏幕方向服务,以允许一些手机倒立竖屏。比如我的Nexus6,无法从自动旋转中旋转到倒立状态。

我之前用过其他旋转控制应用程序,但缺少一个我需要的功能。

我想允许从传感器强制旋转,但仅限于应用程序的首选方向(portrait或landscape)。如果应用程序设计为portrait模式,则可以设置为0或180度,但不是90或270度,反之亦然。

所有我使用过的应用程序都不能实现这样的设置。它们强制横向应用程序变成纵向,当传感器向下对齐时,这样的结果是很丑陋的。

我认为需要获取ApplicationInfo或类似的内容,并获取其清单文件中设置的“android:screenOrientation”值才能做到这一点。

这可行吗?

PS. 这是我想开发的服务的示例:

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

2个回答

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错误...最难的部分(解码二进制XML)已完成,您只需修复异常问题。

然后您可以按照以下方式获取字符串:

String xml = AndroidXMLDecompress.decompressXML(binaryXml);

1
我还没有测试过这个,但在赏金到期之前,我会相信你的。 - Thaina Yu
我很感激!不用担心,它能正常工作,就像我说的那样,唯一棘手的部分是将二进制XML转换为字符串XML。 - Omar Aflak

1

在AndroidManifest的Activity中使用: android:screenOrientation="sensor"


1
抱歉,我觉得你误解了。我想编写一个服务,当打开其他应用程序时,可以控制安卓设备,而不是编写应用程序本身。 - Thaina Yu
1
不,没有办法做到这一点,除非你有源代码的访问权限。你能够做到的最接近的事情是通过使用屏幕叠加来检测屏幕上的项目,例如如果键盘处于活动状态,但这不能给你另一个Android应用程序的布局。 - Gordon developer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接