Вот в чём дело, я работаю над созданием простого приложения для блокировки экрана, которое в основном выполняет следующие действия:
- удаляет keygaurd
- отключает кнопки возврата домой и назад
- запускается всякий раз, когда экран включается после выключения.
- запускается при загрузке [еще не проверено]
Я СДЕЛАН МОЕЙ РАБОТОЙ ПРОГРАММОЙ и использовал тонны ссылок (особенно на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Есть ли способ просто активировать блокировку и сказать системе, что вы идете, использовать это как защиту ключей?