Android Setting大作戰(zhàn)

前言

本文講的是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包,大家一起用.......

  1. 聲明權(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)需求。

  1. 判斷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);
  1. 掃描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]")) {
    //未加密,不需要密碼
 }
  1. 獲取已保存過的WIFI
    在掃描結(jié)束后,可以通過下面代碼獲得已保存過的代碼:
List<WifiConfiguration> configurations = wifiManager.getConfiguredNetworks();
  1. 連接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列表時,ScanResultcapabilities屬性。這個過程也是需要用戶輸入密碼的,不然密碼從何而來。這里的WifiInfo是對ScanResult的進(jìn)一步封裝而已。

最后就是連接WIFI了。

 int netId = wifiManager.addNetwork(createWifiConfigurationNeedPassword(wifiInfo));
 wifiManager.enableNetwork(wcgID, true)

經(jīng)典藍(lán)牙和低功耗藍(lán)牙

之前相關(guān)文章,這里不再重復(fù)了...

經(jīng)典藍(lán)牙

低功耗藍(lán)牙

系統(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)限。

  1. 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>
  1. 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>
  1. 在需要路徑的地方通過下面代碼獲?。?/li>
uri = FileProvider.getUriForFile(context,
            "packageNam.fileProvider",
            new File(context.getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS), "xxx.apk"));

在Android 8.0以上,配置允許安裝位置應(yīng)用來源權(quán)限。

  1. AndroidManifest.xml配置權(quán)限。
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />
  1. 檢測是否允許安裝未知來源應(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ù)市場的需求,建立不同的語言資源文件。例如這里支持中文和英文。


image

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)閉為手動模式。

image

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);
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容