15

特定のユーザー指定のアプリでパスワード保護を有効にする Android アプリケーションのクラスがあります。たとえば、Android プロテクター。この問題に別の方向からアプローチする必要があります。

定義済みのホワイトリストにない限り、すべてのアクティビティの起動をブロックするアプリケーションを作成することはできますか? このアプローチで意図しない結果が生じることはありますか? 私は Android の基本に精通しており、かなり単純なアプリをいくつか作成しましたが、これらの「プロテクター」アプリが起動インテントを正しくインターセプトする方法をまだ理解しようとしています。誰かがこれを行う正しい方法について簡単な概要を教えてくれませんか?

基本的な問題は、クライアント (内部のみ) が「Need for Speed」などをプレイできなくてもカスタム アプリケーションにアクセスできるように、一般的な Android フォンをロックダウンする必要があることです。キャリアを削除したいと思います。ブロートウェアですが、デバイスをルート化することはメンテナンスの頭痛の種になるようです. 各電話のセットアップは、いくつかのカスタム アプリケーションをインストールするのと同じくらい簡単にしたいと考えています。

4

3 に答える 3

7

解決策を詳しく説明するために編集

概要

私の簡単な解決策は、アプリケーションに新しいサービスとアクティビティを追加することでした。このサービスはHandler、 とを使用しpostDelayedて、監視タスクを継続的にスケジュールします。監視タスクは、現在のアクティビティがホワイトリストにあることを確認します。現在実行中のアクティビティを取得するにはActivityManager、 と への呼び出しが必要getRunningTasksです。チェックが終了すると、監視タスクは X 秒 (私の場合は 1) 後に再び実行されるようにスケジュールされます。

最上位のアクティビティがホワイトリストにない場合、現在実行中のものにポップアップするブロッキング アクティビティを起動します。ブロッキング アクティビティの重要な部分は、それが をオーバーライドonBackPressedし、ユーザーが単純に「悪い」アクティビティに戻るのを防ぐことです。ホーム キーを押すことが、(私の知る限り) この画面を終了する唯一の方法です。

チップ

  • ロック画面にバックドアを構築します。たとえば、私のソリューションでは、戻るキーを長押しするとパスワードの入力が求められます。正しいパスワードを入力すると、監視サービスが 5 分間スリープ状態になるので、管理作業を行うことができます
  • ブロックされたアクティビティの名前を表示します
  • これをオンにする前に、適切なホワイトリストを収集してください! 必ずホワイトリストに登録する必要があるアクティビティ: ランチャー、パッケージ インストーラー、独自のアプリ (当然)、ブラウザー (アプリに Web ベースのコンポーネントがある場合)

サービスが常にバックグラウンドでループしているのが好きではありません。無駄に思えます。新しいタスクが開始されたときに通知を受ける方法を見つけたいのですが、それを行う方法が見つかりませんでした。モニター期間の特定の値と特定の電話のバッテリー使用量は許容範囲内です。ただし、これを自分で採用する前に必ずテストする必要があります。

于 2011-03-02T22:03:53.133 に答える
4

効果的な解決策であり、これが著者の意見からのコードです

public class MonitorService extends Service {

private Handler handler;
Runnable runnable;

@Override
public void onCreate() {
    // TODO Auto-generated method stub
    super.onCreate();
    handler = new Handler();
    runnable = new Runnable() {
        @Override
        public void run() {
            new Thread(new Runnable() {
                @Override
                public void run() {

                    ActivityManager am = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);

                    List<ActivityManager.RunningTaskInfo> taskInfo = am
                            .getRunningTasks(1);

                    ComponentName componentInfo = taskInfo.get(0).topActivity;                      
                    String currentActivityName=componentInfo.getClassName();
                    String packageName=componentInfo.getPackageName();
                    if(whitelist.contains(currentActivityName)){

                        Intent launchIntent = new Intent();
                        launchIntent.setComponent(new ComponentName(blockActivityPackageName,
                                blockActivityName));
                        launchIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                        startActivity(launchIntent);

                    }

                }
            }).start();
            handler.postDelayed(this, 1000);
        }
    };
    handler.postDelayed(runnable, 1000);
}

@Override
public void onStart(Intent intent, int startId) {
    super.onStart(intent, startId);
}

@Override
public IBinder onBind(Intent intent) {
    return null;
}

@Override
public void onDestroy() {
    super.onDestroy();
    Intent intent = new Intent(this, MonitorService.class);
    startService(intent);
}

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    return START_STICKY;
}
于 2013-05-14T06:19:18.880 に答える
0

あなたが示唆するように、カスタムランチャーを書くことはおそらくよりきれいでしょう。このオープン ソース ランチャーを参考にチェックしてください http://code.google.com/p/adw-launcher-android/

于 2011-03-14T10:52:30.410 に答える