Android SDK 版本號與版本名稱對照及一個編程小技巧 – Android移動開發技術文章_手機開發 Android移動開發教學課程

前幾天,為瞭解決一個問題,逆瞭一個小工具軟件。在這個過程發現瞭一些很有用的東西,在此跟大傢分享一下。首先聲明幾點:1、逆出來的代碼,需要大量的人工分析,我現在隻看瞭一點點;2、代碼不會公開,請不要向我要代碼,我怕麻煩~~~唉,做瞭這件壞事,內心忐~~~忑~~~啊!

一、通過編程實現對GPS的開關


  在Android手機和模擬器上有一個管理GPS開關的設置界面,如下:


    


  通過這個管理界面,我們可以對GPS進行管理,以實現我們的手機定位功能。曾經在網上搜集資料,希望找到通過代碼對GPS進行管理的源碼,也確實找到瞭一份代碼(稍後附上代碼),但是這份代碼在SDK 2.3及以上的版本中,始終不能運行。於是,產生瞭一個逆向的邪念~


  在分析上面提到的小工具之後,發現瞭其對GPS管理的功能模塊,經過簡單的分析之後,發現在Android SDK版本不同的情況下,對GPS控制的代碼還不一樣。首先附上在2.2版本及以前版本的GPS控制代碼:


/**
* 實現瞭一個GPS的開關,當前關閉則打開,當前打開則關閉
* 適用版本號:
* 1.6 / 2.1 / 2.2
*
* Uri.parse()的參數”custom:3″中的數字3的枚舉值如下:
* private static final int BUTTON_BLUETOOTH = 4;
* private static final int BUTTON_BRIGHTNESS = 1;
* private static final int BUTTON_GPS = 3;
* private static final int BUTTON_SYNC = 2;
* private static final int BUTTON_WIFI = 0;
*
*/
private void toggleGPS() {
// 當SDK版本號為2.3以下版本時
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.GINGERBREAD) {
Intent gpsIntent = new Intent();
gpsIntent.setClassName(“com.android.settings”,
“com.android.settings.widget.SettingsAppWidgetProvider”);
gpsIntent.addCategory(“android.intent.category.ALTERNATIVE”);
gpsIntent.setData(Uri.parse(“custom:3”));
try {
PendingIntent.getBroadcast(this, 0, gpsIntent, 0).send();
} catch (CanceledException e) {
e.printStackTrace();
}
}
}

  以上這段代碼,是利用Android平臺自帶的Widget插件對各種開關進行管理的。實現的是一個GPS的開關,如果當前GPS處於關閉狀態,則將其打開;如果GPS處於打開狀態,則將其關閉。


  大傢可能已經註意到函數體內部的第一行註釋“當SDK版本號為2.3一下版本時”,的確我們在這裡做瞭一個針對SDK版本的判斷。這一個判斷也是我們下一個小節要重點介紹的內容,暫時放在一邊,不要在這一節裡面跑偏瞭。


  在SDK 2.3及之後的版本中,那個小工具利用瞭SDK中的類Settings.Secure的一個靜態方法:


public static final void setLocationProviderEnabled (ContentResolver cr, String provider, boolean enabled)


Since: API Level 8

Thread-safe method for enabling or disabling a single location provider.

Parameters













cr


the content resolver to use


provider


the location provider to enable or disable


enabled


true if the provider should be enabled


  這個方法從API Level 8才開始提供,API Level 8對應的SDK版本是2.2,OK!那按照正常情況來說,這個函數應該是支持SDK2.3的。不妨寫個函數來試試。(這個代碼比較簡單,我就不再貼代碼瞭)結果卻令人意外,沒有給用戶分配權限”android.permission.WRITE_SETTINGS”;好嘛,那就加上權限;又提示沒有權限“android.permission.WRITE_SECURE_SETTINGS”,好說,再加上這個權限。接下來,見證悲催的時刻到瞭,還是提示沒有“android.permission.WRITE_SECURE_SETTINGS”的權限。明明已經加上瞭權限,為何還是提示。最後也是在各種大小論壇裡面查找資料,說是在2.3版本裡面,Google把這個權限完全鎖住瞭,好吧,悲劇瞭,除非你自己改Android代碼,否則就真的沒有別的辦法瞭。


  所以,在第一節結束的時候,提醒各位童鞋,如果想在SDK2.3版本管理GPS,還是乖乖的用你的Intent打開系統默認的管理GPS的Activity吧。


二、SDK版本對照


  為瞭下載android SDK的源碼,我到處找鏈接,好不容易一個鏈接,發現文件名後面怎麼還有一個類似英文名的東西?


                


  的確,像我這樣的初學者,是不知道這個英文單詞代表什麼意思的。但是在逆代碼的過程,發現瞭Android API給我們提供瞭這樣個類android.os.Build,在這個類中定義瞭Android SDK每個版本的版本號,版本名,以後其他一些信息,感興趣的同學可以去開發文檔中看看。


  這裡的英文單詞,就是每個SDK版本的版本名稱。


VERSION_CODES

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *