簡體   English   中英

如何禁用任何 android 應用程序,以便在我更改/按下應用程序中的某個按鈕之前無法打開它?

[英]How can i disable any android app such that it cannot be opened until i change/press some button in app?

我正在嘗試構建一個家長控制應用程序。 所以現在我想禁用或鎖定應用程序(如 Whatsapp、Facebook 等)。 我曾嘗試使用PackageManager.setComponentEnabledSetting() 但它拋出java.lang.SercurityException

那么我怎樣才能制作一個家長控制應用程序,這樣我就可以在沒有 root 的情況下禁用我想要的任何應用程序

我的代碼是

 pm.setComponentEnabledSetting(new ComponentName(temp.activityInfo.packageName,
                        temp.activityInfo.name+".class"),
                        PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
                        PackageManager.DONT_KILL_APP);

我的錯誤是這個

java.lang.SecurityException:權限拒絕:嘗試從 pid=11537、uid=10067、包 uid=10029 更改組件狀態

您必須添加以下權限才能清單。

<uses-permission android:name="android.permission.WRITE_SETTINGS"/>
<uses-permission android:name="android.permission.WRITE_SECURE_SETTINGS"/>

但是,這些權限是針對系統應用的,您不能使用。 :(

您不能編寫應用程序來鎖定或關閉另一個應用程序。這是 Google 的一項政策。 要鎖定應用程序,您必須反復檢查正在運行的應用程序,如果特定應用程序處於打開狀態,則在其上顯示活動。

while(!Thread.currentThread().isInterrupted())
{
    String topActivity = getFrontApp();

    if(topActivity.isEmpty())
    {
        threadSleep(500);
        continue;
    }


    if(topActivity.equals("lockApp"))
    {
        showLockActivity();
    }

    threadSleep(500);
}

// for Api21+ need permission
    public static String getFrontApp()
    {
        if (Build.VERSION.SDK_INT >= 21)
        {
            UsageStatsManager usageManager = SystemMaster.getUsageStatsManager();
            long now = System.currentTimeMillis();
            List<UsageStats> localList = usageManager.queryUsageStats(UsageStatsManager.INTERVAL_DAILY, now - 900_000L, now);
            String str = "";

            if (localList != null)
            {
                SortedMap<Long,UsageStats> mySortedMap = new TreeMap<>();

                for(UsageStats usageStats : localList)
                    mySortedMap.put(usageStats.getLastTimeUsed(), usageStats);

                if(!mySortedMap.isEmpty())
                    str =  mySortedMap.get(mySortedMap.lastKey()).getPackageName();
            }

            return str;
        }
        else
        {
            ActivityManager am = (ActivityManager) getApplication().getSystemService(Context.ACTIVITY_SERVICE);
            return am.getRunningTasks(1).get(0).topActivity.getPackageName();
    }

上面的代碼很簡單,真正的app一定要多寫。

暫無
暫無

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

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