電源が 100% になると緑色のライトが点灯し、残りの充電電力は赤色になります。電力が 15 未満の場合、赤いライトが 3 秒ごとに 1 回点滅します。ネットワークがない場合は緑色のライトがすばやく点滅し、ネットワークがある場合は5秒に1回呼吸ライトがオン/オフされます.呼吸ライトはブロードキャスト制御でオン/オフできます. インターネットに接続されているかどうかを確認します。

フレームワーク/ base/services/core/java/com/android/server/BatteryService.java

電源が 100% の場合は緑色のライトが点灯し、残りの充電電力は赤色です。

    publicvoid updateLightsLocked() {方法中
    else if(status == BatteryManager.BATTERY_STATUS_CHARGING
                        || status ==BatteryManager.BATTERY_STATUS_FULL) {
                    if (status ==BatteryManager.BATTERY_STATUS_FULL || level >= 90) {
    
    

90~100

電力が 15 未満の場合、赤いライトが 3 秒ごとに 1 回点滅します。

publicvoid updateLightsLocked() {下

if(level < mLowBatteryWarningLevel) {判定 (mLowBatteryWarningLevel は level=15)

    if(status == BatteryManager.BATTERY_STATUS_CHARGING) {
                        // Solid red when batteryis charging
                       mBatteryLight.setColor(mBatteryLowARGB);
                    } else {
                        // Flash red when batteryis low and not charging
                       mBatteryLight.setFlashing(mBatteryLowARGB, Light.LIGHT_FLASH_TIMED,
                                mBatteryLedOn,mBatteryLedOff);

それ以外は mBatteryLight.setFlashing(mBatteryLowARGB,Light.LIGHT_FLASH_TIMED,

mBatteryLedOn,3000);

ブロードキャスト コントロールのブリージング ライト スイッチは、実際には属性値を与えるためのものであり、実際の操作はまだ updateLightsLocked にあります。

    else if(action.equals("com.android.breath.light.on")){
                        Log.d("yantao","def_netlight"+Settings.System.getInt(mContext.getContentResolver(),"def_netlight",0));
                       Settings.System.putInt(mContext.getContentResolver(),"def_netlight",0);
                        mNetworkflag = false;
                        mLed.updateLightsLocked();
                        Log.d("yantao","def_netlight"+Settings.System.getInt(mContext.getContentResolver(),"def_netlight",0));
                    }else if(action.equals("com.android.breath.light.off")){
                       Settings.System.putInt(mContext.getContentResolver(),"def_netlight",1);
                        Log.d("yantao
    ","def_netlight"+Settings.System.getInt(mContext.getContentResolver(),"def_netlight",0));
                        mNetworkflag = true;
                        mLed.updateLightsLocked();
                    }

インターネットがない場合は緑色のライトがすばやく点滅し、インターネットがある場合は 5 秒ごとに呼吸ライトが点滅します。

呼吸ライトを手動でオフにする必要がある場合、サーチライトはなくなります。通常、インターネットに接続されていないときは緑色のライトがすばやく点滅し、インターネットに接続されているときは 5 秒ごとにゆっくりと点滅します。ブロードキャストで呼吸ライトをオフにすると、ライトは確実に点滅しません。それは次のロジックです

public void updateLightsLocked() { メソッド

最終的には他の充電ではありません

                   if (!(mNetworkflag) ||Settings.System.getInt(mContext.getContentResolver(),"def_netlight",0)== 0) {
                        // if not charging usenetwork_light
                       if(!isNetworkConnected(mContext)){  //no network
                           mBatteryLight.turnOff();
                           mBatteryLight.setFlashing(0xFF00FF00, Light.LIGHT_FLASH_TIMED,
                                    500, 500);
                        }else{
                           mBatteryLight.turnOff();
                           mLed.mBatteryLight.setFlashing(0xFF00FF00, Light.LIGHT_FLASH_TIMED,2500, 5000);
                        }
                    }
                    if (mNetworkflag || Settings.System.getInt(mContext.getContentResolver(),"def_netlight",0)== 1) {
                   android.util.Log.i("yantao","def_netlight,0) == 1 turnoff");
                        mBatteryLight.turnOff();
                    }

実際には、上記の mNetworkflag で判断できますが、以降、Settings.System.getInt(mContext.getContentResolver(), "def_netlight", 0) は必要ありません。これは、各ブロードキャスト コントロールのブリージング ライトの後に割り当てられているためです。 switch グローバルブール値が有効になり、属性 def_netlight も共有メモリに追加されます

主にこれはインターネットに接続されているかどうかを判断するNetworkConnectedメソッド

    import android.net.ConnectivityManager;
    import android.net.NetworkInfo;
     
    public boolean isNetworkConnected(Context context) {
            if (context != null) {
                ConnectivityManager mConnectivityManager= (ConnectivityManager) context  
                   .getSystemService(Context.CONNECTIVITY_SERVICE);  
                NetworkInfo mNetworkInfo =mConnectivityManager.getActiveNetworkInfo(); 
                if (mNetworkInfo != null) {
                    Log.d("yantao","===type=="+mNetworkInfo.getType());
                    returnmNetworkInfo.isAvailable();  
                }
            }
            Log.d("yantao","isNetworkConnected_flase");
            return false;  
        }

インターネットに接続した後にのみブリージングライトが表示され、ブロードキャストがオフになった後、ネットワークなしでサーチライトが影響を受けないようにすることが要求されている場合、次のロジックは次のようになります。

                  if(!isNetworkConnected(mContext)){  //no network
                           mBatteryLight.turnOff();
                           mBatteryLight.setFlashing(0xFF00FF00, Light.LIGHT_FLASH_TIMED,
                                    500, 500);
                        }else{
                        if (!mNetworkflag) {
                           mBatteryLight.turnOff();
                           mLed.mBatteryLight.setFlashing(0xFF00FF00, Light.LIGHT_FLASH_TIMED,2500, 5000);
                            }else{
                           mBatteryLight.turnOff();
                            }
                        }

実際の測定では、下層のドライバーまたは hal 層のさまざまな変更により、ライトが乱雑になり、ロジックに従っていない可能性があります.上記のロジックが正しいのに、ライトが点滅しない場合は、ライトを確認してください. hal層のc。

在vendor/mediatek/proprietary/hardware/liblights/lights.c

グリーンライトなどのライトの点滅、消灯、点灯を制御する機能。その他のライトも同様。

    staticint
    blink_green(intlevel, int onMS, int offMS)
    {
       static int preStatus = 0; // 0: off, 1:blink, 2: no blink
       int nowStatus;
       int i = 0;
     
       if (level == 0)
              nowStatus = 0;
       else if (onMS && offMS)
              nowStatus = 1;
       else
              nowStatus= 2;
     
       /*if (preStatus == nowStatus)          
              return -1;*/
     
    #ifdefLIGHTS_DBG_ON
       ALOGD("blink_green, level=%d, onMS=%d,offMS=%d\n", level, onMS, offMS);
    #endif
       if (nowStatus == 0) {
               write_int(GREEN_DELAY_OFF_FILE,0);
               write_int(GREEN_DELAY_ON_FILE,0);
               write_int(GREEN_LED_FILE,0);
       }
       else if (nowStatus == 1) {
    //         write_int(GREEN_LED_FILE,level); // default full brightness
              write_str(GREEN_TRIGGER_FILE,"timer");
              while (((access(GREEN_DELAY_OFF_FILE, F_OK)== -1) || (access(GREEN_DELAY_OFF_FILE, R_OK|W_OK) == -1)) && i<10){
                     ALOGD("GREEN_DELAY_OFF_FILEdoesn't exist or cannot write!!\n");
                     led_wait_delay(5);//sleep 5msfor wait kernel LED class create led delay_off/delay_on node of fs
                     i++;
              }
              write_int(GREEN_DELAY_OFF_FILE,offMS);
              write_int(GREEN_DELAY_ON_FILE, onMS);
              //write_int(GREEN_LED_FILE, 255);
       }
       else {
               //write_int(GREEN_DELAY_OFF_FILE,0);
               //write_int(GREEN_DELAY_ON_FILE,0);
               write_str(GREEN_TRIGGER_FILE,"none");
               write_int(GREEN_LED_FILE,255); // default full brightness
       }
     
       preStatus = nowStatus;
     
       return 0;
    }

USBのプラグを抜いた後、充電ライトがオフになるはずなのにオフにならず、ライトが点滅しているときに2つのライトが一緒に点滅する現象が発生し、金型ステータスライトのテストや、ライトの色がすぐに切り替わる可能性があり、色のエラーが発生します. この現象は、実際には特定のライトがオフになっているために発生します.

理由

preStatus == nowStatus. 各エントリの前は、通常、この関数が呼び出されるたびに新しい値と古い値が異なるはずですが、2 つの値が同じであるためバグが発生し、特定の理由は明らかではありません。

if(preStatus == nowStatus)

-1を返す

これにより機能が復帰し、当然、次のことが実行できなくなり、ライトを消す操作が正常に実行できなくなります。

       if (nowStatus == 0) {
               write_int(GREEN_DELAY_OFF_FILE,0);
               write_int(GREEN_DELAY_ON_FILE,0);
               write_int(GREEN_LED_FILE,0);
       }

解決策は、これをコメントアウトすること、つまり、この関数を使用することです. 隠れたバグがあるはずだと思いますが、ソースコードの設計上、リターンを終了させて​​、本当の新しい価値は古い価値と同じです。

ソースコードには消灯を制御する関数が書かれていますが、私の理解では、この消灯は最後に実行され、最後にメモリが解放されます。現在の状態を判断して実行するブリンク機能 消灯・点滅・点灯 0 オフ。1回フラッシュ、2回明るい

 
/** Close the lights device */
static int
close_lights(struct light_device_t *dev)
{
    if(dev) {
       free(dev);
    }
   return 0;
}

おすすめ

転載: blog.csdn.net/youthking1314/article/details/128533522