デバイス内のすべてのアプリケーションをパスワードでロックしたいという意味で、このようなアプリを開発しようとしました。しかし、このソリューションのコードは見つかりませんでした。だから私は自分で開発しましたが、残念ながら成功しませんでした。 Androidデバイスをロックするための多くの解決策を見つけましたが、アプリをロックするための解決策は見つかりませんでした。解決策を提案していただければ幸いです。
バックグラウンドサービスを使用して、どのアプリケーションがフォアグラウンドにあるかを確認しました(つまり、アプリケーションはユーザーによって使用されています)。次に、アプリケーションをロックする必要があるかどうかを確認します。
インストールされているすべてのアプリケーション(システムアプリケーションを除く)のリストを検索するには:
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);
キャンセルボタンでも同じコードが使用されます。
上記のコメントで示唆されているように、これはまだ謎のようですので、この問題を解決するのに役立つコードを入れています。
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;
}
_