Android: приложение Locker Screen не работает должным образом - PullRequest
0 голосов
/ 01 марта 2012

Вот в чём дело, я работаю над созданием простого приложения для блокировки экрана, которое в основном выполняет следующие действия:

  1. удаляет keygaurd
  2. отключает кнопки возврата домой и назад
  3. запускается всякий раз, когда экран включается после выключения.
  4. запускается при загрузке [еще не проверено]

Я СДЕЛАН МОЕЙ РАБОТОЙ ПРОГРАММОЙ и использовал тонны ссылок (особенно наstackoverflow) и до сих пор так много проблем

номер 1 работает отлично:)

номер 2 работает, но не так, как задумано, когда я нажимаю его,это открывает диалоговое окно, которое просит пользователя выбрать домашнее приложение ... Я не хочу этого!Я хочу сделать приложение для блокировки экрана, а не домашнее приложение.(код указан в конце)

номер 3 работает до разблокировки экрана, но после этого приложение не знает, как автоматически запускаться.Я реализовал Broadcast Receiver, который зарегистрирован в коде в методе onCreat () для активности экрана блокировки.Я думаю, что это проблема: S

номер 4 это не работает вообще!

Я тестировал с сервисом, но все еще не работал: '(


Код


Манифест Я уверенЯ использую правильные разрешения, не так ли?

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="himura.test.mylockertest"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk android:minSdkVersion="9" />

    <uses-permission android:name="android.permission.DISABLE_KEYGUARD"/>
    <uses-permission android:name="android.permission.WAKE_LOCK"/>
    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>


    <application
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name" 
        android:theme="@android:style/Theme.NoTitleBar.Fullscreen">

        <receiver 
            android:name=".EventsReciever"
            android:enabled="true" 
            android:exported="false">
            <intent-filter>
                <action android:name="android.intent.action.SCREEN_OFF"/>
                <action android:name="android.intent.action.SCREEN_ON"/>
                <action android:name="android.intent.action.BOOT_COMPLETED"/>
            </intent-filter>
        </receiver>

        <service 
            android:enabled="true"
            android:name=".UpdateService"/>

        <activity
            android:name=".LockPage"
            android:label="@string/app_name" >
            <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>
    </application>

</manifest>

активность макет очень прост, только одна кнопка, чтобы разблокировать:)

public class LockPage extends Activity {

    private Button ublockButton;

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

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        ///** FIRST THINGS FIRST, START THE SERVICE **/
        //startService(new Intent(this, myService.class));

        /** REGISTERING RECEIVER **/        
        IntentFilter filter = new IntentFilter(Intent.ACTION_SCREEN_ON);
        filter.addAction(Intent.ACTION_SCREEN_OFF);
        filter.addAction(Intent.ACTION_BOOT_COMPLETED);
        BroadcastReceiver mReceiver = new EventsReciever();
        registerReceiver(mReceiver, filter);

        /** SETTING CONTENT VIEW**/
        setContentView(R.layout.lockscreen);

        /** REMOVING KEYGUARD RECEIVER **/
        KeyguardManager keyguardManager = (KeyguardManager)getSystemService(KEYGUARD_SERVICE);
        KeyguardLock lock = keyguardManager.newKeyguardLock(KEYGUARD_SERVICE);
        lock.disableKeyguard();

        /** NORMAL CODE **/
        ublockButton = (Button)findViewById(R.id.bUnlock);
        ublockButton.setOnClickListener(new View.OnClickListener() {

            public void onClick(View v) {
                finish();
            }
        });
    }

    @Override
    public void onBackPressed() {
        // Don't allow back to dismiss.
        return;
    }

    //only used in lockdown mode
    @Override
    protected void onPause() {
        super.onPause();
        Log.i("event","onPause");
        // Don't hang around.
        finish();
    }

    @Override
    protected void onStop() {
        super.onStop();
        Log.i("event","onStop");
        // Don't hang around.
        finish();
    }

    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        return false;
    }

}

Broadcast Receiver это обрабатывает 3 вещи, включение / выключение экрана и завершение загрузки (или это должно быть), я тестировал с журналами

public class EventsReciever extends BroadcastReceiver {
//works before unlocking
//after unlocking, keygaurd still off, but receiver has stopped

    public static boolean wasScreenOn = true;
    @Override
    public void onReceive(Context context, Intent recievedIntent) {

        Log.i("Check","[BroadCastReciever] onRecieve()");

        if (recievedIntent.getAction().equals(Intent.ACTION_SCREEN_OFF)) {
            wasScreenOn = false;
            Log.i("Check","[BroadCastReciever] Screen went OFF");
        } else if (recievedIntent.getAction().equals(Intent.ACTION_SCREEN_ON)) {
            wasScreenOn = true;
            Log.i("Check","[BroadCastReciever] Screen went ON");

            Intent intent = new Intent(context, LockPage.class);
            context.startActivity(intent);
        }
        else if(recievedIntent.getAction().equals(Intent.ACTION_BOOT_COMPLETED))
        {
            Intent intent = new Intent(context, LockPage.class);
            context.startActivity(intent);
        //  Intent intent = new Intent(context, LockPage.class);
        //  context.startActivity(intent);
        //  Intent serviceLauncher = new Intent(context, UpdateService.class);
        //  context.startService(serviceLauncher);
        //  Log.v("TEST", "Service loaded at start");
        }
    }

}

Наконец,сервис сейчас ничего не делает, я пытался использовать его для запуска экрана блокировки после того, как он впервые разблокируется

public class myService extends Service{

    @Override
    public void onCreate() {

        /** INITIALIZE RECEIVER **/
        //RegisterReciever();

    }

    @Override
    public IBinder onBind(Intent intent) {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
    // The standard pattern for implementing a Service is to create and run a new thread from onStartCommand 
    // to perform the processing in the background and stop the Service when it’s complete
        //RegisterReciever();

        return Service.START_STICKY;
    }

    /*private void RegisterReciever(){
        IntentFilter filter = new IntentFilter(Intent.ACTION_SCREEN_ON);
        filter.addAction(Intent.ACTION_SCREEN_OFF);
        filter.addAction(Intent.ACTION_BOOT_COMPLETED);
        BroadcastReceiver mReceiver = new EventsReciever();
        registerReceiver(mReceiver, filter);
    }*/

}

больше проблем, которые я обнаружил наИнтернет включает в себя возврат строки состояния после включения экрана (очень плохо) в родной клавиатуре, есть строка состояния, но она не работает, есть ли способ сделать это?

isnЕсть ли способ просто активировать блокировку и сказать системе, что вы идете, использовать это как защиту ключей?

Ответы [ 3 ]

1 голос
/ 13 апреля 2013

, чтобы решить проблему номер 2 (удалить блокировку из домашнего приложения) удалить строку ниже из файла AndroidManifest.xml

<категория android: name = "android.intent.category.HOME" />

1 голос
/ 01 марта 2012

разве нет способа просто активировать блокировку и сказать системе, что здесь все готово, использовать это как защиту ключей?

Если вы создаете свою собственную прошивку, вероятно, есть способ заменить клавиатуру альтернативной реализацией, учитывая, что это делают большинство производителей устройств. Вы не можете заменить клавиатуру через SDK.

0 голосов
/ 03 сентября 2015

Услуги:

BroadcastReceiver mReceiver=null;

int ReadingBlock = 100;
String PasswordType;

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

    // Register receiver that handles screen on and screen off logic
    IntentFilter filter = new IntentFilter(Intent.ACTION_SCREEN_ON);
    filter.addAction(Intent.ACTION_SCREEN_OFF);
    mReceiver = new AutoStart();
    registerReceiver(mReceiver, filter);

}

@Override
public void onStart(Intent intent, int startId) {

    boolean screenOn = false;

    try{
        // Get ON/OFF values sent from receiver ( AEScreenOnOffReceiver.java )
        screenOn = intent.getBooleanExtra("screen_state", false);

    }catch(Exception e){}

    if (!screenOn){

    } else {
           Intent RegularPassword = new Intent(getApplicationContext(), ScreenLock.class);
            RegularPassword.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            getApplicationContext().startActivity(RegularPassword);
        }
    }
}

@Override
public IBinder onBind(Intent intent) {
    // TODO Auto-generated method stub
    return null;
}

@Override
public void onDestroy() {

    Log.i("ScreenOnOff", "Service  distroy");
    if(mReceiver!=null)
        unregisterReceiver(mReceiver);

}
...