2017-02-12 15 views
3

Я новый пользователь для stackoverflow, это мой первый пост, если я сделал что-то неправильно, не стесняйтесь сказать мне, спасибо.Уровень заряда батареи Android обнаружен

Я разрабатываю приложение для Android, чтобы контролировать уровень заряда батареи и изменять яркость экрана, но у меня была странная проблема, и я не мог найти ее после много раз.

public class SmartBrightnessProcessor extends BroadcastReceiver{ 

Context mContext; 
IntentFilter intentFilter; 
ContentResolver contentResolver; 

public SmartBrightnessProcessor(Context context){ 
    this.mContext = context; 
    intentFilter = new IntentFilter(); 
    intentFilter.addAction(Intent.ACTION_BATTERY_CHANGED); 
} 
public void registerReceiver(){ 
    mContext.registerReceiver(this, intentFilter); 
} 
public void unRegisterReceiver(){ 
    mContext.unregisterReceiver(this); 
} 
@Override 
public void onReceive(Context context, Intent intent){ 

    contentResolver = context.getContentResolver(); 

    boolean isEnabled = context.getSharedPreferences("SmartBrightness", 
      Context.MODE_PRIVATE).getBoolean("SmartBrightness", false); 

    int batteryLevel = intent.getIntExtra(BatteryManager.EXTRA_LEVEL, 0); 

    if(isEnabled){ 
     if(Build.VERSION.SDK_INT >= 23){ 
      if(Settings.System.canWrite(context)){ 
       if(batteryLevel >= 70){ 
        Settings.System.putInt(contentResolver, Settings.System.SCREEN_BRIGHTNESS, 85); 
       }else if(batteryLevel >= 50 && batteryLevel <= 69){ 
        Settings.System.putInt(contentResolver, Settings.System.SCREEN_BRIGHTNESS, 70); 
       }else if(batteryLevel >= 20 && batteryLevel <= 49){ 
        Settings.System.putInt(contentResolver, Settings.System.SCREEN_BRIGHTNESS, 50); 
       }else if(batteryLevel >= 10 && batteryLevel <= 19){ 
        Settings.System.putInt(contentResolver, Settings.System.SCREEN_BRIGHTNESS, 30); 
       }else if(batteryLevel <= 9){ 
        Settings.System.putInt(contentResolver, Settings.System.SCREEN_BRIGHTNESS, 10); 
       } 
      } 
     }else{ 
      if(batteryLevel >= 70){ 
       Settings.System.putInt(contentResolver, Settings.System.SCREEN_BRIGHTNESS, 85); 
      }else if(batteryLevel >= 50 && batteryLevel <= 69){ 
       Settings.System.putInt(contentResolver, Settings.System.SCREEN_BRIGHTNESS, 70); 
      }else if(batteryLevel >= 20 && batteryLevel <= 49){ 
       Settings.System.putInt(contentResolver, Settings.System.SCREEN_BRIGHTNESS, 50); 
      }else if(batteryLevel >= 10 && batteryLevel <= 19){ 
       Settings.System.putInt(contentResolver, Settings.System.SCREEN_BRIGHTNESS, 30); 
      }else if(batteryLevel <= 9){ 
       Settings.System.putInt(contentResolver, Settings.System.SCREEN_BRIGHTNESS, 10); 
      } 
     } 
    } 
} 

}

Когда я проверить его в реальном устройстве Код выше работает отлично, но я хочу, чтобы установить яркость экрана мгновенно, когда пользователь включен эти опции, поэтому я использую этот код, чтобы сделать действие, когда пользователь нажмите на кнопку.

public class SmartBrightness extends Fragment { 

SharedPreferences sharedPreferences; 
Context context; 
ContentResolver contentResolver; 
Intent intent; 
int batteryLevel; 
Switch aSwitch; 

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){ 

    View view = inflater.inflate(R.layout.smart_brightness, container, false); 

    context = getActivity().getApplicationContext(); 

    sharedPreferences = getActivity().getSharedPreferences("SmartBrightness", 0); 
    Boolean smartBrightness = sharedPreferences.getBoolean("SmartBrightness", false); 

    aSwitch = (Switch)view.findViewById(R.id.switch1); 

    aSwitch.setChecked(smartBrightness); 

    intent = new Intent(); 

    contentResolver = context.getContentResolver(); 

    batteryLevel = intent.getIntExtra(BatteryManager.EXTRA_LEVEL, 0); 

    aSwitch.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { 

     @Override 
     public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 
      if(isChecked){ 
       if(Build.VERSION.SDK_INT >= 23){ 
        if(!writeSettingsPermissionGranted()){ 
         showMissingPermissionDialog(); 
         aSwitch.setChecked(false); 
         SharedPreferences.Editor editor = sharedPreferences.edit(); 
         editor.putBoolean("SmartBrightness", false); 
         editor.apply(); 
        }else{ 
         if(batteryLevel >= 70){ 
          Settings.System.putInt(contentResolver, Settings.System.SCREEN_BRIGHTNESS, 85); 
         }else if(batteryLevel >= 50 && batteryLevel <= 69){ 
          Settings.System.putInt(contentResolver, Settings.System.SCREEN_BRIGHTNESS, 70); 
         }else if(batteryLevel >= 20 && batteryLevel <= 49){ 
          Settings.System.putInt(contentResolver, Settings.System.SCREEN_BRIGHTNESS, 50); 
         }else if(batteryLevel >= 10 && batteryLevel <= 19){ 
          Settings.System.putInt(contentResolver, Settings.System.SCREEN_BRIGHTNESS, 30); 
         }else if(batteryLevel <= 9){ 
          Settings.System.putInt(contentResolver, Settings.System.SCREEN_BRIGHTNESS, 10); 
         } 
         SharedPreferences.Editor editor = sharedPreferences.edit(); 
         editor.putBoolean("SmartBrightness", true); 
         editor.apply(); 
        } 
       }else{ 
        if(batteryLevel >= 70){ 
         Settings.System.putInt(contentResolver, Settings.System.SCREEN_BRIGHTNESS, 85); 
        }else if(batteryLevel >= 50 && batteryLevel <= 69){ 
         Settings.System.putInt(contentResolver, Settings.System.SCREEN_BRIGHTNESS, 70); 
        }else if(batteryLevel >= 20 && batteryLevel <= 49){ 
         Settings.System.putInt(contentResolver, Settings.System.SCREEN_BRIGHTNESS, 50); 
        }else if(batteryLevel >= 10 && batteryLevel <= 19){ 
         Settings.System.putInt(contentResolver, Settings.System.SCREEN_BRIGHTNESS, 30); 
        }else if(batteryLevel <= 9){ 
         Settings.System.putInt(contentResolver, Settings.System.SCREEN_BRIGHTNESS, 10); 
        } 
        SharedPreferences.Editor editor = sharedPreferences.edit(); 
        editor.putBoolean("SmartBrightness", true); 
        editor.apply(); 
       } 
      }else{ 
       SharedPreferences.Editor editor = sharedPreferences.edit(); 
       editor.putBoolean("SmartBrightness", false); 
       editor.apply(); 
      } 
     } 
    }); 

    return view; 
} 
private void requestWriteSettingsPermission(){ 
    if(Build.VERSION.SDK_INT >= 23){ 
     Intent intent = new Intent(android.provider.Settings.ACTION_MANAGE_WRITE_SETTINGS); 
     intent.setData(Uri.parse("package:" + context.getPackageName())); 
     intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
     startActivity(intent); 
    } 
} 
public void showMissingPermissionDialog(){ 
    final ViewGroup nullParent = null; 
    AlertDialog.Builder alertDialog = new AlertDialog.Builder(getActivity()); 
    LayoutInflater layoutInflater = LayoutInflater.from(getActivity()); 
    View view = layoutInflater.inflate(R.layout.write_settings_explaination, nullParent); 

    alertDialog.setView(view); 
    alertDialog.setCancelable(false); 
    alertDialog.setPositiveButton("Continue", new DialogInterface.OnClickListener() { 
     public void onClick(DialogInterface dialog, int which) { 
      requestWriteSettingsPermission(); 
      dialog.dismiss(); 
     } 
    }); 
    alertDialog.setNegativeButton("Cancel", new DialogInterface.OnClickListener() { 
     public void onClick(DialogInterface dialog, int which) { 
      dialog.dismiss(); 
     } 
    }); 
    alertDialog.show(); 
} 
public boolean writeSettingsPermissionGranted(){ 
    if(Build.VERSION.SDK_INT >= 23){ 
     if(android.provider.Settings.System.canWrite(context)){ 
      return true; 
     } 
    } 
    return false; 
} 

}

Но проблема в том, когда я тестирую на реальном устройстве, даже мое устройство уровень заряда батареи выше 50%

при нажатии кнопки яркость экрана меняется на 10, это также означает, что этот код выполнен.

Settings.System.putInt(contentResolver, Settings.System.SCREEN_BRIGHTNESS, 10); 

Я понятия не имею, почему он отлично работает в широковещательном приемнике, но не работает с нажатием кнопки.

Если у кого-то есть идея решить эту проблему или столкнуться с тем же вопросом, пожалуйста, помогите мне, спасибо заранее.

ответ

1

Если проверить documentation for BatteryManager.EXTRA_LEVEL вы бы увидели, что это

целое поле, содержащее текущий уровень заряда батареи, от 0 до EXTRA_SCALE.

EXTRA_SCALE быть другое значение для вас, чтобы захватить мое предположение здесь, и вопрос, который вы столкнулись, является масштаб, вероятно, 1,0, что означает, что 20% батарея будет фактически +0,20

Для правильно рассчитать процент батареи, на 0 - масштаб> 100, используйте следующие

batteryLevel = intent.getIntExtra(BatteryManager.EXTRA_LEVEL, 0); 
levelScale = intent.getIntExtra(BatteryManager.EXTRA_SCALE, 0); 

double realPercent = (((double)batteryLevel)/levelScale) * 100 ; 

редактировать

Я просто перечитайте свой код, и я не удивлен, что вы видите 0 как отчётный процент для вашего метода OnClick, вы писали:

intent = new Intent(); 
batteryLevel = intent.getIntExtra(...); 

Здесь вы пытаетесь получить данные намерения, что вы только что создали, а не тот, который фактически содержит данные, которые вы ищете.

Попытайтесь изменить свое намерение, чтобы фактически получить уровень заряда батареи, а затем используйте мое исправление выше, чтобы получить правильный процент.

Intent batteryIntent = registerReceiver(null, new IntentFilter(Intent.ACTION_BATTERY_CHANGED)); 
+0

Я попробовал ваш код только сейчас, но он не работает, ничего в другое, если блок выполнил – Dragon957

+0

извините за задержку, увидеть мои изменения. Вы пытаетесь извлечь данные из намерения, которое не имеет доступных данных. –

+0

Спасибо большое !!! Ваш ответ действительно решает мою проблему.Последний вопрос: мне нужно было отменить регистрацию получателя в методе onDestroy()? – Dragon957