web-dev-qa-db-ja.com

ブロックAndroidプログラムによるアプリ

デバイス内のすべてのアプリケーションをパスワードでロックしたいという意味で、このようなアプリを開発しようとしました。しかし、このソリューションのコードは見つかりませんでした。だから私は自分で開発しましたが、残念ながら成功しませんでした。 Androidデバイスをロックするための多くの解決策を見つけましたが、アプリをロックするための解決策は見つかりませんでした。解決策を提案していただければ幸いです。

32
thampi joseph

バックグラウンドサービスを使用して、どのアプリケーションがフォアグラウンドにあるかを確認しました(つまり、アプリケーションはユーザーによって使用されています)。次に、アプリケーションをロックする必要があるかどうかを確認します。

インストールされているすべてのアプリケーション(システムアプリケーションを除く)のリストを検索するには:

PackageManager packageManager = getPackageManager();
Intent mainIntent = new Intent(Intent.ACTION_MAIN, null);
mainIntent.addCategory(Intent.CATEGORY_LAUNCHER);

List<ResolveInfo> appList = packageManager.queryIntentActivities(mainIntent, 0);
Collections.sort(appList, new ResolveInfo.DisplayNameComparator(packageManager));
List<PackageInfo> packs = packageManager.getInstalledPackages(0);
for (int i = 0; i < packs.size(); i++) {
    PackageInfo p = packs.get(i);
    ApplicationInfo a = p.applicationInfo;
    // skip system apps if they shall not be included
    if ((a.flags & ApplicationInfo.FLAG_SYSTEM) == 1) {
        continue;
    }
    appList.add(p.packageName);
}

現在のフォアグラウンドアプリケーションを見つけるには:

ActivityManager mActivityManager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
List<ActivityManager.RunningTaskInfo> RunningTask = mActivityManager.getRunningTasks(1);
ActivityManager.RunningTaskInfo ar = RunningTask.get(0);
activityOnTop=ar.topActivity.getClassName();

ここで、クラス名はアプリケーションのパッケージ名を提供します。パッケージ名は常に一意であることがわかっているため、パッケージ名を使用してアプリケーションを識別することをお勧めします。

現在、アプリケーションをロックする機能:

フォアグラウンドで実行されているアプリケーションを見つけてロックするには、パスワードのEditTextと[OK]および[キャンセル]ボタンを持つ別のアクティビティを開始する必要があります。

Intent lockIntent = new Intent(mContext, LockScreen.class);
lockIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
mContext.startActivity(lockIntent);

[OK]をクリックして、パスワードが正しい場合、単純にfinish LockScreenアクティビティ。パスワードが正しくない場合は、次のコードを使用するだけで、アプリケーションが閉じられ、デバイスのホーム画面が表示されます。

Intent startHomescreen = new Intent(Intent.ACTION_MAIN);
startHomescreen.addCategory(Intent.CATEGORY_HOME);
startHomescreen.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(startHomescreen);

キャンセルボタンでも同じコードが使用されます。

51
Amit Gupta

上記のコメントで示唆されているように、これはまだ謎のようですので、この問題を解決するのに役立つコードを入れています。

getForegroundApp

_public String getForegroundApp() {
    String currentApp = "NULL";
    if (Android.os.Build.VERSION.SDK_INT >= Android.os.Build.VERSION_CODES.Lollipop) {
        UsageStatsManager usm = (UsageStatsManager) this.mContext.getSystemService(Context.USAGE_STATS_SERVICE);
        long time = System.currentTimeMillis();
        List<UsageStats> appList = usm.queryUsageStats(UsageStatsManager.INTERVAL_DAILY, time - 1000 * 1000, time);
        if (appList != null && appList.size() > 0) {
            SortedMap<Long, UsageStats> mySortedMap = new TreeMap<Long, UsageStats>();
            for (UsageStats usageStats : appList) {
                mySortedMap.put(usageStats.getLastTimeUsed(), usageStats);
            }
            if (mySortedMap != null && !mySortedMap.isEmpty()) {
                currentApp = mySortedMap.get(mySortedMap.lastKey()).getPackageName();
            }
        }
    } else {
        ActivityManager am = (ActivityManager) this.mContext.getSystemService(Context.ACTIVITY_SERVICE);
        List<ActivityManager.RunningAppProcessInfo> tasks = am.getRunningAppProcesses();
        currentApp = tasks.get(0).processName;
    }

    return currentApp;
}
_

getForegroundApp()を呼び出すと、パッケージ名を含むcurrentForegroundAppの名前を含む文字列が返されます。 _com.example.app_

このコードを使用するには、Manifestファイルに次のコード行が必要です。

_    <uses-permission Android:name="Android.permission.PACKAGE_USAGE_STATS" />
_

ユーザーを_Usage Data access Settings_に移動します:

sageAccessSettingsPage

_  public void usageAccessSettingsPage(){
    Intent intent = new Intent();
    intent.setAction(Settings.ACTION_USAGE_ACCESS_SETTINGS);
    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    Uri uri = Uri.fromParts("package", mContext.getPackageName(), null);
    intent.setData(uri);
    startActivity(intent);
}
_

または、手動で_LockScreen and Security_> _Other security settings_> _Usage access data_で検索します。

アプリをブロックする部分が来ました。この部分はアミットの答えで非常によくカバーされています。ただし、ユーザーがアプリの使用を制限する方法を探している場合は、特定のアプリの起動時にホーム画面を開くのがコツです。

これは、currentAppがブロックされたアプリと等しいときに次のメソッドを呼び出すことで実行できます。

_if(<NameOfBlockedApp>.equals currentApp){
     showHomeScreen();
   }
_

ShowHomeScreen

_ public boolean showHomeScreen(){
    Intent startMain = new Intent(Intent.ACTION_MAIN);
    startMain.addCategory(Intent.CATEGORY_HOME);
    startMain.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    mContext.startActivity(startMain);
    return true;
}
_
10
7geeky