41

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

4

2 に答える 2

56

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

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

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();

ここで、class-name はアプリケーションのパッケージ名を提供します。パッケージ名が常に一意であることがわかるように、パッケージ名を使用してアプリケーションを識別することをお勧めします。

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

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

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

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

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

キャンセルボタンにも同じコードが使われています。

于 2013-11-08T06:14:22.803 に答える
13

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

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

使用状況アクセス設定ページ

  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ます。

アプリをブロックする部分が来ました。この部分はAmitの回答でよくカバーされています. ただし、ユーザーがアプリを使用できないようにする方法を探している場合は、特定のアプリが起動されたときにホーム画面を開くのがコツです。

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

if(<NameOfBlockedApp>.equals currentApp){
     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;
}
于 2016-08-31T11:46:58.897 に答える