Как сделать приложение блокировки приложений в Android?

Мне нужно разработать шкафчик приложений для Android, в котором пользователь может блокировать приложения, а другие пользователи не могут получить доступ к этим приложениям без ключа доступа.

Я установил приложение, но не знаю, как его заблокировать.

Пожалуйста, предложите мне что-нибудь.


person Vishnu    schedule 28.03.2016    source источник
comment
Добро пожаловать в СО. Это не так, как работает SO. сначала обратитесь сюда   -  person Aks4125    schedule 28.03.2016
comment
github.com/quicklearner4991/Applocker-android   -  person Quick learner    schedule 01.08.2020


Ответы (2)


Это не то, как работает переполнение стека. Вы не можете просить полное решение, даже не попробовав ничего.

Для самой базовой версии вашего приложения вам необходимо выполнить три функции.

  1. Получите список всех установленных приложений на устройстве и покажите их в ListView с флажком. Если пользователь проверяет какое-либо приложение, добавьте приложение в другой список, скажем, BlockedAppsList (это будет список приложений, которые пользователь хочет заблокировать). Вы можете установить все приложения, используя следующий код:

    final PackageManager pm = getPackageManager();
    //get a list of installed apps.
    List<ApplicationInfo> packages = pm.getInstalledApplications(PackageManager.GET_META_DATA);
    
    for (ApplicationInfo packageInfo : packages) {
    Log.d(TAG, "Installed package :" + packageInfo.packageName);
    Log.d(TAG, "Source dir : " + packageInfo.sourceDir);
    Log.d(TAG, "Launch Activity :" + pm.getLaunchIntentForPackage(packageInfo.packageName)); 
    }
    
  2. Проверьте, какое текущее открытое приложение. Вы можете проверить, используя этот код:

    ActivityManager am = (ActivityManager) this.getSystemService(ACTIVITY_SERVICE);
    List l = am.getRecentTasks(1, ActivityManager.RECENT_WITH_EXCLUDED);
    Iterator i = l.iterator();
    PackageManager pm = this.getPackageManager();
    while (i.hasNext()) {
    ActivityManager.RunningAppProcessInfo info = (ActivityManager.RunningAppProcessInfo)(i.next());
    try {
    CharSequence c = pm.getApplicationLabel(pm.getApplicationInfo(
    info.processName, PackageManager.GET_META_DATA));
    Log.w("LABEL", c.toString());
    } catch (Exception e) {
    // Name Not FOund Exception
        }
       }
    
  3. Теперь проверьте, присутствует ли текущее приложение в BlockedAppsList, если оно есть, вы можете показать любой экран с сообщением о блокировке.

удачи!

person The Bat    schedule 28.03.2016
comment
всегда возвращать имя класса com.android.launcher2.Launcher - person Vishnu; 29.03.2016
comment
когда я нажимаю на приложение whatsup, оно должно возвращать имя пакета whatsup, но не сейчас. пожалуйста, направь меня - person Vishnu; 29.03.2016
comment
чтобы мгновенно узнать, какое приложение открыто, вам нужно написать код 2-го шага в сервисе - person The Bat; 29.03.2016
comment
где я буду вызывать службу, содержащую код второго шага - person Vishnu; 29.03.2016
comment
Вы можете позвонить при запуске приложения - person The Bat; 29.03.2016
comment
@ Вишну, он так занят, забыл принять твой ответ :) - person Tejas Pandya; 01.02.2018
comment
Я запустил службу, но как данный код в службе узнает, что какая-то активность была запущена, пожалуйста, объясните. Я много искал фильтр намерений для регистрации, но ничего не нашел. - person Panache; 11.02.2018
comment
@Panache, второй фрагмент кода делает это за вас, он продолжает проверять приложения на переднем плане. - person The Bat; 12.02.2018
comment
@TheBat Я следил за вашим ответом для создания чего-то подобного, но я как бы застрял при запуске действия блокировки. Не могли бы вы уделить немного времени и взглянуть на него? здесь - person Rupesh Bhandari; 16.04.2020
comment
github.com/quicklearner4991/Applocker-android - person Quick learner; 01.08.2020

Предполагая, что вы храните имена пакетов заблокированных приложений в таблице с именем:

замки

и вы хотите вызвать действие с именем

ПарольАктивность

когда пользователи запускают заблокированное приложение, вы можете реализовать механизм опроса, как показано ниже:

public class CheckAppLaunchThread extends Thread {

private Context context;
private Handler handler;
private ActivityManager actMan;
private int timer = 100;
public static final String TAG = "App Thread";
public static String lastUnlocked;

// private String lastUnlocked;

public CheckAppLaunchThread(Handler mainHandler, Context context) {
    this.context = context;
    this.handler = mainHandler;
    actMan = (ActivityManager) context
            .getSystemService(Context.ACTIVITY_SERVICE);
    this.setPriority(MAX_PRIORITY);
}

@Override
public void run() {
    context.startService(new Intent(context, AppLockService.class));
    Looper.prepare();
    String prevTasks;
    String recentTasks = "";

    prevTasks = recentTasks;
    Log.d("Thread", "Inside Thread");
    while (true) {
        try {
            String topPackageName = "";
            if(Build.VERSION.SDK_INT >= 21) {
                UsageStatsManager mUsageStatsManager = (UsageStatsManager) context.getSystemService("usagestats");                       
                long time = System.currentTimeMillis(); 
                // We get usage stats for the last 10 seconds
                List<UsageStats> stats = mUsageStatsManager.queryUsageStats(UsageStatsManager.INTERVAL_DAILY, time - 1000*5, time);                                    
                if(stats != null) {
                    SortedMap<Long,UsageStats> mySortedMap = new TreeMap<Long,UsageStats>();
                    for (UsageStats usageStats : stats) {
                        mySortedMap.put(usageStats.getLastTimeUsed(),usageStats);
                    }                    
                    if(mySortedMap != null && !mySortedMap.isEmpty()) {
                        topPackageName =  mySortedMap.get(mySortedMap.lastKey()).getPackageName();                                   
                    }                                       
                }
            }
            else {
                topPackageName = actMan.getRunningAppProcesses().get(0).processName;
            }
            recentTasks = topPackageName;
            Thread.sleep(timer);
            if (recentTasks.length()==0 || recentTasks.equals(
                    prevTasks)) {
            } else {
                if (isAppLocked(recentTasks)) {
                    Log.d(TAG, "Locked " + recentTasks);
                    handler.post(new RequestPassword(context, recentTasks));
                }
            }

        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        prevTasks = recentTasks;

    }

}

class ToastRunnable implements Runnable {

    String message;

    public ToastRunnable(String text) {
        message = text;
    }

    @Override
    public void run() {
        Toast.makeText(context, message, Toast.LENGTH_SHORT).show();

    }
}

class RequestPassword implements Runnable {

    private Context mContext;
    private String pkgName;

    public RequestPassword(Context mContext, String pkgName) {
        this.mContext = mContext;
        this.pkgName = pkgName;
    }

    @Override
    public void run() {

        Intent passwordAct = new Intent(context, PasswordActivity.class);
        passwordAct.putExtra("PACKAGE_NAME", pkgName);
        passwordAct.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_ACTIVITY_SINGLE_TOP);
        this.mContext.startActivity(passwordAct);

    }

}

private boolean isAppLocked(String packageName) {
    if (packageName.equals(PasswordActivity.lastUnlocked)) {
        return false;
    }
    PasswordActivity.lastUnlocked = null;
    DatabaseHelper dbHelper = new DatabaseHelper(context);
    SQLiteDatabase db = dbHelper.getReadableDatabase();
    Cursor cursor = db.rawQuery("SELECT * FROM locks WHERE package_name=\'"
            + packageName + "\'", null);
    boolean isLocked = false;
    if (cursor.moveToNext()) {
        isLocked = true;
    }

    cursor.close();
    db.close();
    dbHelper.close();
    return isLocked;
}

}

Теперь вы должны вызвать приведенный выше код из своего сервиса следующим образом:

@Override
public void onCreate() {
    handler = new Handler(getMainLooper());
    context = getApplicationContext();
    launchChecker = new CheckAppLaunchThread(handler, context);
    super.onCreate();
}

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    while (true) {
        if (!launchChecker.isAlive())
            launchChecker.start();
        return START_STICKY;

    }
}

Внимание! Начиная с Oreo, Google ограничивает работу фоновых служб, и вы должны найти способ всегда поддерживать свою службу в рабочем состоянии. (это не входит в рамки этого вопроса), чтобы понять это, рассмотрите возможность планирования JobService и широковещательного приемника, который будет переназначать ваш сервис, когда когда-либо его убивает андроид.

person sarpedon montecarlo    schedule 16.12.2019
comment
Активность пароля открыта только для моего пакета. Другие вещи работают нормально, например, тост перед открытием другого приложения, но активность не открывается - person Ranjeet Chouhan; 22.04.2020