Как программно установить блокировку или контакт для приложения

Поэтому сейчас я пытаюсь разработать приложение для Android для своих маленьких детей. Я хочу установить PIN-код или пароли для выбранных приложений в течение определенного времени, чтобы они не открывали приложение. Например, предположим, что моя дочь хочет играть сердитых птиц в течение некоторого времени на моем телефоне, пока я работаю. Я выберу свои важные приложения, такие как обмен сообщениями, 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(); 

EDITED: http://pastebin.com/MHGFw7PK

Solutions Collecting From Web of "Как программно установить блокировку или контакт для приложения"

логика

  • Вы должны сделать и запустить службу, когда хотите блокировать приложения,
  • И In Service вы должны проверять имена пакетов приложений, чтобы вы могли решить, какое приложение будет запускаться и какие операции с PIN-кодом или паролем

Теперь пример кода :

  • Чтобы запустить службу, введите код, подобный этому,

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