bei Spinner wird onKey nicht ausgelöst

N

newpageart

Neues Mitglied
0
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
 
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
 
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
 
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.
 
Du kannst deine App als Launcher deklarierern. Dann kannst du sie alle überschreiben...

Gruß
 
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
 
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ß
 
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
 
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:
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
 

Ähnliche Themen

M
  • MikelKatzengreis
Antworten
10
Aufrufe
223
swa00
swa00
D
Antworten
17
Aufrufe
408
datNeMo
D
M
Antworten
3
Aufrufe
166
moin
M
Zurück
Oben Unten