前言
本文講的是Settings相關(guān)開發(fā)經(jīng)常用到的地方,主要有WIFI、藍(lán)牙、系統(tǒng)或應(yīng)用升級、音量調(diào)節(jié)、亮度調(diào)節(jié)、多語言切換等。在不同Android版本也會進(jìn)行適配和踩坑提示,本文更多是一個指導(dǎo)性作用,擴(kuò)展一下寬度,對Android不同的知識點有個大概的了解,在需要使用的時候,知道如何下手。
WIFI設(shè)置
WIFI設(shè)置,主要是獲取WIFI列表,判斷WIFI強度,連接WIFI等...
這部分內(nèi)容非常繁瑣,每次我代碼寫到這里都好累,后續(xù)把它成AAR包,大家一起用.......
- 聲明權(quán)限
WIFI需要聲明的權(quán)限比較多:
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
Android 6.0以上需要動態(tài)申請權(quán)限:
requestPermissions(new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, REQUEST_PERMISSION_CODE);
本文對于大多數(shù)權(quán)限只是告知同學(xué)們需要注意相關(guān)權(quán)限,處理邏輯還是需要同學(xué)們根據(jù)自己業(yè)務(wù)需求進(jìn)行處理。畢竟文章只是指導(dǎo)性作用,而不是手把手教你實現(xiàn)需求。
- 判斷WIFI狀態(tài):
只有打開了WIFI,我們才可能進(jìn)行下一步操作:
wifiManager = (WifiManager) getActivity().getSystemService(Context.WIFI_SERVICE);
isWifiEnabled = wifiManager.isWifiEnabled();
如果WIFI處于關(guān)閉狀態(tài),可以自己用代碼打開或者提醒用戶打開WIFI,這里通過代碼打開:
//設(shè)置true為打開,false為關(guān)閉,操作結(jié)果
wifiManager.setWifiEnabled(true);
WIFI的打開和關(guān)閉結(jié)果,我們需要通過廣播來監(jiān)聽:
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction(WifiManager.WIFI_STATE_CHANGED_ACTION);
getActivity().registerReceiver(wifiReceiver, intentFilter);
- 掃描WIFI
如果WIFI處于打開狀態(tài),可以直接調(diào)用wifiManager.startScan()開始掃描WIIF列表,或者在收到WIFI打開廣播后掃描。startScan()在Android 9.0標(biāo)記為過時,但官網(wǎng)還沒有給出合適的接口調(diào)用??梢酝ㄟ^wifiManager.getScanResults()函數(shù)來獲取掃描結(jié)果,但需要在獲取掃描廣播完成后。
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction(WifiManager.WIFI_STATE_CHANGED_ACTION);
//添加此行
intentFilter.addAction(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION);
getActivity().registerReceiver(wifiReceiver, intentFilter);
wifiReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION)) {
list=wifiManger.getScanResults();
} else if (intent.getAction().equals(WifiManager.WIFI_STATE_CHANGED_ACTION)) {
if (wifiManager.getWifiState() == WifiManager.WIFI_STATE_ENABLED) {
wifiManager.startScan();
}
}
}
}
getScanResults()函數(shù)返回的持有ScanResult類型的集合,一般情況下,我們不會直接拿ScanResult來展示數(shù)據(jù),而是封裝自己的Bean。一個ScanResult元素代表著一個WIFI熱點,WIFI熱點可能存在重復(fù),所以記得去重。下面是ScanResult的一些常用屬性:
- SSID:WIFI名稱
- BSSID:WIFI的MAC地址
- capabilities:用來描述WIFI的加密方式,身份驗證,密碼管理,我們也常通過該屬性來判斷是否加密。
- level:接收信號強度RSSI
如果展示信號強度,一般不直接通過level來顯示,而是通過WifiManager#calculateSignalLevel(int rssi, int numLevels)計算結(jié)果來顯示,numLevels表示將信號強度分為幾層。
如果只是簡單判斷是否加密,可以通過下面判斷:
if (scanResult.capabilities.trim().equals("") ||
scanResult.capabilities.equals("[ESS]")) {
//未加密,不需要密碼
}
- 獲取已保存過的WIFI
在掃描結(jié)束后,可以通過下面代碼獲得已保存過的代碼:
List<WifiConfiguration> configurations = wifiManager.getConfiguredNetworks();
- 連接WIFI
連接WIFI分很多種類型,有密碼沒有密碼,不同的加密方式,是否已經(jīng)保存過的。
已經(jīng)保存過的WIFI
也就是要連接的WIFI存在第4步獲取到的configurations集合中。
WifiConfiguration configuration=configurations.get(0);
wifiManager.enableNetwork(configuration.networkId, true)
連接狀態(tài)我們可以通過enableNetwork()函數(shù)的返回值來處理,或者監(jiān)聽廣播WifiManager.NETWORK_STATE_CHANGED_ACTION。
未保存過的WIFI
對于連接沒有密碼的WIFI,我們通過下面代碼創(chuàng)建WifiConfiguration對象:
private WifiConfiguration createWifiConfigurationNoPassword(String wifiName) {
WifiConfiguration config = new WifiConfiguration();
config.allowedAuthAlgorithms.clear();
config.allowedGroupCiphers.clear();
config.allowedKeyManagement.clear();
config.allowedPairwiseCiphers.clear();
config.allowedProtocols.clear();
config.SSID = "\"" + wifiName + "\"";
config.wepKeys[0] = "";
config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);
config.wepTxKeyIndex = 0;
return config;
}
有密碼的可以通過下面代碼創(chuàng)建WifiConfiguration對象:
public static WifiConfiguration createWifiConfigurationNeedPassword(WifiInfo wifiInfo) {
WifiConfiguration config = new WifiConfiguration();
config.allowedAuthAlgorithms.clear();
config.allowedGroupCiphers.clear();
config.allowedKeyManagement.clear();
config.allowedPairwiseCiphers.clear();
config.allowedProtocols.clear();
config.SSID = "\"" + wifiInfo.getWifiName() + "\"";
String capabilities = wifiInfo.getCapabilities();
if (capabilities.toLowerCase().contains("wep")) // encryption wep
{
config.hiddenSSID = true;
config.wepKeys[0] = "\"" + wifiInfo.getPassword() + "\"";
config.allowedAuthAlgorithms.set(WifiConfiguration.AuthAlgorithm.SHARED);
config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP);
config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.TKIP);
config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP40);
config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP104);
config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);
config.wepTxKeyIndex = 0;
}
if (capabilities.toLowerCase().contains("wpa")) //encryption wpa
{
config.preSharedKey = "\"" + wifiInfo.getPassword() + "\"";
config.hiddenSSID = true;
config.allowedAuthAlgorithms.set(WifiConfiguration.AuthAlgorithm.OPEN);
config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.TKIP);
config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_PSK);
config.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.TKIP);
config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP);
config.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.CCMP);
config.status = WifiConfiguration.Status.ENABLED;
}
return config;
}
那如何知道WIFI是否需要密碼呢?就是再第3步掃描WIFI列表時,ScanResult的capabilities屬性。這個過程也是需要用戶輸入密碼的,不然密碼從何而來。這里的WifiInfo是對ScanResult的進(jìn)一步封裝而已。
最后就是連接WIFI了。
int netId = wifiManager.addNetwork(createWifiConfigurationNeedPassword(wifiInfo));
wifiManager.enableNetwork(wcgID, true)
經(jīng)典藍(lán)牙和低功耗藍(lán)牙
之前相關(guān)文章,這里不再重復(fù)了...
系統(tǒng)或應(yīng)用升級
在Android開發(fā),經(jīng)常需要進(jìn)行OTA升級,或者更新版本。
軟件下載
如果在Android較低版本建議使用DownloadManger系統(tǒng)類來下載,DownloadManger自動支持?jǐn)帱c續(xù)傳等,操作較簡單。前提是服務(wù)器支持?jǐn)帱c續(xù)傳。在Android 9.0版本,因為禁止明文HTTP傳輸,會報Cleartext HTTP traffic to xxx not permitted”問題,盡管配置了cleartextTrafficPermitted,大多數(shù)機器也是無效,需要谷歌更新補丁。
使用Android 9.0以上建議自己實現(xiàn)下載或者第三方庫,如:
implementation 'com.yaoxiaowen:download:1.4.1'
那么,如何使用DownloadManger來下載呢?
DownloadManager manager = (DownloadManager) getSystemService(Context.DOWNLOAD_SERVICE);
DownloadManager.Request request = new DownloadManager.Request(Uri.parse(strURL));
//如果不存在下載路徑,則建立該目錄
Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS).mkdir() ;
//設(shè)置文件的存儲路徑,還可以通過其他方法設(shè)置不同目錄
request.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS,"ota.zip");
//設(shè)置在通知通知欄顯示,還可以進(jìn)一步設(shè)置標(biāo)題,內(nèi)容等
request.setNotificationVisibility(View.VISIBLE);
//指定在WiFi網(wǎng)絡(luò)環(huán)境下載
request.setAllowedNetworkTypes(DownloadManager.Request.NETWORK_WIFI);
long netId = manager.enqueue(request);
可以通過DownloadManager.Request來配置一些信息,例如上文代碼設(shè)置在通知欄顯示和指定下載位置。
通過enqueue()函數(shù)將我們的請求發(fā)送給DownloadManger的隊列,返回值netId可以用來在后續(xù)查詢下載進(jìn)度等相關(guān)信息。
下載完成之后,會發(fā)出廣播通知,為此,我們需要監(jiān)聽廣播:
BroadcastReceiver downloadReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
// TODO: download complete
}
};
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction(DownloadManager.ACTION_DOWNLOAD_COMPLETE);
registerReceiver(downloadReceiver, intentFilter);
在收到下載完成廣播之后去升級系統(tǒng)。如果想在UI上顯示進(jìn)度條等信息,那么就需要查詢下載進(jìn)度了。
DownloadManager.Query query = new DownloadManager.Query();
Cursor cursor = manager.query(query.setFilterById(netId));
if(cursor!=null&&cursor.moveToFirst()){
//下載的文件到本地的目錄
String path=cursor.getString(cursor.getColumnIndex(DownloadManager.COLUMN_LOCAL_URI));
//已經(jīng)下載大小
int downloadSize=cursor.getInt(cursor.getColumnIndex(DownloadManager.COLUMN_BYTES_DOWNLOADED_SO_FAR));
//升級包大小
int totalSize=cursor.getInt(cursor.getColumnIndex(DownloadManager.COLUMN_TOTAL_SIZE_BYTES));
//下載狀態(tài)
int status=cursor.getInt(cursor.getColumnIndex(DownloadManager.COLUMN_STATUS));
}
通過Cursor來查詢下載的相關(guān)狀態(tài),例如文件大小,已下載大小等等相關(guān)信息。如果要持續(xù)更新進(jìn)度條,需要自己用Handler或者Timer等定時查詢下載狀態(tài)了。
記得聲明網(wǎng)絡(luò)權(quán)限和配置HTTP明文傳輸(Android 9.0上哦)
系統(tǒng)升級
系統(tǒng)升級只需要調(diào)用下面方法,PACKAGE_SAVE_PATH是我們的升級包路徑。
RecoverySystem.installPackage(getApplication(), new File(PACKAGE_SAVE_PATH));
在AndroidManifest.xml聲明權(quán)限:
<uses-permission android:name="android.permission.RECOVERY" />
//在application標(biāo)簽增加下面屬性,適配HTTP明文
android:usesCleartextTraffic="true"
應(yīng)用升級
應(yīng)用升級主要是調(diào)用安裝助手,但是下載APK后,要適配不同版本。
在Android 6.0以上,如果通過DownloadManager下載的,要通過查詢接口獲得下載路徑的位置。
String path=cursor.getString(cursor.getColumnIndex(DownloadManager.COLUMN_LOCAL_URI));
在Android 7.0以上,需要配置文件訪問權(quán)限。
- 在
res目錄下的xml文件夾新建share_paths.xml文件。如果沒有xml文件夾則新建,share_paths.xml命名隨意,其內(nèi)容為:
<?xml version="1.0" encoding="utf-8"?>
<paths>
<external-path
name="external"
path="" />
<external-files-path
name="Download"
path="" />
</paths>
- 在
AndroidManifest.xml聲明provider。
<provider
android:name="android.support.v4.content.FileProvider"
android:authorities="packgeName.fileProvider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/share_paths" />
</provider>
- 在需要路徑的地方通過下面代碼獲?。?/li>
uri = FileProvider.getUriForFile(context,
"packageNam.fileProvider",
new File(context.getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS), "xxx.apk"));
在Android 8.0以上,配置允許安裝位置應(yīng)用來源權(quán)限。
- 在
AndroidManifest.xml配置權(quán)限。
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />
- 檢測是否允許安裝未知來源應(yīng)用。如果用戶不允許則要跳轉(zhuǎn)授權(quán)列表,允許的話安裝應(yīng)用。
//判斷是否授權(quán)安裝未知來源應(yīng)用
context.getPackageManager().canRequestPackageInstalls();
//未授權(quán)的話要動態(tài)申請授權(quán)
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.REQUEST_INSTALL_PACKAGES}, 1);
//用戶拒絕授權(quán)的話,可以跳轉(zhuǎn)到授權(quán)界面
Intent intent = new Intent(Settings.ACTION_MANAGE_UNKNOWN_APP_SOURCES, Uri.parse("package:" + getPackageName()));
startActivityForResult(intent, 1);
在Android 9.0,如果下載APK使用HTTP,配置允許HTTP明文即可。與上面配置DownloadManger是一致的。
到此,就可以正常安裝APK了。
Intent intentInstall = new Intent();
intentInstall.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intentInstall.setAction(Intent.ACTION_VIEW);
intentInstall.setDataAndType(uri, "application/vnd.android.package-archive");
intentInstall.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
context.startActivity(intentInstall);
音量設(shè)置
雖然平常我們對外說是音量設(shè)置,但還是有挺多種類型,例如音樂,通知等的聲音。在Android中,設(shè)置音量相關(guān)的是AudioManger類,通過該類對象可以讀取和設(shè)置相關(guān)屬性。調(diào)節(jié)音量通常有兩種操作:UI界面調(diào)節(jié)和物理按鍵上下調(diào)節(jié)。
聲音類型
了解Audio的類型,才明確自己要設(shè)置的音量是什么類型的。有以下類型。
- AudioManger.STREAM_VOICE_CALL:通話
- STREAM_SYSTEM:系統(tǒng)
- STREAM_RING:手機鈴聲
- STREAM_ALARM:鬧鐘
- STREAM_NOTIFICATION:狀態(tài)欄通知
- STREAM_DTMF:雙音多頻,個人理解應(yīng)該撥號音
- STREAM_ACCESSIBILITY:提示
- STREAM_BLUETOOTH_SCO:通過藍(lán)牙撥打電話的音量
- STREAM_TTS:揚聲器
- STREAM_SYSTEM_ENFORCED:在某些國家用于識別強制系統(tǒng)聲音,例如日本相機拍照聲音
后面三個類型是隱藏的。
UI界面設(shè)置
通過界面來設(shè)置音量大小,主要通過AudioManger相關(guān)api來設(shè)置。
audioManager = (AudioManager) getActivity().getSystemService(Context.AUDIO_SERVICE);
//獲取媒體類型最大音量的值
maxVolume = audioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC);
//獲取當(dāng)前音量值
curVolume = audioManager.getStreamVolume(AudioManager.STREAM_MUSIC);
//直接設(shè)置媒體類型音量大小
audioManager.setStreamVolume(AudioManager.STREAM_MUSIC, volume, 0);
在setStreamVolume(int streamType, int index, int flags)方法中:
- flags:聲音類型
- index:聲音的大小,范圍在0-100之間,100音量最大
- flags:主要有:
AudioManager.FLAG_PLAY_SOUND(調(diào)節(jié)音量是播放聲音);AudioManager.FLAG_SHOW_UI (調(diào)節(jié)時顯示音量條);0(什么也做)。其他的可以自己參考一下文檔。
調(diào)節(jié)音量還有另外一個api:
audioManager.adjustStreamVolume(AudioManager.STREAM_MUSIC,AudioManager.ADJUST_LOWER,0);
//原型
audioManager.adjustStreamVolume(int streamType, int direction, int flags)
在原型函數(shù)主要看第二個參數(shù),主要有三個值:
- AudioManager.ADJUST_LOWER:降低音量,類似按音量-鍵
- AudioManager.ADJUST_RAISE:調(diào)高音量,類似按音量+鍵
- AudioManager.ADJUST_SAME:保持不變,展示音量
設(shè)置靜音
判斷指定類型是否靜音:
audioManager.isStreamMute(AudioManager.STREAM_MUSIC);
設(shè)置靜音,在Android 6.0前:
audioManager.setStreamMute(int streamType, boolean state)
將state設(shè)為false為關(guān)閉靜音,ture開啟靜音。獲取AudioManger對象建議采用Application的上下文,避免踩坑。
Android 6.0之后:
audioManager.adjustStreamVolume(int streamType, int direction, int flags)
第二個參數(shù)的值可設(shè)為:AudioManager.ADJUST_MUTE(開啟靜音)、AudioManager.ADJUST_UNMUTE(關(guān)閉靜音)。
物理按鍵設(shè)置音量
這個好像沒什么好說,應(yīng)用層能做的就是監(jiān)聽音量變化,更新UI界面。音量變化廣播android.media.VOLUME_CHANGED_ACTION對應(yīng)用層是隱藏的,所以需要以字符串來聲明。
public static final String ACTION_VOLUME_CHANGED="android.media.VOLUME_CHANGED_ACTION";
volumeReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) { curVolume=audioManager.getStreamVolume(AudioManager.STREAM_MUSIC);
Log.d(TAG,"curVolume:"+curVolume);
}
};
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction(ACTION_VOLUME_CHANGED);
getActivity().registerReceiver(volumeReceiver, intentFilter);
其他關(guān)于音量的操作建議親自操刀。
多語言設(shè)置(國際化)
隨著市場的全球化,app也要進(jìn)行多語言適配,而不僅僅是支持中文。由于大多數(shù)App屬于第三方應(yīng)用,不屬于系統(tǒng)應(yīng)用。這里講解app自身多語言切換。
1、建立資源文件
根據(jù)市場的需求,建立不同的語言資源文件。例如這里支持中文和英文。
2、獲取系統(tǒng)語言
一般新安裝app,最好的步驟就是跟隨系統(tǒng)語言,在用戶指定不同語言后,后續(xù)啟動才加載指定語言。Android 7.1.1 之前和之后的獲取方式不同:
Resources resources = getActivity().getResources();
Configuration configuration = resources.getConfiguration();
Locale locale = Locale.getDefault();
locale.getLanguage()
獲得Locale對象之后,可以獲取語言、國家等信息。
3、設(shè)置系統(tǒng)語言
Android 7.1.1之前和之后的設(shè)置方式并不相同,Android 7.1.1 為多語言用戶提供增強的支持,讓他們可以在設(shè)置中選擇多個語言區(qū)域。
Android 7.1.1之前
configuration.setLocale(Locale.ENGLISH);
resources.updateConfiguration(configuration, resources.getDisplayMetrics());
然后重啟相關(guān)Activity即可,語言對應(yīng)就切換了。
Android 7.1.1之后
configuration.setLocale(Locale.CHINESE);
context.createConfigurationContext(configuration);
上面的context必須是Activity的context,而不能是Application,所以需要所有Activity繼承一個基類BaseActivity,并重寫attachBaseContext()方法,這樣就不用每個單獨的Activity中重寫并重寫attachBaseContext()方法。
// BaseActivity
@Override
protected void attachBaseContext(Context newBase) {
super.attachBaseContext(LanguageUtil.getLanguageContext(newBase));
}
// LanguageUtil
public static Context getLanguageContext(Context context) {
SharedPreferences sharedPreferences = context.getSharedPreferences(file, Context.MODE_PRIVATE);
String language = sharedPreferences.getString(key, "");
if (language.length() == 0) {
//如果用戶沒有指定語言,返回默認(rèn)的context
return context;
} else {
//用戶指定語言,返回新的context
Configuration configuration = context.getResources().getConfiguration();
if (language.equals(ENGLISH)) {
configuration.setLocale(Locale.ENGLISH);
} else {
configuration.setLocale(Locale.CHINESE);
}
return context.createConfigurationContext(configuration);
}
}
指定語言之后,同樣需要重啟Activity,切換語言才會生效。
亮度調(diào)節(jié)
Android系統(tǒng)默認(rèn)帶有兩種調(diào)節(jié)模式:自動模式和手動模式。
如下圖,打開為設(shè)置自動模式,關(guān)閉為手動模式。
1、聲明權(quán)限
在AndroidManifest.xml文件聲明如下權(quán)限:
<uses-permission android:name="android.permission.WRITE_SETTINGS"/>
按照Android Studio Lint 工具的提示,該權(quán)限僅對系統(tǒng)app授權(quán)。但在我的Nokia X7不聲明該權(quán)限都可以正常調(diào)節(jié)亮度。如果需要,在AndroidManifest.xml根元素添加如下屬性,然后用對應(yīng)平臺簽名。
android:sharedUserId="android.uid.system"
2、設(shè)置亮度模式
在app中需要將亮度模式設(shè)置為手動模式,才能調(diào)節(jié)亮度。
- 手動模式:
Settings.System.SCREEN_BRIGHTNESS_MODE_MANUAL - 自動模式:
Settings.System.SCREEN_BRIGHTNESS_MODE_AUTOMATIC
示例代碼:
public void setScreenManualMode() {
ContentResolver contentResolver = getActivity().getContentResolver();
try {
//獲取當(dāng)前系統(tǒng)亮度模式
int mode = Settings.System.getInt(contentResolver,
Settings.System.SCREEN_BRIGHTNESS_MODE);
//如果當(dāng)前模式是自動模式,則設(shè)為手動模式
if (mode == Settings.System.SCREEN_BRIGHTNESS_MODE_AUTOMATIC) {
Settings.System.putInt(contentResolver, Settings.System.SCREEN_BRIGHTNESS_MODE,
Settings.System.SCREEN_BRIGHTNESS_MODE_MANUAL); }
} catch (Settings.SettingNotFoundException e) {
e.printStackTrace();
}
}
3、當(dāng)前亮度
屏幕亮度的值為0到255,值255為最亮亮度。
private int getScreenBrightness() {
ContentResolver contentResolver = getActivity().getContentResolver();
return Settings.System.getInt(contentResolver,
Settings.System.SCREEN_BRIGHTNESS, 0);
}
4、設(shè)置屏幕亮度
設(shè)置屏幕亮度,也就是對手機所有的界面都生效。
private void setScreenBrightness(int value) {
ContentResolver contentResolver = getActivity().getContentResolver();
Settings.System.putInt(contentResolver,
Settings.System.SCREEN_BRIGHTNESS, value);
}
5、設(shè)置當(dāng)前界面亮度
有時并不想設(shè)置所有界面,只想設(shè)置單前界面的亮度。例如看視頻追劇的時候。
private void setCurrentWindowBrightness(int brightness) {
Window window = getActivity().getWindow();
WindowManager.LayoutParams lp = window.getAttributes();
lp.screenBrightness = brightness / 255.0f;
window.setAttributes(lp);
}