Android'in ekran parlaklığını ayarlayın (kaynak kodu makalenin sonuna eklenmiştir)

1. Talep analizi

WeChat veya Alipay ödeme kodunu kullanırken, ödeme kodunu büyütmek için tıklarsanız, büyük boyutlu ödeme kodunu görüntülemek için yeni bir sayfaya geçecek ve ekranın daha parlak hale geldiğini göreceksiniz, bu da tarayıcıyı kolaylaştıracaktır. Ödeme kodunuzu tanımlayın. Ödeme kodu büyütülmüş arayüzden başarıyla çıktığınızda, ekran orijinal parlaklığına geri dönecektir. Bunu uzun zaman önce fark ettim, bu yüzden kendi projemin QR kodunu büyütmek için tıklayın işlevini yapması gerektiğinde, ekran arayüzünü de yakınlaştırıyorum ve aydınlatıyorum. O zamanlar bu işlevi görece kolay fark etsem de, ekran parlaklık aracı sınıfını yazdığımda, içinde bir şey olduğunu fark ettim. Şimdi sistematik olarak inceleyelim.

Öncelikle "ekran parlaklığının" ne olduğunu netleştirmemiz gerekiyor. Aslında iki durumu içerir:

1. Mevcut pencerenin parlaklığı. Yalnızca mevcut pencerenin parlaklığını değiştirirseniz, pencereden çıktığınızda (mevcut Aktiviteyi yok etmek veya sadece uygulamadan çıkmak gibi), ekran orijinal parlaklığa geri dönecektir. Diğer bir deyişle, buradaki değişiklikler yalnızca mevcut pencere için etkilidir. Ödeme kodunu büyütmek için WeChat veya Alipay tıkladıktan sonra değişen şey budur.

2. Sistem ekranının parlaklığını değiştirin. Açılır cep telefonu ayarları panelinde, ekran parlaklığını değiştirmek için bir ilerleme çubuğu vardır (aşağıdaki şekilde kırmızı kutu) Burada değişen, tüm pencereler için geçerli olan sistemin ekran parlaklığıdır.

Ayarlar panelinden aşağı

2. Hazırlık

Bir BrightnessActivity oluşturun ve ardından biri sistem parlaklığını, diğeri de pencere parlaklığını değiştirmek için iki ilerleme çubuğu yerleştirin. Gelecekteki kullanımı kolaylaştırmak için, bir araç sınıfında kullanılan tüm yöntemleri özetleyeceğiz. Bu nedenle BrightnessUtil adlı başka bir Kotlin dosyası oluşturun, ancak bir sınıf oluşturmayın, çünkü araç sınıfını yazmak için genişletilmiş üye yöntemini kullanacağız.

Hatırlatma: Kotlin'i yarım yıldan fazla bir süredir kullanıyorum, bu gerçekten harika bir dil ve öğrenmenizi tavsiye ederim. Genel olarak Kotlin'i ilerideki bloglarda kullanacağım.

Buradaki çok miktarda metin nedeniyle, üst düzey bir Android teknik taslağı ve öğrenme materyallerinin yanı sıra sizinle ücretsiz olarak paylaşmak için proje kaynak kodunu özetledim ve makalenin sonunda alacağım!

3. Mevcut pencerenin parlaklığını değiştirin

Öncelikle pencere parlaklığının nasıl değiştirileceğini görelim. Çok basit, sadece pencere özelliklerinde screenBrightness öğesini değiştirin. Doğrudan koda bakalım:

/ ** * Mevcut pencere parlaklığı * Aralık 0 ~ 1.0, 1.0 en parlak, -1 sistem varsayılan ayarıdır * / var Activity.windowBrightness get () = window.attributes.screenBrightness set (parlaklık) { // Varsayılan olarak 0'dan küçük veya 1.0'dan büyük, sistem parlaklığı için window.attributes = window.attributes.apply { screenBrightness = if (parlaklık > 1.0 || parlaklık < 0) -1.0F başka parlaklık } }

Pencere parlaklığını değiştirmenin bağlamı Etkinlik olmalıdır, bu nedenle Etkinliğe genişletilmiş bir pencere Parlaklığı özniteliği ekledim, değeri geçerli pencere parlaklığıdır ve pencere parlaklığı değeri değiştirilerek değiştirilebilir. Aralığı 0 ~ 1.0'dır ve parlaklık kademeli olarak 0'dan 1.0'a yükselir; -1 değeri atanırsa, aşağıdaki sistemin parlaklığı anlamına gelir.

Ayrıca kullanımı çok basittir:

tvWindowBright.text = "Mevcut pencere parlaklığı = $ windowBrightness" sbWindowBright.progress = if (windowBrightness > 0) (windowBrightness * 100) .toInt () else 0 sbWindowBright.setOnSeekBarChangeListener (nesne: SeekBar.OnSeekBarChangeListener { override fun onProgressChanged (seekBar: SeekBar ?, progress: Int, fromUser: Boolean) { windowBrightness = progress.toFloat () / 100F tvWindowBright.text = "Mevcut pencere parlaklığı = $ windowBrightness" } eğlenceyi geçersiz kılın onStartTrackingTouch (seekBar: SeekBar?) { } eğlenceyi geçersiz kılın onStopTrackingTouch (seekBar: SeekBar?) { } })

Kotlin ile hiç iletişime geçmemiş olanlar bu mülkü Java'da nasıl kullanacaklarını bilemeyebilir mi? Sonuçta sınıf adını bile görmedik. Aslında, Kotlin varsayılan olarak Java için bir "sınıf adı + kt" sınıfı oluşturacak ve özellikler alıcı ve ayarlayıcı statik yöntemler oluşturacaktır. Yani Java kodunda sadece yazmanız gerekir:

BrightnessUtilKt.getWindowBrightness (Etkinlik); BrightnessUtilKt.setWindowBrightness (Etkinlik, parlaklık);

4. Sistem parlaklığını değiştirin

Pencere parlaklığını değiştirmekle karşılaştırıldığında, sistem parlaklığını değiştirmek biraz daha zahmetli. Bireyler olarak dünyayı değiştirmek bizim için kolay değildir, bu nedenle bir uygulamanın sistemi değiştirmesi doğal olarak kolay değildir.

4.1 Bildirim dosyası için başvuru izni

İlk adımda, AndroidManifest.xml'de izin başvurusunda bulunmamız gerekiyor:

< kullanım izni android: name = "android.permission.WRITE_SETTINGS" araçlar: ignore = "ProtectedPermissions" / >

Tools: ignore = "ProtectedPermissions" un eklenmesinin nedeni, sistem ayarlarını değiştirme izninin genel olarak sistem Uygulamasına ait olmasıdır, bu nedenle derleyici bir uyarı bildirir, ayrıca bu uyarıyı göz ardı edebilirsiniz.

4.2 Dinamik izinler için başvurun

Cep telefonu sisteminiz Android 6.0 veya üstü ise, izinler için dinamik olarak başvurmanız gerekir. Sistem ayarı izinlerinin dinamik uygulaması biraz özeldir. Sistemin "değiştirilebilir sistem ayarları" arayüzüne geçmesi, kullanıcının mevcut uygulamanın sistem ayarlarını değiştirmesine izin verip vermeyeceğine karar vermesine izin vermesi ve ardından geri arama sonucunu onActivityResult'da işlemesi gerekir.

BrightnessActivity'ye girdiğimizde izinler için dinamik olarak başvururuz, kod aşağıdaki gibidir:

// Sistem ekran parlaklığını değiştirmek, sistem ayarlarını değiştirmek için izin gerektirir eğer (Build.VERSION.SDK_INT > = Build.VERSION_CODES.M) { // Mevcut platform sürümü 23 platformdan büyükse if (! Settings.System.canWrite (mContext)) { val amaç = (Amaç (Ayarlar.ACTION_MANAGE_WRITE_SETTINGS)) { data = Uri.parse ("paket: $ paketAdı") bu } startActivityForResult (amaç, RQ_WRITE_SETTINGS) } Başka { changeSystemBrightness () } } Başka { // Android 6.0'ın altındaki sistemler doğrudan parlaklığı değiştirir changeSystemBrightness () }

Cep telefonu sistemini belirlemek için önce Settings.System.canWrite (Context) çağrısı yapın. Android 6.0 ve altı, doğrudan işlemin parlaklığı değiştirmesine izin verir; Android 6.0 ve üstü, sistem ayarlarını değiştirme izninin alınıp alınmadığını belirlemelidir, değilse, açın Aşağıdaki arayüzde ayarlayın.

Sistem ayarları arayüzünü değiştirin

Kullanıcının yetkili olup olmadığına bakılmaksızın, bir geri aramaya ihtiyacımız var ve ardından onActivityResult kullanışlı olabilir:

eğlenceyi geçersiz kılma onActivityResult (requestCode: Int, resultCode: Int, data: Intent?) { super.onActivityResult (requestCode, resultCode, data) ne zaman (requestCode) { RQ_WRITE_SETTINGS- > { eğer (Build.VERSION.SDK_INT > = Build.VERSION_CODES.M) { if (Settings.System.canWrite (mContext)) { shortToast ("İzin alındı") changeSystemBrightness () } Başka { shortToast ("İzni reddettiniz") } } } } }

Kod çok basit, bu yüzden çok fazla açıklamayacağım.

4.3 Otomatik parlaklığı kaldırın

Daha önce izin problemini çözmüş olsak da yine de pratik bir durumu düşünmemiz gerekiyor yani kullanıcı otomatik parlaklığı ayarlayabilir, bu öncül altında sistem ekran parlaklığı değiştirilemez. İşte iki adım:

  • Kullanıcının otomatik parlaklığı açıp açmadığını belirleyin;
  • Otomatik parlaklık şu anda açıksa, kapatmanız gerekir.
  • 4.3.1 Otomatik olarak parlaklığın olup olmayacağını belirleme

    İsAutoBrightness özelliğini tool sınıfına ekliyoruz, yalnızca Boolean değeri döndüren bir Getter yöntemine sahip. Burada Settings.System.getInt () yöntemi çağrılır ve ikinci parametre, sistem ekranı parlaklık modunu almak istediğimizi belirtmek için Settings.System.SCREEN_BRIGHTNESS_MODE içinde geçirilir.Ayarlar.System.SCREEN_BRIGHTNESS_MODE ise, mevcut otomatik parlaklık modunu gösterir.

    val isAutoBrightness: Boole get () = try { Settings.System.getInt ( AndUtil.appContext.contentResolver, Ayarlar.Sistem.SCREEN_BRIGHTNESS_MODE ) == Ayarlar.System.SCREEN_BRIGHTNESS_MODE_AUTOMATIC } catch (e: Settings.SettingNotFoundException) { e.printStackTrace () yanlış }

    4.3.2 Otomatik parlaklığı açma ve kapatma

    Daha önce sistem parlaklık modunu aldık ve değerini ayarlayarak otomatik parlaklık modunun anahtarını kontrol edebiliriz.

    Araç sınıfında bir setAutoBrightness () işlevi oluşturun ve ayar başarılı olursa true değerini döndürün. Burada kullanılan Settings.System.putInt (), ikinci parametre ise ayarlamak istediğimiz parlaklık modudur. Parametre etkinleştirme doğru olduğunda, otomatik moddur.

    / ** * Otomatik parlaklığın açılıp açılmayacağını ayarlayın * @param etkinleştirme: doğru olduğunda aç, yanlış olduğunda kapat * @return, başarıyla ayarlanırsa true değerini döndürür * / fun setAutoBrightness (etkinleştir: Boolean) = Settings.System.putInt ( AndUtil.appContext.contentResolver, Settings.System.SCREEN_BRIGHTNESS_MODE, if (etkinleştir) Settings.System.SCREEN_BRIGHTNESS_MODE_AUTOMATIC else Settings.System.SCREEN_BRIGHTNESS_MODE_MANUAL )

    4.4 Kapsülleme, sistem ekranı parlaklık özelliklerini değiştirir

    Şimdi nihayet sistemin parlaklığını değiştirmek için kodu yazabiliriz. Pencere parlaklığını değiştirmek gibi burada da systemBrightness adında bir öznitelik kullanıyoruz:

    / ** * Sistem ekranı parlaklığı, WRITE_SETTINGS iznine ihtiyaç duyar ve kodda sistem ayarı izni için başvurun * Aralık 0 ~ 255'tir * / var systemBrightness get () = try { Settings.System.getInt (AndUtil.appContext.contentResolver, Settings.System.SCREEN_BRIGHTNESS) } catch (e: Settings.SettingNotFoundException) { e.printStackTrace () -1 } @RequiresPermission (Manifest.permission.WRITE_SETTINGS) set (@IntRange (= 0'dan = 255'e) parlaklık) { if (isAutoBrightness) { // Akım otomatik parlaklık ise, otomatik parlaklığı kapat setAutoBrightness (yanlış) } val uri = Settings.System.getUriFor (Settings.System.SCREEN_BRIGHTNESS) Settings.System.putInt (AndUtil.appContext.contentResolver, Settings.System.SCREEN_BRIGHTNESS, parlaklık) AndUtil.appContext.contentResolver.notifyChange (uri, null) }

    Burada set () içindeki kod olan sistem parlaklığını ayarlamaya odaklanıyoruz. Öncelikle otomatik parlaklık modunun açık olup olmadığını belirleyin ve açıksa kapatın. Aşağıdaki kod, Settings.System.putInt () 'de atanan setAutoBrightness ()' a benzer. Aradaki fark, Context.contentResolver.notifyChange () yönteminin, ekran parlaklığını değiştirdiğimizi sisteme bildirmek için çağrılmasıdır, bu nedenle değer Çalışacak. Ek olarak, sistem ekran parlaklığının değer aralığının 0 ~ 255 olmasına dikkat edin.

    Son olarak, tabii ki SeekBar izlemesini ayarlayın:

    özel eğlence changeSystemBrightness () { sbSystemBright.setOnSeekBarChangeListener (nesne: SeekBar.OnSeekBarChangeListener { override fun onProgressChanged (seekBar: SeekBar ?, progress: Int, fromUser: Boolean) { systemBrightness = ilerleme * 255/100 tvSystemBright.text = "Sistem Parlaklığı = $ systemBrightness" } eğlenceyi geçersiz kılın onStartTrackingTouch (seekBar: SeekBar?) { } eğlenceyi geçersiz kılın onStopTrackingTouch (seekBar: SeekBar?) { } }) }

    Elde edilen etki aşağıdaki gibidir:

    Video kaydı parlaklık değişimini görmez ancak gerçek makinede bir sorun yoktur.

    5. Postscript

    Bu makale ekran parlaklığının türünü analiz eder ve ayar yöntemini verir. Bunlar arasında, sistem ekran parlaklığını ayarlarken dinamik izin uygulamasının ve otomatik parlaklık modunun etkisine özellikle dikkat edin.

    [Ekli] İlgili çerçeve ve bilgiler

    Bilgi koleksiyonu

    Takip edin + özel mesajı ücretsiz olarak "Android bilgileri" yanıtlayın!

    Önceki Android gelişmiş mimari malzemelerine, kaynak koduna, notlarına ve videolarına erişim sağlayın. Gelişmiş UI, performans optimizasyonu, mimarlık kursu, NDK, hibrit geliştirme (ReactNative + Weex) WeChat uygulaması, Flutter çok yönlü Android gelişmiş uygulama teknolojisi

    Model oynatma kontrolü: GN-X değişir, durumu tersine çevirme gücü
    önceki
    Model oyun kontrolü: R.Jiajia, R. Qiangqiang'ın prototipidir
    Sonraki
    Android Q Beta resmi olarak yayınlandı | Biçim ve içerik açısından iyi
    Xiaoyi Robot CEO'su Fang Feihai: Daha az hikaye anlatın ve ürünler hakkında daha fazla konuşun, girişimciliğin ticarileştirmenin özüne dönmesi gerekiyor
    Model oyun kontrolü: MG Richelle püskürtme
    Keanu, Douban skoru 7.1 olan bir filmde rol aldı ve son on yıldır kötü filmlerde oynadı.
    15 oyuncu, yeniden birleşme sonrası dönemde bize hangi yeni eserleri teslim edeceklerini görün
    Mod oynatma kontrolü: Şiddetli bastırma GM / GM'de değişiklik
    Hayatın bir seremoni duygusuna ihtiyacı var, kiraz çiçeği duş jeli patlaması güzel |
    Pislik erkek yeşil çay fahişesiyle nasıl savaşılır? En son Pechoin reklamını gördünüz mü?
    Bu evin yol açtığı ölümcül vakada, sadece Qin Hailu'yu korkutucu olduğuna ikna ettim.
    Altı film ve televizyon şirketi birlikte konuşabilir ve mantıksız ücretleri azaltabilir mi?
    Android ekran uyarlama sonlandırıcı
    Model oyun kontrolü: 08ms ekibi, as pilotu yola çıkmaya hazır
    To Top