Andriod Settings

前言

公司開(kāi)發(fā) Android Launcher 項(xiàng)目匪傍,需要設(shè)置一些系統(tǒng)的屬性,比如說(shuō)修改系統(tǒng)語(yǔ)言設(shè)置观挎,修改輸入法琴儿,修改時(shí)間格式,修改時(shí)區(qū)等等嘁捷,因?yàn)槭且恍┫到y(tǒng)屬性造成,配置的時(shí)候都一些注意的要點(diǎn)。

修改系統(tǒng)語(yǔ)言設(shè)置

修改系統(tǒng)語(yǔ)言比較特殊雄嚣,需要用到一個(gè)叫作 ActivityManagerNative 類晒屎,這個(gè)類在 layoutlib.jar 中,它與 android.jar 是同一級(jí)別的缓升,不參與編譯進(jìn) apk 中鼓鲁,所以需要自己導(dǎo)入

  • android studo 的導(dǎo)入方法如下:
android {
  ...需寫(xiě)在 android 之后
}

dependencies {
  ...
    provided files(getLayoutLibPath())
  ...
}

tasks.withType(JavaCompile) {
  options.encoding = "UTF-8"
}

/**
 * get layoutlib.jar path
 * android.os.SystemProperties need it
 * must called after "android" definition
 */
def getLayoutLibPath() {
    return "${android.getSdkDirectory().getAbsolutePath()}" + "/platforms/" + android.compileSdkVersion + "/data/layoutlib.jar"
}

接下來(lái)就是修改語(yǔ)言的代碼

IActivityManager iManager;
try {
      iManager = ActivityManagerNative.getDefault();
      Configuration localConfiguration = iManager.getConfiguration();
      localConfiguration.locale = mInfos.get(position).getLocale();
      iManager.updateConfiguration(localConfiguration);
      BackupManager.dataChanged("com.android.providers.settings");
      finish();
      } catch (RemoteException e) {
      e.printStackTrace();
}
  • 這里的locale對(duì)象港谊,代表了一個(gè)特定的地理骇吭、政治和文化地區(qū)。在操作 Date歧寺、Calendar等表示日期/時(shí)間的對(duì)象時(shí)燥狰,經(jīng)常會(huì)用到。

  • 這里用到了 Configuration成福,對(duì)其進(jìn)行了修改碾局,就需要聲明權(quán)限

    <uses-permission android:name="android.permission.CHANGE_CONFIGURATION"/>
    
  • 同時(shí)因?yàn)檫@是系統(tǒng)級(jí)別的權(quán)限,普通的第三方應(yīng)用沒(méi)有權(quán)限使用奴艾,即使聲明了該權(quán)限也無(wú)法獲取該權(quán)限,需要聲明該應(yīng)用為系統(tǒng)應(yīng)用:需要在 AndroidManifest.xml 添加:

    android:sharedUserId="android.uid.system"
    

Android Settings

其它許多系統(tǒng)屬性的修改都在 Settings 應(yīng)用當(dāng)中進(jìn)行設(shè)置内斯,比如 wifi蕴潦,藍(lán)牙狀態(tài)像啼,等一些相關(guān)的系統(tǒng)屬性。這些屬性的數(shù)據(jù)主要保存在數(shù)據(jù)庫(kù) settings 中潭苞,而 settings 保存的位置在:/data/data/com.android.providers.settings/databases/settings.db忽冻。

我從自己機(jī)器中拉了一個(gè)出來(lái),上傳了堅(jiān)果云此疹,可以下載了看看僧诚。

settings數(shù)據(jù)庫(kù)堅(jiān)果云地址

主要的操作就是針對(duì)以下三張表:

表名 URI 備注
secure Settings.Secure content://settings/secure 安全性的用戶偏好系統(tǒng)設(shè)置,第三方APP有讀沒(méi)有寫(xiě)的權(quán)限
global Settings.Global content://settings/global 所有的編號(hào)設(shè)置蝗碎,對(duì)系統(tǒng)的所有用戶公開(kāi)湖笨,第三方APP有讀沒(méi)有寫(xiě)的權(quán)限
system Settings.system content://settings/system 包含各種各樣的用戶偏好系統(tǒng)設(shè)置

因?yàn)檫@是一個(gè)本應(yīng)用外的數(shù)據(jù)庫(kù),不能跨進(jìn)程和包直接訪問(wèn)蹦骑,就需要用到了內(nèi)容提供者ContentProvider和內(nèi)容解析者ContentResolver慈省。
跨進(jìn)程通信的ContentProvider

簡(jiǎn)短的概括一下就是,如果跨進(jìn)程訪問(wèn)數(shù)據(jù)眠菇,需要將這個(gè)數(shù)據(jù)通過(guò)ContentProvider共享出來(lái)边败,然后通過(guò)ContentResolver 訪問(wèn)到,執(zhí)行增刪改查的操作捎废。ContentProvider是一個(gè)抽象類笑窜,也就是繼承實(shí)現(xiàn)它,而 Android 中對(duì) settings.db 實(shí)現(xiàn)的就是 SettingsProvider登疗,當(dāng)中封裝了對(duì) settings.db 的操作排截,而framework有一個(gè)類對(duì)使用SettingsProvider進(jìn)行了封裝。

以Secure表為例

三個(gè)表的使用都差不多谜叹,就以secure為例匾寝。

獲取當(dāng)前輸入法
String defaultMethodId = Settings.Secure.getString(getContentResolver(), Settings.Secure.DEFAULT_INPUT_METHOD);
修改當(dāng)前輸入法

先在系統(tǒng)的配置信息中添加該輸入法,通過(guò) Settings.Secure.ENABLE_INPUT_METHODS 添加荷腊,如果有多個(gè)輸入法艳悔,這些字符串間以分號(hào)分隔,再將輸入法設(shè)置成默認(rèn)輸入法

Settings.Secure.putString(getContentResolver(), Settings.Secure.ENABLED_INPUT_METHODS, newInputMethodId);
Settings.Secure.putString(getContentResolver(), Settings.Secure.DEFAULT_INPUT_METHOD, newInputMethodId);
獲取日期格式
Settings.System.getString(getContentResolver(), Settings.System.DATE_FORMAT)
添加權(quán)限
<uses-permission android:name="android.permission.SET_TIME"/> <!--允許程序設(shè)置系統(tǒng)時(shí)間-->
<uses-permission android:name="android.permission.SET_TIME_ZONE" /> <!--允許程序設(shè)置系統(tǒng)時(shí)區(qū)-->
<uses-permission android:name="android.permission.WRITE_SECURE_SETTINGS"/> <!--允許應(yīng)用程序讀取或?qū)懭氚踩到y(tǒng)設(shè)置-->
<uses-permission android:name="android.permission.WRITE_SETTINGS" /> <!--允許應(yīng)用程序讀取或?qū)懭氚踩到y(tǒng)設(shè)置-->
Condition
  • 在獲取時(shí)區(qū)的時(shí)候女仰,Calendar對(duì)象需要重新獲取猜年,不然獲得時(shí)區(qū)值不會(huì)變
  • 在 Android6.0 之后,申請(qǐng) WRITE_SETTINGS 的權(quán)限疾忍,會(huì)出現(xiàn)閃退的情況乔外,異常為:java.lang.IllegalArgumentException : You can not keep your settings in the secure settings.
    • 原因:在 Android6.0 以后,WRITE_SETTINGS 權(quán)限的保護(hù)等級(jí)已經(jīng)由原來(lái)的 dangerous 升級(jí)為signatrue, 意味著APP需要用系統(tǒng)簽名或者成為系統(tǒng)預(yù)裝軟件才能夠申請(qǐng)?jiān)摍?quán)限一罩,并且還需要提示用戶跳轉(zhuǎn)到修改系統(tǒng)的設(shè)置界面去授予此權(quán)限杨幼。
    • 解決方案:要想申請(qǐng)?jiān)摍?quán)限,apk必須要打包,簽名打包差购,debug模式是不能申請(qǐng)?jiān)摍?quán)限的
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末四瘫,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子欲逃,更是在濱河造成了極大的恐慌找蜜,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,324評(píng)論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件稳析,死亡現(xiàn)場(chǎng)離奇詭異洗做,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)彰居,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,356評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén)诚纸,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人裕菠,你說(shuō)我怎么就攤上這事咬清。” “怎么了奴潘?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,328評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵旧烧,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我画髓,道長(zhǎng)掘剪,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,147評(píng)論 1 292
  • 正文 為了忘掉前任奈虾,我火速辦了婚禮夺谁,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘肉微。我一直安慰自己匾鸥,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,160評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布碉纳。 她就那樣靜靜地躺著勿负,像睡著了一般。 火紅的嫁衣襯著肌膚如雪劳曹。 梳的紋絲不亂的頭發(fā)上奴愉,一...
    開(kāi)封第一講書(shū)人閱讀 51,115評(píng)論 1 296
  • 那天,我揣著相機(jī)與錄音铁孵,去河邊找鬼锭硼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛蜕劝,可吹牛的內(nèi)容都是我干的檀头。 我是一名探鬼主播轰异,決...
    沈念sama閱讀 40,025評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼鳖擒!你這毒婦竟也來(lái)了溉浙?” 一聲冷哼從身側(cè)響起烫止,我...
    開(kāi)封第一講書(shū)人閱讀 38,867評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤蒋荚,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后馆蠕,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體期升,經(jīng)...
    沈念sama閱讀 45,307評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,528評(píng)論 2 332
  • 正文 我和宋清朗相戀三年互躬,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了播赁。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,688評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡吼渡,死狀恐怖容为,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情寺酪,我是刑警寧澤坎背,帶...
    沈念sama閱讀 35,409評(píng)論 5 343
  • 正文 年R本政府宣布,位于F島的核電站寄雀,受9級(jí)特大地震影響得滤,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜盒犹,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,001評(píng)論 3 325
  • 文/蒙蒙 一懂更、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧急膀,春花似錦沮协、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,657評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間趁仙,已是汗流浹背踢代。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,811評(píng)論 1 268
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留条获,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,685評(píng)論 2 368
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像洋魂,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,573評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容