Autore Topic: Disabilitare wifi con toggle button dato un livello di carica della batteria  (Letto 1479 volte)

Offline punticci

  • Utente junior
  • **
  • Post: 78
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    nexus 4
Buondì, è possibile attraverso un toggle button far spegnere il wifi quando il livello della batteria è inferiore al 10%? più a livello pratico:
cosi mi "trovo" la percentuale di carica(o meglio il numero; se indicato 10 vuol dire che è al 10%)
Codice: [Seleziona]
int level = intent.getIntExtra(BatteryManager.EXTRA_LEVEL,0);
Quello che dovrei in teoria fare sarebbe questo:
Codice: [Seleziona]
    public void getRisparmio(View view) {
    // is the toggle on?
    boolean on = ((ToggleButton) view).isChecked();

    WifiManager wifiManager;
    if (on) {
    if (level < 10){
      wifiManager(WifiManager) this.getSystemService(Context.WIFI_SERVICE);
      wifiManager.setWifiEnabled(false);
    }
    } else {
      wifiManager(WifiManager) this.getSystemService(Context.WIFI_SERVICE);
      wifiManager.setWifiEnabled(true);
    }
    }
E' possibile? Perchè mi interesserebbe capire come fare per la mia applicazione, grazie in anticipo

Offline GabMarioPower

  • Moderatore globale
  • Utente senior
  • *****
  • Post: 606
  • Respect: +152
    • Github
    • Google+
    • gabrielemariotti
    • GabMarioPower
    • Mostra profilo
  • Play Store ID:
    GAB+MARIO+DEV
  • Sistema operativo:
    Ubuntu 14.04 , Win 10
Re:Disabilitare wifi con toggle button dato un livello di carica della batteria
« Risposta #1 il: 26 Giugno 2013, 20:44:39 CEST »
0
Codice (Java): [Seleziona]
public void getRisparmio(View view) {

   .....
   IntentFilter ifilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED);
   Intent batteryStatus = context.registerReceiver(null, ifilter);
   int level = batteryStatus.getIntExtra(BatteryManager.EXTRA_LEVEL, -1);
   if (level<10){
       ......
   }
   .......
}

Offline punticci

  • Utente junior
  • **
  • Post: 78
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    nexus 4
Re:Disabilitare wifi con toggle button dato un livello di carica della batteria
« Risposta #2 il: 27 Giugno 2013, 09:32:15 CEST »
0
Codice (Java): [Seleziona]
public void getRisparmio(View view) {

   .....
   IntentFilter ifilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED);
   Intent batteryStatus = context.registerReceiver(null, ifilter);
   int level = batteryStatus.getIntExtra(BatteryManager.EXTRA_LEVEL, -1);
   if (level<10){
       ......
   }
   .......
}
Ahah mi hai risposto anche su stackoverflow ;) Comunque la mia domanda sucessiva su stackoverflow era: mettiamo caso che ho il 25% di batteria, entro nell'applicazione e clicco il bottone che mi fa partire la condizione del check del livello di batteria..Poi esco dall'app, smanetto un po e la batteria arriva al 10%.. La condizione resta attiva anche se sono al di fuori dell'app? Lui continua a controllare lo stato della batteria nel momento in cui ho premuto il bottone anche se era al 25%?

Post unito: 27 Giugno 2013, 09:53:53 CEST
Ho comunque un problema che non riconosce "registerReceiver".. :(
Ho provato cosi ma nulla da fare, mi da un errore sul metodo. Method com......getRsiparmio(android.content.Intent, android.content.Context) in com..... can not be applied to ():

Codice (Java): [Seleziona]
public void getRisparmio(Intent intent, Context context) {

   IntentFilter ifilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED);
   Intent batteryStatus = context.registerReceiver(null, ifilter);
   int level = batteryStatus.getIntExtra(BatteryManager.EXTRA_LEVEL, -1);
   
   WifiManager wifiManager;
   if (level<10){
       wifiManager = (WifiManager) this.getSystemService(Context.WIFI_SERVICE);
       wifiManager.setWifiEnabled(false);
   }
}
public void getToggle(View view) {
    // is the toggle on?
    boolean on = ((ToggleButton) view).isChecked();
    if (on) {
      getRisparmio();
    } else {
      Toast.makeText(this, "..."), Toast.LENGHT_LONG.show();
    }
}
« Ultima modifica: 27 Giugno 2013, 11:08:14 CEST da punticci »

Offline GabMarioPower

  • Moderatore globale
  • Utente senior
  • *****
  • Post: 606
  • Respect: +152
    • Github
    • Google+
    • gabrielemariotti
    • GabMarioPower
    • Mostra profilo
  • Play Store ID:
    GAB+MARIO+DEV
  • Sistema operativo:
    Ubuntu 14.04 , Win 10
Re:Disabilitare wifi con toggle button dato un livello di carica della batteria
« Risposta #3 il: 27 Giugno 2013, 16:03:15 CEST »
0
Ahah mi hai risposto anche su stackoverflow ;) Comunque la mia domanda sucessiva su stackoverflow era: mettiamo caso che ho il 25% di batteria, entro nell'applicazione e clicco il bottone che mi fa partire la condizione del check del livello di batteria..Poi esco dall'app, smanetto un po e la batteria arriva al 10%.. La condizione resta attiva anche se sono al di fuori dell'app? Lui continua a controllare lo stato della batteria nel momento in cui ho premuto il bottone anche se era al 25%?

Se il codice getRisparmio() viene richiamato al click del button, no.
Devi registrare un BroadcastReceiver per il IntentFilter Intent.ACTION_BATTERY_LOW.
Non confondere questo Broadcast con l'altro. Questo intercetta l'evento spedito dal sistema quando la batteria è bassa.

Codice (Java): [Seleziona]
public class BatteryReceiver extends BroadcastReceiver {

    public void onReceive(Context context, Intent intent) {

           boolean batteryLow = intent.getAction().equals(Intent.ACTION_BATTERY_LOW);
           if (batteryLow){
                  ....
                   level = intent.getIntExtra(BatteryManager.EXTRA_LEVEL, -1);
                   if (level<xx) {
                     //call your code
                     //wifiManager.setWifiEnabled(false);
                   }
           }
    }
}

La registrazione di questo broadcast  la puoi fare sia a codice dentro l'Activity sia su Manifest dipende cosa vuoi ottenere.
Dai una occhiata a questo tutorial: http://www.anddev.it/index.php/topic,10114.0.html.

Citazione da: punticci
Ho comunque un problema che non riconosce "registerReceiver".. :(
Ho provato cosi ma nulla da fare, mi da un errore sul metodo. Method com......getRsiparmio(android.content.Intent, android.content.Context) in com..... can not be applied to ():

Il context...dipende da dove stai scrivendo il tuo metodo getRisparmio(). Se  è dentro l'Activity basta fare registerReceiver (il context sarebbe this in quel caso).

Offline punticci

  • Utente junior
  • **
  • Post: 78
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    nexus 4
Re:Disabilitare wifi con toggle button dato un livello di carica della batteria
« Risposta #4 il: 28 Giugno 2013, 08:47:45 CEST »
0
Dopo ci provo :-) intanto grazie!

Inviato dal mio Nexus 4


Post unito: 28 Giugno 2013, 10:19:43 CEST
Se il codice getRisparmio() viene richiamato al click del button, no.
Devi registrare un BroadcastReceiver per il IntentFilter Intent.ACTION_BATTERY_LOW.
Non confondere questo Broadcast con l'altro. Questo intercetta l'evento spedito dal sistema quando la batteria è bassa.

Codice (Java): [Seleziona]
public class BatteryReceiver extends BroadcastReceiver {

    public void onReceive(Context context, Intent intent) {

           boolean batteryLow = intent.getAction().equals(Intent.ACTION_BATTERY_LOW);
           if (batteryLow){
                  ....
                   level = intent.getIntExtra(BatteryManager.EXTRA_LEVEL, -1);
                   if (level<xx) {
                     //call your code
                     //wifiManager.setWifiEnabled(false);
                   }
           }
    }
}

La registrazione di questo broadcast  la puoi fare sia a codice dentro l'Activity sia su Manifest dipende cosa vuoi ottenere.
Dai una occhiata a questo tutorial: http://www.anddev.it/index.php/topic,10114.0.html.

Il context...dipende da dove stai scrivendo il tuo metodo getRisparmio(). Se  è dentro l'Activity basta fare registerReceiver (il context sarebbe this in quel caso).
Ma ancora una cosa non mi è chiara.. in questo tuo esempio dove sta il toggle? Cioè, io prima l'accensione/spegnimento del toggle usavo questo:
Codice (Java): [Seleziona]
public void getToggle(View view) {
    // is the toggle on?
    boolean on = ((ToggleButton) view).isChecked();
    if (on) {
      getRisparmio();
    } else {
      Toast.makeText(this, "..."), Toast.LENGHT_LONG.show();
    }
}
Ma non capisco come fare..perchè se io scrivo cosi:
Codice (Java): [Seleziona]
public class BatteryReceiver extends BroadcastReceiver {

    public void onReceive(Context context, Intent intent) {

           boolean batteryLow = intent.getAction().equals(Intent.ACTION_BATTERY_LOW);
           if (batteryLow){          
                   level = intent.getIntExtra(BatteryManager.EXTRA_LEVEL, -1);
                   if (level<10) {
                     //call your code
                     wifiManager = (WifiManager) this.getSystemService(Context.WIFI_SERVICE);
                     wifiManager.setWifiEnabled(false);
                   }
           }
    }
}
Dove gli dico del bottone? Scusa è che essendo ancora alle prime armi faccio un po fatica è che voglio andarne fuori in qualche modo :) penso che tu capisca.
« Ultima modifica: 28 Giugno 2013, 10:19:43 CEST da punticci, Reason: Merged DoublePost »

Offline punticci

  • Utente junior
  • **
  • Post: 78
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    nexus 4
Re:Disabilitare wifi con toggle button dato un livello di carica della batteria
« Risposta #5 il: 02 Luglio 2013, 12:28:09 CEST »
0
Giuro non ne vado fuori  :-(. Ora come ora mi si spegne il wifi nel momento in cui entro nell'applicazione se il livello di carica è inferiore al 10%..Ma dovrebbe essere una cosa che decido io se attivare o meno.. Non so proprio come potrei fare ma ne ho abbastanza bisogno.

Offline GabMarioPower

  • Moderatore globale
  • Utente senior
  • *****
  • Post: 606
  • Respect: +152
    • Github
    • Google+
    • gabrielemariotti
    • GabMarioPower
    • Mostra profilo
  • Play Store ID:
    GAB+MARIO+DEV
  • Sistema operativo:
    Ubuntu 14.04 , Win 10
Re:Disabilitare wifi con toggle button dato un livello di carica della batteria
« Risposta #6 il: 02 Luglio 2013, 13:18:09 CEST »
0
Onestamente non ho ben capito di cosa hai bisogno.

Proviamo a mettere in fila le cose.
Se ho ben capito tu vuoi un toggle che se attivo (on) , deve essere in grado di monitorare il livello della batteria in modo tale che se è inferiore a un dato livello, spenga la wifi,e la riattivi quando torna sopra la soglia.


Se è così una strada potrebbe essere quella di dichiarare  broadcast receiver dichiarati nel Manifest.

Codice (XML): [Seleziona]
<receiver
 android:name=".LowBatteryReceiver"
 android:enabled="false" >
      <intent-filter>
            <action android:name="android.intent.action.BATTERY_LOW" />
        </intent-filter>
</receiver>

<receiver
 android:name=".OkBatteryReceiver"
 android:enabled="false" >
      <intent-filter>
            <action android:name="android.intent.action.BATTERY_OKAY" />
        </intent-filter>
</receiver>

Questi due broadcast sono disabilitati.

Quando entri nella tua activity e selezioni ON sul toggle devi attivarli entrambi per poter intercettare gli eventi che riguardano la batteria.

Come è specificato nel tutorial che ti ho suggerito ( [Facile] Broadcast Receiver - Android Developers Italia), per abilitare/disabilitare un receiver devi usare:

Codice (Java): [Seleziona]
 PackageManager pm = getPackageManager();
   ComponentName compName =
        new ComponentName(getApplicationContext(),
            LowBatteryReceiver.class);
   pm.setComponentEnabledSetting(
        compName,
        PackageManager.COMPONENT_ENABLED_STATE_ENABLED,
        PackageManager.DONT_KILL_APP);

Quando togli il toggle devi chiaramente disattivarli.

Ora i due receiver quando sono attivi, devono chiudere la wifi o riattivarla in base all'evento sulla batteria.

Codice (Java): [Seleziona]
public class LowBatteryReceiver extends BroadcastReceiver {

    public void onReceive(Context context, Intent intent) {
             //call your code to Disable WiFi
    }
}


public class OkBatteryReceiver extends BroadcastReceiver {

    public void onReceive(Context context, Intent intent) {
             //call your code to Enable WiFi
    }
}

In questo modo il toggle, non va a fare nulla sulla batteria, ma va semplicemente ad attivare o disattivare i receiver.
Sono i receiver ad occuparsi di attivare/disattivare la wifi.
In ogni caso ti consiglio di capire bene il meccanismo dei Broadcast Receiver.

Fammi sapere se ho capito la problematica.

Offline punticci

  • Utente junior
  • **
  • Post: 78
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    nexus 4
Re:Disabilitare wifi con toggle button dato un livello di carica della batteria
« Risposta #7 il: 02 Luglio 2013, 14:16:47 CEST »
0
Onestamente non ho ben capito di cosa hai bisogno.

Proviamo a mettere in fila le cose.
Se ho ben capito tu vuoi un toggle che se attivo (on) , deve essere in grado di monitorare il livello della batteria in modo tale che se è inferiore a un dato livello, spenga la wifi,e la riattivi quando torna sopra la soglia.


Se è così una strada potrebbe essere quella di dichiarare  broadcast receiver dichiarati nel Manifest.

Codice (XML): [Seleziona]
<receiver
 android:name=".LowBatteryReceiver"
 android:enabled="false" >
      <intent-filter>
            <action android:name="android.intent.action.BATTERY_LOW" />
        </intent-filter>
</receiver>

<receiver
 android:name=".OkBatteryReceiver"
 android:enabled="false" >
      <intent-filter>
            <action android:name="android.intent.action.BATTERY_OKAY" />
        </intent-filter>
</receiver>

Questi due broadcast sono disabilitati.

Quando entri nella tua activity e selezioni ON sul toggle devi attivarli entrambi per poter intercettare gli eventi che riguardano la batteria.

Come è specificato nel tutorial che ti ho suggerito ( [Facile] Broadcast Receiver - Android Developers Italia), per abilitare/disabilitare un receiver devi usare:

Codice (Java): [Seleziona]
 PackageManager pm = getPackageManager();
   ComponentName compName =
        new ComponentName(getApplicationContext(),
            LowBatteryReceiver.class);
   pm.setComponentEnabledSetting(
        compName,
        PackageManager.COMPONENT_ENABLED_STATE_ENABLED,
        PackageManager.DONT_KILL_APP);

Quando togli il toggle devi chiaramente disattivarli.

Ora i due receiver quando sono attivi, devono chiudere la wifi o riattivarla in base all'evento sulla batteria.

Codice (Java): [Seleziona]
public class LowBatteryReceiver extends BroadcastReceiver {

    public void onReceive(Context context, Intent intent) {
             //call your code to Disable WiFi
    }
}


public class OkBatteryReceiver extends BroadcastReceiver {

    public void onReceive(Context context, Intent intent) {
             //call your code to Enable WiFi
    }
}

In questo modo il toggle, non va a fare nulla sulla batteria, ma va semplicemente ad attivare o disattivare i receiver.
Sono i receiver ad occuparsi di attivare/disattivare la wifi.
In ogni caso ti consiglio di capire bene il meccanismo dei Broadcast Receiver.

Fammi sapere se ho capito la problematica.
Beh intanto grazie per la disponibilità. Comunque quindi te dici che per il toggle devo fare una cosa simile?
Codice (Java): [Seleziona]
public void getToggle(View view) {
        // Is the toggle on?
        boolean on = ((ToggleButton) view).isChecked();
        if (on) {
                PackageManager pm = getPackageManager();
   ComponentName compName =
        new ComponentName(getApplicationContext(),
            LowBatteryReceiver.class);
            pm.setComponentEnabledSetting(
            compName,
            PackageManager.COMPONENT_ENABLED_STATE_ENABLED,
            PackageManager.DONT_KILL_APP);
        } else {               
                PackageManager pm = getPackageManager();
                ComponentName compName =
                new ComponentName(getApplicationContext(),
                LowBatteryReceiver.class);
               pm.setComponentEnabledSetting(
               compName,
               PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
               PackageManager.DONT_KILL_APP);          
          }
        }
?
Mentre poi per il wifi
Codice (Java): [Seleziona]
public class LowBatteryReceiver extends BroadcastReceiver {

    public void onReceive(Context context, Intent intent) {
        wifiManager = (WifiManager) MainActivity.this.getSystemService(Context.WIFI_SERVICE);
                        wifiManager.setWifiEnabled(false);
    }
}


public class OkBatteryReceiver extends BroadcastReceiver {

    public void onReceive(Context context, Intent intent) {
        wifiManager = (WifiManager) MainActivity.this.getSystemService(Context.WIFI_SERVICE);
                        wifiManager.setWifiEnabled(true);
    }
}
giusto? Comunque si il concetto è quello fondamentalmente. Ma la soglia è data dal battery low o posso deciderla io?

Post unito: 02 Luglio 2013, 14:43:36 CEST
Parte ma al click mi da il seguente errore;
Ho messo l'intero logcat come immagine
 :-(

Post unito: 02 Luglio 2013, 16:39:27 CEST
Penso di aver risolto quel problema, ora funziona tutto ho dovuto sistemare il manifest cosi
Codice: [Seleziona]
<receiver
    android:name="[b].MainActivity$[/b]OkBatteryReceiver"
    android:enabled="false" >

    <intent-filter>
        <action android:name="android.intent.action.BATTERY_OKAY" />
    </intent-filter>

</receiver>
poichè sono delle inner classes e quindi vanno referenziate con il $. Se non mi sbaglio. Comunque, come chiedevo prima, posso decidere una soglia tipo il 10%? Perchè ora presumo che solo nel momento in cui il BATTERY_LOW è in true si attiva questa "destione" del wifi giusto?

Post unito: 02 Luglio 2013, 19:52:57 CEST
Chiedo solo un'ultima cosa. Come faccio a settare lo stato del toggle? A farglielo "ricordare" anche quando esco e rientro nell'applicazione?

Post unito: 02 Luglio 2013, 20:26:38 CEST
Ecco cos'ho trovato con lo sharedpreferences.. che però non so dove inserire...

Codice (Java): [Seleziona]
//set Preference
SharedPreferences sharedPref = getActivity().getPreferences(Context.MODE_PRIVATE);
SharedPreferences.Editor editor = sharedPref.edit();
editor.putInt(getString(R.string.saved_high_score), newHighScore);
editor.commit();

//get Preference
SharedPreferences sharedPref = getActivity().getPreferences(Context.MODE_PRIVATE);
int defaultValue = getResources().getInteger(R.string.saved_high_score_default);
long highScore = sharedPref.getInt(getString(R.string.saved_high_score), defaultValue);
Scusate la mia ignoranza xD
« Ultima modifica: 02 Luglio 2013, 20:26:38 CEST da punticci, Reason: Merged DoublePost »

Offline GabMarioPower

  • Moderatore globale
  • Utente senior
  • *****
  • Post: 606
  • Respect: +152
    • Github
    • Google+
    • gabrielemariotti
    • GabMarioPower
    • Mostra profilo
  • Play Store ID:
    GAB+MARIO+DEV
  • Sistema operativo:
    Ubuntu 14.04 , Win 10
Re:Disabilitare wifi con toggle button dato un livello di carica della batteria
« Risposta #8 il: 02 Luglio 2013, 23:08:28 CEST »
0
Per le classi interne, basta che le crei come normali classi, non serve che siano interne.

Per le sharedPreferences, devi salvare il dato quando clicchi sul toggle, cioè quando lo modifichi.
Devi leggere il valore dalle sharedPreferences quando apri l'attivity (onCreate o onResume)  e valorizzare opportunamente il toggle a video.

Offline punticci

  • Utente junior
  • **
  • Post: 78
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    nexus 4
Re:Disabilitare wifi con toggle button dato un livello di carica della batteria
« Risposta #9 il: 02 Luglio 2013, 23:37:07 CEST »
0
Per le classi interne, basta che le crei come normali classi, non serve che siano interne.

Per le sharedPreferences, devi salvare il dato quando clicchi sul toggle, cioè quando lo modifichi.
Devi leggere il valore dalle sharedPreferences quando apri l'attivity (onCreate o onResume)  e valorizzare opportunamente il toggle a video.
ma in realtà quindi il codice delle sharedPreferences che ho messo bisogna adattarlo e non va buttato così com'è nel toggle giusto?

Inviato dal mio Nexus 4


Offline punticci

  • Utente junior
  • **
  • Post: 78
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    nexus 4
Re:Disabilitare wifi con toggle button dato un livello di carica della batteria
« Risposta #10 il: 03 Luglio 2013, 08:14:56 CEST »
0
Ok ottimo lo stato del toggle funziona usando le sharepreferences.unica cosa è che alla prima apertura dell'applicazione mi viene settato in "on".in realtà dovrebbe essere off la prima volta.o comunque finché non lo accendo io.

Inviato dal mio Nexus 4


Offline GabMarioPower

  • Moderatore globale
  • Utente senior
  • *****
  • Post: 606
  • Respect: +152
    • Github
    • Google+
    • gabrielemariotti
    • GabMarioPower
    • Mostra profilo
  • Play Store ID:
    GAB+MARIO+DEV
  • Sistema operativo:
    Ubuntu 14.04 , Win 10
Re:Disabilitare wifi con toggle button dato un livello di carica della batteria
« Risposta #11 il: 03 Luglio 2013, 08:49:56 CEST »
0
Ok ottimo lo stato del toggle funziona usando le sharepreferences.unica cosa è che alla prima apertura dell'applicazione mi viene settato in "on".in realtà dovrebbe essere off la prima volta.o comunque finché non lo accendo io.

Inviato dal mio Nexus 4

Codice (Java): [Seleziona]
 sharedPref.getBoolean(String key, boolean defValue);Returns the preference value if it exists, or defValue.


Offline punticci

  • Utente junior
  • **
  • Post: 78
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    nexus 4
Re:Disabilitare wifi con toggle button dato un livello di carica della batteria
« Risposta #12 il: 03 Luglio 2013, 10:17:27 CEST »
0
Codice (Java): [Seleziona]
 sharedPref.getBoolean(String key, boolean defValue);Returns the preference value if it exists, or defValue.
Nell'onCreate giusto?

Offline GabMarioPower

  • Moderatore globale
  • Utente senior
  • *****
  • Post: 606
  • Respect: +152
    • Github
    • Google+
    • gabrielemariotti
    • GabMarioPower
    • Mostra profilo
  • Play Store ID:
    GAB+MARIO+DEV
  • Sistema operativo:
    Ubuntu 14.04 , Win 10
Re:Disabilitare wifi con toggle button dato un livello di carica della batteria
« Risposta #13 il: 03 Luglio 2013, 10:42:47 CEST »
0
Nell'onCreate giusto?

Questo codice ti permette di recuperare un valore dalle shared e nel caso in cui non è definito gli assegna il default value.
Lo puoi mettere nel onCreate().

Offline punticci

  • Utente junior
  • **
  • Post: 78
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    nexus 4
Re:Disabilitare wifi con toggle button dato un livello di carica della batteria
« Risposta #14 il: 03 Luglio 2013, 11:03:18 CEST »
0
Questo codice ti permette di recuperare un valore dalle shared e nel caso in cui non è definito gli assegna il default value.
Lo puoi mettere nel onCreate().
Come al solito, GRAZIE.dopo provo r ti faccio sapere ;-)

Inviato dal mio Nexus 4