簡體   English   中英

如何在android中制作應用程序鎖定應用程序?

[英]How to make app lock app in android?

我必須為 Android 開發一個應用程序儲物櫃,用戶可以在其中阻止應用程序,而其他用戶在沒有訪問密鑰的情況下無法訪問這些應用程序。

我已經安裝了一個應用程序,但我不知道如何鎖定這個應用程序。

請給我建議。

這不是堆棧溢出的工作方式。 你不能不嘗試任何東西就提出一個完整的解決方案。

對於您的應用程序的最基本版本,您需要執行三個功能。

  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 中,如果存在,您可以顯示任何帶有阻止消息的屏幕。

祝你好運!

假設您將鎖定應用程序的包名稱存儲在一個名為的表中:

並且你想調用一個名為的活動

密碼活動

當用戶啟動鎖定的應用程序時,您可以實現如下輪詢機制:

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以來,谷歌限制了后台服務,你必須想辦法讓你的服務始終保持活躍。 (這不是這個問題的范圍)關於這個的線索,考慮安排一個 JobService 和一個廣播接收器,當 android 殺死它時會重新安排你的服務。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM