2017-08-28 99 views
12

我有计划在android中开发屏幕方向服务,以允许在某些手机中倒置人像。例如我的Nexus6,不能从自动旋转上下颠倒我可以在android中获得其他应用程序的可用屏幕方向吗?

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

我想让传感器强制旋转。但应用程序的首选方向限制为纵向或横向。如果肖像模式的应用程序设计可以去0或180度,但不是90或270,反之亦然

我使用的所有应用程序都不能这样设置。当传感器向下对齐并且结果非常难看时,它强制横向应用成为肖像

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

这可能吗?

ps。这是服务的示例中,我想开发

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

回答

3

可以读取其他应用程序的清单文件:

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,没有工作,但在某些情况下......最困难的部分(binray XML解码)完成后,你就必须解决这个问题,除了引发IndexOutOfBounds错误。

然后你会得到的字符串是这样的:

String xml = AndroidXMLDecompress.decompressXML(binaryXml); 
+1

我还没有测试过这个,但是在奖赏结束之前,我会把你的信任放在你身上 – Thaina

+0

我明白了!不用担心它的工作,正如我所说的唯一棘手的部分是转换二进制XML - >字符串XML –

1

使用这AndroidMaifest在活动 机器人:screenOrientation =“传感器”

+1

很抱歉,但我想你误会。我想编写一个服务,在打开其他应用程序时控制Android设备,而不是编写应用程序本身 – Thaina

+1

不,没有办法做到这一点。除非你有权访问源代码。最接近的做法是通过使用屏幕覆盖来检测屏幕上的项目,例如,如果键盘处于活动状态,但无法为您提供另一个Android应用程序的布局。 –

相关问题