Как программно установить блокировку или пин-код для приложения
Поэтому сейчас я пытаюсь разработать приложение для Android для своих маленьких детей. Я хочу установить пин-код или пароль для выбранных приложений на определенное время, чтобы они не открывали приложение. Например, допустим, что моя дочь хочет поиграть в злые птицы на моем телефоне, пока я работаю. Я выберу свои важные приложения, такие как обмен сообщениями, Gmail и т. Д., И добавлю пин-код или пароль на 30 минут, пока она играет злых птиц. Через 30 минут я получаю телефон от дочери и могу открыть приложение без булавки, потому что истек срок.
Я провел массу исследований по этому вопросу, но я не смог найти реализацию для моего конкретного случая.
Как работают приложения "блокировка приложений" для Android?
Я знаю, что блокировка приложения имеет похожую структуру того, что я хочу сделать. Я просто установил ограничение по времени для блокировки.
https://play.google.com/store/apps/details?id=com.domobile.applock&hl=en
Я стараюсь не убивать действия / приложения с помощью ActivityManager и т. Д. Мне просто нужен чистый экран блокировки выбранного приложения на определенное время.
У меня есть CountdownTimer для обратного отсчета таймера в течение установленного времени. Как бы я изменил этот код, чтобы заблокировать определенные приложения на выбранный период времени, если бы у меня было все имя пакета?
start_timer.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
new AlertDialog.Builder( MainActivity.this )
.setMessage( "Are you sure you want to block the selected apps for the set amount of time?" )
.setPositiveButton( "Yeah man!", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
Log.d( "AlertDialog", "Positive" );
hourint = Integer.valueOf(number_text.getText().toString());
minuteint = Integer.valueOf(minute_text.getText().toString());
secondint = Integer.valueOf(second_text.getText().toString());
Log.i("YourActivity", "Hours: " + hourint);
Log.i("YourActivity", "Minutes: " + minuteint);
Log.i("YourActivity", "Seconds: " + secondint);
totalTimeCountInMilliseconds = ((hourint*60*60) +(minuteint*60) + (secondint)) * 1000; // time count
timeBlinkInMilliseconds = 30*1000;
countDownTimer = new CountDownTimer(totalTimeCountInMilliseconds, 500) {
// 500 means, onTick function will be called at every 500 milliseconds
@Override
public void onTick(long leftTimeInMilliseconds) {
Context context = MainActivity.this;
long seconds = leftTimeInMilliseconds / 1000;
mSeekArc.setVisibility(View.INVISIBLE);
start_timer.setVisibility(View.INVISIBLE);
block_button1.setVisibility(View.INVISIBLE);
if ( leftTimeInMilliseconds < timeBlinkInMilliseconds ) {
// textViewShowTime.setTextAppearance(getApplicationContext(), R.style.blinkText);
// change the style of the textview .. giving a red alert style
if ( blink ) {
number_text.setVisibility(View.VISIBLE);
minute_text.setVisibility(View.VISIBLE);
second_text.setVisibility(View.VISIBLE);
// if blink is true, textview will be visible
} else {
number_text.setVisibility(View.INVISIBLE);
minute_text.setVisibility(View.INVISIBLE);
second_text.setVisibility(View.INVISIBLE);
}
blink = !blink; // toggle the value of blink
}
second_text.setText(String.format("%02d", seconds % 60));
minute_text.setText(String.format("%02d", (seconds / 60) % 60));
number_text.setText(String.format("%02d", seconds / 3600)); // format the textview to show the easily readable format
}
@Override
public void onFinish() {
// this function will be called when the timecount is finished
//textViewShowTime.setText("Time up!");
number_text.setVisibility(View.VISIBLE);
minute_text.setVisibility(View.VISIBLE);
second_text.setVisibility(View.VISIBLE);
mSeekArc.setVisibility(View.VISIBLE);
start_timer.setVisibility(View.VISIBLE);
block_button1.setVisibility(View.VISIBLE);
}
}.start();
}
})
.setNegativeButton("Nope!", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
Log.d("AlertDialog", "Negative");
dialog.cancel();
}
})
.show();
Отредактировано: http://pastebin.com/MHGFw7PK
4 ответа
логика
- Вы должны создать и запустить службу, когда хотите заблокировать приложения,
- А в Сервисе вы должны проверить названия пакетов приложений, чтобы вы могли решить, какое приложение запускать, а какое показывать действия с пин-кодами и паролями.
Пример кода:
Чтобы запустить службу, введите такой код,
startService(new Intent(this, SaveMyAppsService.class));
Теперь, внутри вашего сервиса, проверьте пакеты, как это,
public class SaveMyAppsService extends android.app.Service { String CURRENT_PACKAGE_NAME = {your this app packagename}; String lastAppPN = ""; boolean noDelay = false; public static SaveMyAppsService instance; @Override public IBinder onBind(Intent intent) { // TODO Auto-generated method stub return null; } @Override public int onStartCommand(Intent intent, int flags, int startId) { // TODO Auto-generated method stub scheduleMethod(); CURRENT_PACKAGE_NAME = getApplicationContext().getPackageName(); Log.e("Current PN", "" + CURRENT_PACKAGE_NAME); instance = this; return START_STICKY; } private void scheduleMethod() { // TODO Auto-generated method stub ScheduledExecutorService scheduler = Executors .newSingleThreadScheduledExecutor(); scheduler.scheduleAtFixedRate(new Runnable() { @Override public void run() { // TODO Auto-generated method stub // This method will check for the Running apps after every 100ms if(30 minutes spent){ stop(); }else{ checkRunningApps(); } } }, 0, 100, TimeUnit.MILLISECONDS); } public void checkRunningApps() { ActivityManager mActivityManager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE); List<ActivityManager.RunningTaskInfo> RunningTask = mActivityManager.getRunningTasks(1); ActivityManager.RunningTaskInfo ar = RunningTask.get(0); String activityOnTop = ar.topActivity.getPackageName(); Log.e("activity on TOp", "" + activityOnTop); // Provide the packagename(s) of apps here, you want to show password activity if (activityOnTop.contains("whatsapp") // you can make this check even better || activityOnTop.contains(CURRENT_PACKAGE_NAME)) { // Show Password Activity } else { // DO nothing } } public static void stop() { if (instance != null) { instance.stopSelf(); } } }
Изменить: (Получить топ-имя пакета для Lollipop)
String lastAppPN = "";
public void checkRunningApps() {
ActivityManager mActivityManager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
String activityOnTop;
if (Build.VERSION.SDK_INT > 20) {
activityOnTop = mActivityManager.getRunningAppProcesses().get(0).processName;
} else {
List<ActivityManager.RunningTaskInfo> RunningTask = mActivityManager.getRunningTasks(1);
ActivityManager.RunningTaskInfo ar = RunningTask.get(0);
activityOnTop = ar.topActivity.getPackageName();
}
//Log.e("activity on TOp", "" + activityOnTop);
// Provide the packagename(s) of apps here, you want to show password activity
if (activityOnTop.contains("whatsapp") // you can make this check even better
|| activityOnTop.contains(CURRENT_PACKAGE_NAME)) {
if (!(lastAppPN.equals(activityOnTop))) {
lastAppPN = activityOnTop;
Log.e("Whatsapp", "started");
}
} else {
if (lastAppPN.contains("whatsapp")) {
if (!(activityOnTop.equals(lastAppPN))) {
Log.e("Whatsapp", "stoped");
lastAppPN = "";
}
}
// DO nothing
}
}
Я создал небольшой демонстрационный проект. Надеюсь, это может быть кому-то полезно Ссылка на проект
Вы также можете использовать DialogAlertView:
- Используйте общие настройки, чтобы сохранить пароль в хранилище.
- Если пользователь включил пароль для приложения, то показать предупреждение на домашней странице
- Спросите пароль, подтвердите, если он равен сохраненному паролю.
- Если да, закройте представление предупреждений, а если неправильно, снова отобразите представление предупреждений.
- Убедитесь, что представление предупреждений setCancellable() имеет значение false
- Вы можете иметь свой собственный дизайн и анимацию в представлении
Я думаю, это легко сделать. Никто не может взломать пароль также. Предположим, что если кто-то удалит (или очистит данные) приложение, ему придется снова войти в систему или зарегистрироваться (что более безопасно).
Совет — вы можете сохранить пароль в облаке или где угодно.