Autore Topic: Nascondere StatusBar dopo onResume()  (Letto 2691 volte)

Offline BeaN

  • Nuovo arrivato
  • *
  • Post: 19
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung GT-I5500 Corby
  • Sistema operativo:
    Windows XP SP2
Nascondere StatusBar dopo onResume()
« il: 08 Febbraio 2012, 03:39:16 CET »
0
Ciao, sono un "vecchio" programmatore di altri linguaggi che s'è ritrovato a dover fare i conti con Java dopo averlo abbandonato per parecchi anni, e ho avuto qualche difficoltà con determinate cose che vengo subito ad enunciare:

Ho fatto un'app che chiede un codice, dalla quale non è possibile uscire in nessun modo a meno che non lo si indovini. Tutti i tasti sono perfettamente disabilitati, il tasto Back, il tasto Call, il tasto Home (soprattutto), e via dicendo. La mia app gira in fullscreen, e anche questo funziona. Il problema si presenta però nella StatusBar o TaskBar, non so come si chiama di preciso, insomma nella barra in alto. :D

L'ho inizialmente disabilitata mettendo nel manifest:
Codice (XML): [Seleziona]
android:theme="@android:style/Theme.NoTitleBar.Fullscreen"e funziona, l'app parte senza titolo, in fullscreen e senza StatusBar, ma se lo schermo si oscura, al rientro nell'app la StatusBar ritorna a coprire un pezzo di app e non si toglie più.

Allora ho provato a mettere nel codice, dentro onCreate:
Codice (Java): [Seleziona]
requestWindowFeature(Window.FEATURE_NO_TITLE);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
                        WindowManager.LayoutParams.FLAG_FULLSCREEN);
setContentView(R.layout.main);
ma la situazione non cambia, quando parte funziona ma se lo schermo si oscura e poi si riaccende allora la barra è di nuovo presente e copre un pezzo di sopra della app.

Come posso fare per mantenere l'app sempre in primo piano o comunque per disabilitare del tutto la barra?

PS: So per certo che la cosa è fattibile perchè giorni fa stavo facendo un'app simile e anche se lo schermo si oscurava e ritornava, la barra non c'era mai, ma oltre a non avere ovviamente il sorgente di quell'app perchè era una prova di un altro codice, non ricordo assolutamente cosa avevo impostato per riuscirci.

Grazie per l'aiuto!!  ;-)

Offline BeaN

  • Nuovo arrivato
  • *
  • Post: 19
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung GT-I5500 Corby
  • Sistema operativo:
    Windows XP SP2
Re:Nascondere StatusBar dopo onResume()
« Risposta #1 il: 08 Febbraio 2012, 03:40:15 CET »
0
PS: Scusate, è il mio primo post, non so come si metta colorato il codice e non so nemmeno se la sezione è corretta.  :-[

Offline IacopoDeeNosee

  • Utente junior
  • **
  • Post: 128
  • Respect: +33
    • Google+
    • iacopodeenosee
    • Mostra profilo
    • visualhunter
  • Dispositivo Android:
    Samsung Nexus S - GT-I9023
  • Play Store ID:
    IacopoDeeNosee
  • Sistema operativo:
    Arch linux x86_64
Re:Nascondere StatusBar dopo onResume()
« Risposta #2 il: 08 Febbraio 2012, 21:05:11 CET »
0
strano nel mio caso è bastato settarlo nel tema in questo modo:
Codice (XML): [Seleziona]
<?xml version="1.0" encoding="utf-8"?>
<resources>
        <style name="test" parent="android:Theme.Black">
                <item name="android:windowNoTitle">true</item>
                <item name="android:windowFullscreen">true</item>
                ......
        </style>
</resources>
e poi lo dichiaro nel manifest:
Codice (XML): [Seleziona]
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
     android:versionName="0.9.3"
     package="net.iacopodeenosee.test"
     android:installLocation="auto" android:versionCode="6">
<application
        android:icon="@drawable/icon"
        android:label="@string/app_name"
        android:theme="@style/test">
        .......
in alternativa proverei a mettere il codice dentro onResume:
Codice (Java): [Seleziona]
@Override
protected void onResume(){
        super.onResume();
       
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN);
}
8y3

Offline BeaN

  • Nuovo arrivato
  • *
  • Post: 19
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung GT-I5500 Corby
  • Sistema operativo:
    Windows XP SP2
Re:Nascondere StatusBar dopo onResume()
« Risposta #3 il: 08 Febbraio 2012, 21:31:56 CET »
0
Scusa ma non ho capito in che punto dell'xml devo mettere il resources  :-[
ti incollo il mio xml:
Codice (XML): [Seleziona]
<?xml version="1.0" encoding="utf-8"?>
   <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
      android:layout_width="fill_parent"
      android:layout_height="fill_parent"
      android:layout_alignParentLeft="true"
      android:layout_alignParentRight="true"
      android:gravity="center_horizontal"
      android:orientation="vertical"
      android:scrollbarStyle="insideOverlay" >

      <TextView
         android:id="@+id/testo"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         android:layout_gravity="center"
         android:layout_marginTop="12dp"
         android:text="@string/testo"
         android:textSize="24dip" />

       <EditText
          android:id="@+id/password"
          android:layout_width="match_parent"
          android:layout_height="wrap_content"
          android:layout_gravity="center"
          android:inputType="number"
          android:password="true" android:layout_marginTop="12dp">

           <requestFocus />
       </EditText>

       <TextView
          android:id="@+id/testo3"
          android:layout_width="wrap_content"
          android:layout_height="wrap_content"
          android:layout_gravity="center_horizontal"/>

       <Button
          android:layout_width="100dip"
          android:layout_height="wrap_content"
          android:layout_gravity="center"
          android:onClick="invia"
          android:text="@string/invia" android:layout_marginTop="12dp"/>

       <Button
          android:id="@+id/button1"
          android:layout_width="wrap_content"
          android:layout_height="wrap_content"
          android:text="@string/button1"
          android:onClick="myClickHandler" android:layout_marginTop="90dp"/>

   </LinearLayout>

Avevo già provato a mettere lo stesso codice dentro onResume ma avevo dimenticato di dire che al momento di far partire l'applicazione va direttamente in crash ed è finita lì.

Offline IacopoDeeNosee

  • Utente junior
  • **
  • Post: 128
  • Respect: +33
    • Google+
    • iacopodeenosee
    • Mostra profilo
    • visualhunter
  • Dispositivo Android:
    Samsung Nexus S - GT-I9023
  • Play Store ID:
    IacopoDeeNosee
  • Sistema operativo:
    Arch linux x86_64
Re:Nascondere StatusBar dopo onResume()
« Risposta #4 il: 09 Febbraio 2012, 18:50:53 CET »
0
lo devi inserire all'interno di un file xml che crei nella cartella values,se il file lo chiami themes.xml il percorso sarà:
prj -> res -> values -> themes.xml
e all'interno ci metti la forma dichiarativa che trovi nel post precedente ricordati poi di modificare il manifest.xml per associare il tema all'applicazione.8y3

Offline BeaN

  • Nuovo arrivato
  • *
  • Post: 19
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung GT-I5500 Corby
  • Sistema operativo:
    Windows XP SP2
Re:Nascondere StatusBar dopo onResume()
« Risposta #5 il: 10 Febbraio 2012, 00:51:38 CET »
0
L'ho appena fatto ma anche così è la solita storia: prima è in fullscreen, se poi oscuro lo schermo e lo riaccendo appare la barra e non se ne va più via.  :-(

Offline BeaN

  • Nuovo arrivato
  • *
  • Post: 19
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung GT-I5500 Corby
  • Sistema operativo:
    Windows XP SP2
Re:Nascondere StatusBar dopo onResume()
« Risposta #6 il: 10 Febbraio 2012, 14:14:03 CET »
0
Allora...ho trovato il problema. In pratica questo funziona benissimo:
Codice (Java): [Seleziona]
@Override
protected void onResume(){
        super.onResume();
       
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN);
}

il problema è che nel mio codice c'è anche questo:
Codice (Java): [Seleziona]
public void onAttachedToWindow() { // non ho idea di cosa cavolo faccia
    super.onAttachedToWindow(); // ma non fa comparire l'home manager
    this.getWindow().setType(WindowManager.LayoutParams.TYPE_KEYGUARD); // ma al ritorno da schermo nero
} // fa vedere la barra di sopra

che, come puoi ben vedere dai commenti da terza elementare (:D) l'home manager non mi compare quando premo il tasto home, ma quando lo schermo riappare c'è la barra di sopra...ho provato a togliere quel codice e la barra non si vede più, ma l'home manager ritorna...
Suggerimenti per come posso ottenere le due cose?  ;-)

Offline IacopoDeeNosee

  • Utente junior
  • **
  • Post: 128
  • Respect: +33
    • Google+
    • iacopodeenosee
    • Mostra profilo
    • visualhunter
  • Dispositivo Android:
    Samsung Nexus S - GT-I9023
  • Play Store ID:
    IacopoDeeNosee
  • Sistema operativo:
    Arch linux x86_64
Re:Nascondere StatusBar dopo onResume()
« Risposta #7 il: 10 Febbraio 2012, 21:23:33 CET »
0
onAttachedToWindow() viene chiamata quando una view viene agganciata al layout,quel trick per disabilitare l home button è stato fixato sul android 4.x,perciò la tua app funzionerà fino alle api 13,poi non credo che sia più possibile mettere mano al suo funzionamento.Per risolvere il tuo problema potresti disabilitare il blocco dello schermo ma sarebbe come uccidere una zanzara col bazooka :) 8y3
Codice (Java): [Seleziona]
        @Override
        public void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
               
                requestWindowFeature(Window.FEATURE_NO_TITLE);
                getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
                                WindowManager.LayoutParams.FLAG_FULLSCREEN);
               
                KeyguardManager keyguardManager = (KeyguardManager)getSystemService(KEYGUARD_SERVICE);
                KeyguardLock lock = keyguardManager.newKeyguardLock(KEYGUARD_SERVICE);
                lock.disableKeyguard();

                setContentView(R.layout.main);

        }
       
        @Override
        public void onAttachedToWindow()
        {  
            this.getWindow().setType(WindowManager.LayoutParams.TYPE_KEYGUARD_DIALOG);    
            super.onAttachedToWindow();  
        }

Offline BeaN

  • Nuovo arrivato
  • *
  • Post: 19
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung GT-I5500 Corby
  • Sistema operativo:
    Windows XP SP2
Re:Nascondere StatusBar dopo onResume()
« Risposta #8 il: 10 Febbraio 2012, 21:45:26 CET »
0
Avevo pensato a una soluzione un po' estrema come questa, però purtroppo crasha subito all'avvio se aggiungo
Codice (Java): [Seleziona]
KeyguardManager keyguardManager = (KeyguardManager)getSystemService(KEYGUARD_SERVICE);
KeyguardLock lock = keyguardManager.newKeyguardLock(KEYGUARD_SERVICE);
lock.disableKeyguard();
.

Vorrei inserire il Logcat come suggerito ma non so quale parte prendere...

Offline IacopoDeeNosee

  • Utente junior
  • **
  • Post: 128
  • Respect: +33
    • Google+
    • iacopodeenosee
    • Mostra profilo
    • visualhunter
  • Dispositivo Android:
    Samsung Nexus S - GT-I9023
  • Play Store ID:
    IacopoDeeNosee
  • Sistema operativo:
    Arch linux x86_64
Re:Nascondere StatusBar dopo onResume()
« Risposta #9 il: 11 Febbraio 2012, 10:07:24 CET »
0
senza vedere il ogcat è difficile aiutarti ma è possibile che ti sei dimenticato di inserire nel manifest.xml il permesso per poter disabilitare il keyguard?
Codice (XML): [Seleziona]
<uses-permission android:name="android.permission.DISABLE_KEYGUARD"/>se non ti funziona posta il logcat,la parte interessante è quella in rosso,per semplificarti la ricerca eclipse ti permette di filtrare il contenuto del logcat in base al TAG,ti consiglio in questi casi di evidenziare dai warning in poi 8y3

Offline BeaN

  • Nuovo arrivato
  • *
  • Post: 19
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung GT-I5500 Corby
  • Sistema operativo:
    Windows XP SP2
Re:Nascondere StatusBar dopo onResume()
« Risposta #10 il: 11 Febbraio 2012, 14:15:06 CET »
0
Aspetta!! Mi sono appena accorto di una cosa!! La mia app FUNZIONA!!  :-o :-o

Nel mio cell ho GoLauncher EX come gestore grafico predefinito, e ogni volta che provavo l'app l'avviavo mentre ero sotto GoLauncher, e c'era questo problema della barra di sopra quando tornavo a schermo acceso, ma ora avevo fatto partire il cell senza il GoLauncher perchè si stava aggiornando, quindi era con la Home predefinita di Android, e magicamente al ritorno da schermo nero FUNZIONA!!  :-o L'ho provato più volte, schermo nero, ritorno, c'è il locker con la barra, faccio lo slide per sbloccare, ed ecco lì la mia app senza barra di sopra!! Quindi il problema si presenta SOLO quando c'è GoLauncher EX attivo mentre gira l'applicazione!

Quindi ha sempre funzionato e non me n'ero mai accorto!!  o_O

Faccio un paio di prove ulteriori e poi decido se mi va bene così oppure no...ma secondo te è fattibile ovviare a questo problema una volta capito che in effetti è colpa del GoLauncher?

Offline IacopoDeeNosee

  • Utente junior
  • **
  • Post: 128
  • Respect: +33
    • Google+
    • iacopodeenosee
    • Mostra profilo
    • visualhunter
  • Dispositivo Android:
    Samsung Nexus S - GT-I9023
  • Play Store ID:
    IacopoDeeNosee
  • Sistema operativo:
    Arch linux x86_64
Re:Nascondere StatusBar dopo onResume()
« Risposta #11 il: 11 Febbraio 2012, 14:26:21 CET »
0
ma sei sicuro che ti funzioni?ho fatto un paio di prove sull'emulatore è presentava il problema da te descritto sopra,non ho provato su un device fisico ma non credo che faccia differenza...il test l'ho fatto su android 2.2. 8y3

Offline BeaN

  • Nuovo arrivato
  • *
  • Post: 19
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung GT-I5500 Corby
  • Sistema operativo:
    Windows XP SP2
Re:Nascondere StatusBar dopo onResume()
« Risposta #12 il: 11 Febbraio 2012, 17:10:08 CET »
0
Ho cantato vittoria troppo presto...
Ho provato l'app prima e ha funzionato perfettamente, la barra non compariva mai se ero nella Home grafica predefinita, ma sempre con l'app avviata in modalità debug usb via Eclipse. Poi ho staccato l'usb e ho provato l'app senza debug, ma niente, stessa identica cosa di prima, la barra compare sempre al ritorno da schermo spento! Allora ho riattaccato l'usb e riprovato ma il momento magico è durato poco. Senza aver minimamente modificato il codice ora la barra compare anche con debug usb, e non riesco a toglierla.

M'è venuta una idea un po' malsana, se mi riesce posto il listato...

PS: Comunque no, mai provato su emulatore ma sempre su device fisico perchè per partire l'emulatore ci sta una vita...

Offline BeaN

  • Nuovo arrivato
  • *
  • Post: 19
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung GT-I5500 Corby
  • Sistema operativo:
    Windows XP SP2
Re:Nascondere StatusBar dopo onResume()
« Risposta #13 il: 12 Febbraio 2012, 02:50:03 CET »
0
Niente...ho provato e riprovato ma non sono riuscito nel mio intento.

A tal proposito ho pensato di aggirare il problema, mi spiego meglio:
L'app che sto facendo è a mio uso e consumo, la sto facendo mirata per il mio telefono perchè per un motivo che non sto qui a spiegare, non posso usare il PIN della mia SIM, e quindi avevo pensato di fare un'app che simulasse il funzionamento del PIN e con StartUp Manager la impostavo all'avvio.

L'app doveva essere sempre in fullscreen per non far aprire la StatusBar e con il tasto Home disabilitato per non poter uscire.

Per il tasto Home abbiamo risolto senza molti problemi, per la StatusBar invece il problema si presenta quando lo schermo si oscura e poi ritorna, perchè la StatusBar copre un pezzo di applicazione, e quindi ritorna visibile e funzionante, e può facilmente essere utilizzata per bypassare la richiesta del finto PIN.

Le soluzioni possono essere le seguenti:
1) al ritorno dallo screen lock l'applicazione deve comparire in totale foreground com'era prima che si oscurasse lo schermo;
2) intercettare il tasto Power e far rimanere acceso lo schermo;
3) disabilitare l'intera tastiera fisica durante il running dell'applicazione;
4) eliminare la StatusBar dall'inizio alla fine dell'applicazione.

Per quanto riguarda il punto 1 ci sto provando da giorni ormai, e con nessun risultato.
Per il punto 2 non capisco assolutamente a cosa possa servire il KeyEvent.KEYCODE_POWER visto che sembra messo lì giusto per riempire un buco dato che non viene mai rilevato.
Per disabilitare l'intera tastiera non ho idea di come si possa fare e non so nemmeno se si possa fare.
Per eliminare la StatusBar idem come sopra, non so come si faccia, tranne per il fatto di mettere l'app in fullscreen, ma spegnendo e riaccendendo sapete già come va a finire...

A questo punto mi è venuta l'ennesima idea "da non ripetere a casa", e mi sono imbattuto in questo link: [TUR]Disable Home key or change to Power key - xda-developers. In pratica editando /system/usr/keylayout/gpio-keys.kl si può impostare che al tasto POWER venga associato UNKNOWN così da disabilitarlo dal sistema. Ora, mi rendo conto che questa è l'idea più barbara e meno condivisibile per trovare una soluzione al mio problema, ma se facessi un'app che all'avvio elimina il tasto editando il file, poi faccio partire la mia app del finto PIN, e uscito da quella rimettessi a posto il tasto POWER...??  :-\ :-\

Alternative fattibili per eliminare o aggirare il tasto POWER?