Lockscreen

R

Radiokucker

Neues Mitglied
0
Hallo liebes Android-Hilfe Forum,
ich entwickle im Moment meinen eigenen Lockscreen.
Um den Home-Button zu blockieren, damit der Lockscreen unumgehbar ist, habe ich den Lockscreen als Launcher im Android Manifest definiert.

<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>

Dies funktioniert auch einwandfrei, bloß möchte ich nach dem entsperren durch den klick auf den Home-Button natürlich wieder auf den "normlen" Launcher kommen und nicht auf den Lockscreen. Hat jemand eine Idee, wie sich das bewerkstelligen lässt?

Vielen Dank im Voraus,
Sven
 
Hallo scheu dir diese Beispiel mal an -> LockScreenApp/LockScreenApp at master · Joisar/LockScreenApp · GitHub

Ich bin jetzt nur mal drüber geflogen aber es funktioniert genauso wie du es beschrieben ahst jedoch hört er nciht auf den Homebutton....


edit: nochmal tiefer geschaut...unbedingt durchgucken und implementieren würde ich dir raten ;)
Code:
package com.mehuljoisar.lockscreen;

import android.app.Activity;
import android.app.KeyguardManager;
import android.content.Intent;
import android.os.Bundle;
import android.telephony.PhoneStateListener;
import android.telephony.TelephonyManager;
import android.util.Log;
import android.view.KeyEvent;
import android.view.View;
import android.view.WindowManager;
import android.view.WindowManager.LayoutParams;
import android.widget.Button;

import com.mehuljoisar.lockscreen.utils.LockscreenService;
import com.mehuljoisar.lockscreen.utils.LockscreenUtils;

public class LockScreenActivity extends Activity implements
        LockscreenUtils.OnLockStatusChangedListener {

    // User-interface
    private Button btnUnlock;

    // Member variables
    private LockscreenUtils mLockscreenUtils;

    // Set appropriate flags to make the screen appear over the keyguard
    @Override
    public void onAttachedToWindow() {
        this.getWindow().setType(
                WindowManager.LayoutParams.TYPE_KEYGUARD_DIALOG);
        this.getWindow().addFlags(
                WindowManager.LayoutParams.FLAG_FULLSCREEN
                        | WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED
                        | WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON
                        | WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD
                        );

        super.onAttachedToWindow();
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_lockscreen);

        init();

        // unlock screen in case of app get killed by system
        if (getIntent() != null && getIntent().hasExtra("kill")
                && getIntent().getExtras().getInt("kill") == 1) {
            enableKeyguard();
            unlockHomeButton();
        } else {

            try {
                // disable keyguard
                disableKeyguard();

                // lock home button
                lockHomeButton();

                // start service for observing intents
                startService(new Intent(this, LockscreenService.class));

                // listen the events get fired during the call
                StateListener phoneStateListener = new StateListener();
                TelephonyManager telephonyManager = (TelephonyManager) getSystemService(TELEPHONY_SERVICE);
                telephonyManager.listen(phoneStateListener,
                        PhoneStateListener.LISTEN_CALL_STATE);

            } catch (Exception e) {
            }

        }
    }

    private void init() {
        mLockscreenUtils = new LockscreenUtils();
        btnUnlock = (Button) findViewById(R.id.btnUnlock);
        btnUnlock.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                // unlock home button and then screen on button press
                unlockHomeButton();
            }
        });
    }

    // Handle events of calls and unlock screen if necessary
    private class StateListener extends PhoneStateListener {
        @Override
        public void onCallStateChanged(int state, String incomingNumber) {

            super.onCallStateChanged(state, incomingNumber);
            switch (state) {
            case TelephonyManager.CALL_STATE_RINGING:
                unlockHomeButton();
                break;
            case TelephonyManager.CALL_STATE_OFFHOOK:
                break;
            case TelephonyManager.CALL_STATE_IDLE:
                break;
            }
        }
    };

    // Don't finish Activity on Back press
    @Override
    public void onBackPressed() {
        return;
    }

    // Handle button clicks
    @Override
    public boolean onKeyDown(int keyCode, android.view.KeyEvent event) {

        if ((keyCode == KeyEvent.KEYCODE_VOLUME_DOWN)
                || (keyCode == KeyEvent.KEYCODE_POWER)
                || (keyCode == KeyEvent.KEYCODE_VOLUME_UP)
                || (keyCode == KeyEvent.KEYCODE_CAMERA)) {
            return true;
        }
        if ((keyCode == KeyEvent.KEYCODE_HOME)) {

            return true;
        }

        return false;

    }

    // handle the key press events here itself
    public boolean dispatchKeyEvent(KeyEvent event) {
        if (event.getKeyCode() == KeyEvent.KEYCODE_VOLUME_UP
                || (event.getKeyCode() == KeyEvent.KEYCODE_VOLUME_DOWN)
                || (event.getKeyCode() == KeyEvent.KEYCODE_POWER)) {
            return false;
        }
        if ((event.getKeyCode() == KeyEvent.KEYCODE_HOME)) {

            return true;
        }
        return false;
    }

    // Lock home button
    public void lockHomeButton() {
        mLockscreenUtils.lock(LockScreenActivity.this);
    }

    // Unlock home button and wait for its callback
    public void unlockHomeButton() {
        mLockscreenUtils.unlock();
    }

    // Simply unlock device when home button is successfully unlocked
    @Override
    public void onLockStatusChanged(boolean isLocked) {
        if (!isLocked) {
            unlockDevice();
        }
    }

    @Override
    protected void onStop() {
        super.onStop();
        unlockHomeButton();
    }

    @SuppressWarnings("deprecation")
    private void disableKeyguard() {
        KeyguardManager mKM = (KeyguardManager) getSystemService(KEYGUARD_SERVICE);
        KeyguardManager.KeyguardLock mKL = mKM.newKeyguardLock("IN");
        mKL.disableKeyguard();
    }

    @SuppressWarnings("deprecation")
    private void enableKeyguard() {
        KeyguardManager mKM = (KeyguardManager) getSystemService(KEYGUARD_SERVICE);
        KeyguardManager.KeyguardLock mKL = mKM.newKeyguardLock("IN");
        mKL.reenableKeyguard();
    }
  
    //Simply unlock device by finishing the activity
    private void unlockDevice()
    {
        finish();
    }

}


Darüber hinaus schau dir sein Android MAnifest an...obwohl da ncihts interressantes drin steht.

Aber seine Util Klassen sind der Schlüssel zum Erfolg.


Also einfach mal studieren und umsetzen ich finde seinen Lösungsansatz sehr Praktikabel deswegen empfehle ich das heir....


die MEthoden UnlockDevice(),lockHomeButton,unlockHomebutton und seien ganzen listener die er setzt unbedingt beachten.

So kommt auch nciht das Problem das deine Activity immer wieder gesatrtet wird weil es auf den HomeButton hört...
 
Zuletzt bearbeitet:
Hallo Jaiel,
Vielen Dan für deine Antwort!

Die Idee mit dem OverlayDialog in Form eines System Errors gefällt mir sehr gut. Leider funktioniert sie auf meinem Testgerät (Habe Android 5.0.2)trotzdem nicht so wie sie soll. (Ich habe einfach mal den ganzen Source Code von oben verwendet. Es funktioniert also nicht so wie er es implementiert hat)
Hie gelange ich jedoch durch einen klick auf den Home-Button wieder auf den Homescreen.
Habe ich etwas übersehen?
 
Ich würde empfehlen den Entwickler mal persönlich anzusprechen der sollte da kompetenter darauf antworten können warum sein Programm bei Android L nicht so will. Der wird sich bestimmt darüber freuen :)

Edit : Vielleicht hat das etwas mit der Deprecation zu tun siehe hier: er unterdrückt das ja auch


Code:
@SuppressWarnings("deprecation")
    private void disableKeyguard() {
        KeyguardManager mKM = (KeyguardManager) getSystemService(KEYGUARD_SERVICE);
        KeyguardManager.KeyguardLock mKL = mKM.newKeyguardLock("IN");
        mKL.disableKeyguard();
    }

    @SuppressWarnings("deprecation")
    private void enableKeyguard() {
        KeyguardManager mKM = (KeyguardManager) getSystemService(KEYGUARD_SERVICE);
        KeyguardManager.KeyguardLock mKL = mKM.newKeyguardLock("IN");
        mKL.reenableKeyguard();
    }


Schau mal hier wie du das lösen könntest: KeyguardManager.KeyguardLock | Android Developers


sonst fällt mir leider ncihts ein auf die Schnelle
 
OK ich werde mal schauen.
Ginge es nicht wie in meiner ursprünglichen Frage, dass ich den Lockscreen als Launcher festlege ? So hätte ich das Home-Button Problem "gelöst". Jetzt müsste ich eben noch nach der Entsperrung an einen anderen Launcher weiterleiten, wenn der Home-Button geklickt wird. Ist das machbar?
 
Mir fällt da grad kein Weg ein weil cih schlicht keine Ahnung habe mit Launchern und Widgets :(
Aber einen Launcher für einen Lockscreen aufzusetzen ist nicht gut finde ich...habe hier gelsen dass das von google ebenfalls nciht gewünscht wird weil man einstellung des Users verändert

java - How to reset default launcher/home screen replacement? - Stack Overflow

finde ich auch nachvollziehbar...
 
Das ist nachvollziehbar. Es muss aber doch klappen einen Lockscreen zu erstellen. Wie macht es denn z.B. CM-Locker?
 
Soll der Lockscreen das ganze Handy sperren oder nur die App?

Für eine App wäre mein Vorschlag es über einen BCR zu lösen. Funktioniert ziemlich gut - leider gibt es hin und wieder bei den Animationen leichte "Bugs". Also man kommt hin und wieder für ca. 1 sek in die App, bevor sie sich dann schließlich doch sperrt. Müsste mich da auch nochmal mit dem Debugger dran machen.

App:

Code:
public class App extends Application {

private Timer mActivityTransitionTimer;
private TimerTask mActivityTransitionTimerTask;
public boolean wasInBackground;

public void startActivityTransitionTimer(int minutes) {

long sessionTime = (minutes * 1000 * 60) + Const.MIN_ACTIVITY_TRANSITION_TIME_MS;

this.mActivityTransitionTimer = new Timer();

this.mActivityTransitionTimerTask = new TimerTask() {

public void run() {
App.this.wasInBackground = true;
}
};
this.mActivityTransitionTimer
.schedule(mActivityTransitionTimerTask, sessionTime);
}

public void stopActivityTransitionTimer() {
if (this.mActivityTransitionTimerTask != null) {
this.mActivityTransitionTimerTask.cancel();
}
if (this.mActivityTransitionTimer != null) {
this.mActivityTransitionTimer.cancel();
}
this.wasInBackground = false;
}
}


Code:
public class LoginActivity extends ActionBarActivity implements ResultsListener {

    private BroadcastReceiver mMessageReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context ctx, Intent intent) {
            finish();
        }
    };


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        loadPreferences();
        Logic.applyTheme(this);

        supportRequestWindowFeature(Window.FEATURE_PROGRESS);

        super.onCreate(savedInstanceState);

        LocalBroadcastManager.getInstance(this).registerReceiver(
                mMessageReceiver, new IntentFilter(Const.LBC_INTENT_TO_FINISH));

        setContentView(R.layout.activity_login);

        loginRoutine();

    }


    @Override
    protected void onResume() {
        super.onResume();
        App myApp = (App) this.getApplication();
        myApp.stopActivityTransitionTimer();
    }


    @Override
    protected void onPause() {
        super.onPause();

        if (!mDoNotLock) {
            if (mIsDirectLock) {
                ((App) this.getApplication()).startActivityTransitionTimer(0);
            } else {
                ((App) this.getApplication()).startActivityTransitionTimer(mDelayedLock);
            }
        }
        mDoNotLock = false;
    }


    @Override
    protected void onDestroy() {
        mP = null;

        LocalBroadcastManager.getInstance(this).unregisterReceiver(mMessageReceiver);

        super.onDestroy();
    }


... kurz: der Code funktioniert besser als er aussieht ;) weiß auch nicht was die Formattierung hier angestellt hat :p
 
Zuletzt bearbeitet:
Er soll schon das ganze Handy sperren, also ein Ersatz für den Android KeyGuard sein
 
Hat es denn mit dem fixen der Deprication geklappt?
 
Bin noch nicht dazu gekommen, werde vermutlich erst morgen wieder am Rechner sein.
 
Ich konnte die Deprecation leider nicht fixen. Es wurde vorgeschlagen es über die Flags zu machen, was der Entwickler aber sowieso schon gemacht hat...

public void onAttachedToWindow() {
this.getWindow().setType(
WindowManager.LayoutParams.TYPE_KEYGUARD_DIALOG);
this.getWindow().addFlags(
WindowManager.LayoutParams.FLAG_FULLSCREEN| WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED| WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON| WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD);

Hat noch jemand eine Idee, wie ich einen Lockscreen hinbekomme?
 

Ähnliche Themen

M
  • moppelg
Antworten
0
Aufrufe
975
moppelg
M
missspelled
  • missspelled
Antworten
6
Aufrufe
1.025
markus.tullius
markus.tullius
Mugendon
Antworten
1
Aufrufe
901
Mugendon
Mugendon
Zurück
Oben Unten