2017-08-28 57 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應用程序的佈局。 –

相關問題