bei Spinner wird onKey nicht ausgelöst

  • 9 Antworten
  • Neuester Beitrag
Diskutiere bei Spinner wird onKey nicht ausgelöst im Android App Entwicklung im Bereich Betriebssysteme & Apps.
N

newpageart

Neues Mitglied
Hallo liebe Forengemeinde,

ich versuche derzeit einen KIOSK-Mode zu erstellen, damit der Benutzer die App nicht verlassen kann. Dies funktioniert auch schon ganz gut. Die Buttons werden mit folgendem Code abgefangen.

Code:
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if ((keyCode == KeyEvent.KEYCODE_BACK)) {      
            return true;
        }
        else if(keyCode == KeyEvent.KEYCODE_HOME){
            return true;
        }
        else if ((keyCode == KeyEvent.KEYCODE_CALL)) {       
            return true;
        }
        return super.onKeyDown(keyCode, event);
    }

    public void onAttachedToWindow()  
    {    
           this.getWindow().setType(WindowManager.LayoutParams.TYPE_KEYGUARD);       
           super.onAttachedToWindow();    
    }
Leider hat das ganze eine Schwachstelle. Beim öffnen eines Dialogs oder eines Spinners, wird die eingabe nicht abgefangen. Deshalb habe ich versucht das onKey des Spinners abzufangen, aber leider erhalte ich keine Reaktion.

Code:
Spinner sp1 = (Spinner) findViewById(R.id.spQuest);
        sp1.setOnKeyListener(new OnKeyListener() {           
            @Override
            public boolean onKey(View v, int keyCode, KeyEvent event) {
                Log.v("Test","onKey");   
                if (event.getAction()==KeyEvent.ACTION_DOWN && keyCode == KeyEvent.KEYCODE_ENTER) {
                    //do something here
                    return true;
                }
                return false;
            }
        });
Mache ich etwas falsch? Hat jemand eine andere Idee? Ich bin für jeden Vorschlag dankbar :)
Viele Grüße,
Tom
 
StefMa

StefMa

Dauergast
Wie die eingabe wird nicht "abgefangen"?
Bei Spinnern kann man doch gar nichts eingeben. Nur auswählen... Hat doch weniger mit KeyListenern zu tun...oder? :o

Gruß

€dit: Außerdem:
Key presses on soft input methods are not required to trigger the methods in this listener, and are in fact discouraged to do so. The default android keyboard will not trigger these for any key to any application targetting Jelly Bean or later, and will only deliver it for some key presses to applications targetting Ice Cream Sandwich or earlier.
Src: http://developer.android.com/reference/android/text/method/KeyListener.html
 
N

newpageart

Neues Mitglied
Ohh, das erklärt natürlich einiges. Mit Eingabe "abfangen" meinte ich den Tastendruck. Hat eventuell noch jemand eine Idee wie ich den Home-, Menu und Powerbutton abschalten kann?

Vielen Dank schonmal!

Viele Grüße,
Tom
 
A

amfa

Dauergast
Mich wundert viel mehr das du die überhaupt alle abfangen kannst.
Interessant ich dachte bisher das ist nicht möglich, ausserdem halte ich es sogar für schlecht, dass das geht :D

Damit kann ich ja auch wunderbar so ne Art "BKA Trojaner" basteln, wenn ich meine App noch als Autostart-App installiere.
 
StefMa

StefMa

Dauergast
Du kannst deine App als Launcher deklarierern. Dann kannst du sie alle überschreiben...

Gruß
 
N

newpageart

Neues Mitglied
Schönen guten morgen :)

@ StefMa:
Ich habe die App bereits als Launcher deklariert.
Code:
        <activity
            android:name=".MainActivity"
            android:label="@string/app_name" 
            android:screenOrientation="portrait" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />   
                <category android:name="android.intent.category.HOME" />
                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
        </activity>
Direkt in meinem Activity lassen sich die Buttons auch abfangen und ich kann sie somit unterdrücken. Allerdings funktioniert dies leider nicht wenn ich einen Dialog oder einen Spinner öffne.

Code:
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if ((keyCode == KeyEvent.KEYCODE_BACK)) {      
            return true;
        }
        else if(keyCode == KeyEvent.KEYCODE_HOME){
            return true;
        }
        else if ((keyCode == KeyEvent.KEYCODE_CALL)) {       
            return true;
        }
        return super.onKeyDown(keyCode, event);
    }

    public void onAttachedToWindow()  
    {    
           this.getWindow().setType(WindowManager.LayoutParams.TYPE_KEYGUARD);       
           super.onAttachedToWindow();    
    }
Gibt es da noch irgendweine Möglichkeit wie ich dort die Tasten ebenfalls unterdrücken kann?

@amfa: Es gibt bereits andere Apps die einen KIOSK Mode besitzen, deshalb muss es irgendwie möglich sein. Es geht darum jemandem ein Leihgerät zu geben, mit dem er nur eine App benutzen kann. So verhindert man das mit dem Gerät Unsinn angestellt wird.

Viele Grüße,
Tom
 
StefMa

StefMa

Dauergast
Dann stelle ich aber nochmal die Frage:
StefMa schrieb:
Bei Spinnern kann man doch gar nichts eingeben. Nur auswählen... Hat doch weniger mit KeyListenern zu tun...oder? :o
Und Dialoge haben auch nur in seltenen Fällen ein EditText...

Gruß
 
N

newpageart

Neues Mitglied
Mit "Eingabe" meine ich nicht die Eingabe über die Tastatur, sondern das Drücken der Hardware Taste (Home-, Back- und Power Button). Der Spinner oder Dialog wird geöffnet und jemand drückt den Home-, Back- oder Power Button. Dies möchte ich gern verhindern! Direkt im Activity, also ohne das Dialog oder Spinner geöffnet sind, funktioniert dies auch schon.

Viele Grüße,
Tom
 
StefMa

StefMa

Dauergast
Achsoooo :D
Naja, du musst dem Dialog und dem Spinner sagen, dass du die Kontrolle über die Buttons haben willst. Also sowas in der art:
Code:
spinner.setOnKeyListener(this);
dialog.setOnKeyListener(this);
Allerdings musst du dann natürlich auch den Quelltext dazu schreiben, was passiert wenn der Dialog offen ist und was beim drücken der Zurück tasta passiert...

gruß

€dit: Gibts sogar: http://developer.android.com/refere...ndroid.content.DialogInterface.OnKeyListener)
und bei Spinner das selbe ;)

€dit2: Achso, hast du ja im ersten Post ja schon gemacht :D Da fehlt halt das du KEYCODE_HOME und KEYCODE_BACK noch abfangen musst...
 
Zuletzt bearbeitet:
N

newpageart

Neues Mitglied
Dann liege ich mit meinem Ansatz doch nicht so falsch. Aber irgendwie klappt es leider nicht.
Ich habe nun nochmal alles in eine eigenes Activity gepackt um es einzeln zu testen, aber onKey wird nicht ausgelöst. Es müsste doch zumindest ein Eintrag im Logcat geben.

Hier ist der gesamte Code:
Code:
public class TestActivity extends Activity {
    
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_survey_start);

        Spinner sp1 = (Spinner) findViewById(R.id.spQuest);
        sp1.setOnKeyListener(new OnKeyListener() {           
            @Override
            public boolean onKey(View v, int keyCode, KeyEvent event) {
                Log.v("Test","onKey keyCode "+keyCode);   
                if ((keyCode == KeyEvent.KEYCODE_BACK)) {
                    Log.v("Test","KEYCODE_BACK");            
                    return true;
                }
                else if(keyCode == KeyEvent.KEYCODE_HOME){
                    Log.v("Test","KEYCODE_HOME");
                    return true;
                }
                else if ((keyCode == KeyEvent.KEYCODE_CALL)) {
                    Log.v("Test","KEYCODE_CALL");                
                    return true;
                }else{
                    return false;
                }
            }
        });

    }
    
    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        Log.d("button", new Integer(keyCode).toString());
        
        if ((keyCode == KeyEvent.KEYCODE_BACK)) {
            Log.v("Survey","KEYCODE_BACK");            
            return true;
        }
        else if(keyCode == KeyEvent.KEYCODE_HOME){
            Log.v("Survey","KEYCODE_HOME");
            return true;
        }
        else if ((keyCode == KeyEvent.KEYCODE_CALL)) {
            Log.v("Survey","KEYCODE_CALL");                
            return true;
        }
        return super.onKeyDown(keyCode, event);
    }

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

}
Viele Grüße,
Tom