Android應用中有時為了實現某些特殊的功能或效果,往往需要使用一些谷歌隱藏的API(加有@hide標記的public類、方法或常量),例如PolicyManager。
使用Android隱藏的API主要有兩種辦法:1.利用Java反射機制,使用反射的方法得到隱藏API;2.使用源碼編譯時生成的全編譯過的classes.jar包。
舉例說明,下面的代碼如果直接使用會報錯。
1,使用Java反射機制,改為以下代碼,就可以正常使用了。
2,如果不想修改代碼,就需要使用第二種方法:導入全編譯的classes.jar包。編譯Android框架源碼後,將生成全編譯的classes.jar導入到工程中。使用Eclipse,Android工程添加library(BuildPath -> Add Libraries->User Library->New User Library),將.jar文件加入添加到library,同時勾選“SystemLibrary”選項,www.linuxidc.com 以避免產生“java.lang.OutOfMemoryError:Java Heap Space”錯誤。如果已經正確導入了jar庫,卻仍然找不到隱藏的API。原因可能是Buildclass path order不正確,即android.jar和classes.jar的導入順序不對,具體調節Buildclass path order,選擇Build Path-> Config Build Path->Order and Export,調整自定義的library與android.jar的順序。
此時,本文最開始的那段代碼不需要再做改動就可以生效了。
利用反射機制使用隱藏API的方法優點是靈活,能夠在不兼容的系統捕獲異常,而使程序不至於崩潰;缺點是過程太繁雜,而且對於隱藏類的繼承等很難實現。如果需要大量使用隱藏API,使用反射無疑會讓人厭煩。
通過導入全編譯的classes.jar包來實現對隱藏API的使用方法簡單,容易編程,就像是那些隱藏的API在SDK中變得可見了一樣,其缺點就是兼容性問題,希望使用者引起重視。
兩種方法各有利弊,請大家斟酌使用。一般來說,谷歌設置隱藏API的主要原因在於Android系統本身還在不斷的進化發展中,這些API可能還不夠成熟、穩定。因此除非特殊情況,應盡量減少對隱藏API的使用。