0

私はアンドロイドが初めてです。ロック画面アプリを作成しています。私のアプリケーションでは、Home キー、Back キーなどの外部キーをすべて無効にしたいと考えています。

@Override
public void onBackPressed() {
    return;
    // Do nothing!
}

しかし、スタックオーバーフローで多くのサイトと質問を参照して、アプリのホームキーを無効にしました. しかし、何も機能しませんでした。API 16で動作する私のアプリ..私を助けてください。どんな助けでも大歓迎です。

事前にどうもありがとう

4

1 に答える 1

1

読むことをお勧めします: Androidで動作するキオスクモードを作成する方法

ホームボタンを無効にして、新しいアプリケーションが開かれたことを検出する

Android 4以降、ホームボタンを無効にする効果的な方法はありません. これが、別の小さなハックが必要な理由です。一般に、新しいアプリケーションがフォアグラウンドにあることを検出し、すぐにアクティビティを再開するという考え方です。

最初に、Service を拡張する KioskService というクラスを作成し、次のスニペットを追加します。

public class KioskService extends Service {
    private static final long INTERVAL = TimeUnit.SECONDS.toMillis(2); // periodic interval to check in seconds -> 2 seconds
    private static final String TAG = KioskService.class.getSimpleName();
    private static final String PREF_KIOSK_MODE = "pref_kiosk_mode";

    private Thread t = null;
    private Context ctx = null;
    private boolean running = false;

    @Override
    public void onDestroy() {
        Log.i(TAG, "Stopping service 'KioskService'");
        running =false;
        super.onDestroy();
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        Log.i(TAG, "Starting service 'KioskService'");
        running = true;
        ctx = this;
        
        // start a thread that periodically checks if your app is in the foreground
        t = new Thread(new Runnable() {
            @Override
            public void run() {
                do {
                    handleKioskMode();
                    try {
                        Thread.sleep(INTERVAL);
                    } catch (InterruptedException e) {
                        Log.i(TAG, "Thread interrupted: 'KioskService'");
                    }
                }while(running);
                stopSelf();
            }
        });

        t.start();
        return Service.START_NOT_STICKY;
    }

    private void handleKioskMode() {
        // is Kiosk Mode active? 
            if(isKioskModeActive()) {
                // is App in background?
            if(isInBackground()) {
                restoreApp(); // restore!
            }
        }
    }

    private boolean isInBackground() {
        ActivityManager am = (ActivityManager) ctx.getSystemService(Context.ACTIVITY_SERVICE);
        
        List<ActivityManager.RunningTaskInfo> taskInfo = am.getRunningTasks(1);
        ComponentName componentInfo = taskInfo.get(0).topActivity;
        return (!ctx.getApplicationContext().getPackageName().equals(componentInfo.getPackageName()));
    }

    private void restoreApp() {
        // Restart activity
        Intent i = new Intent(ctx, MyActivity.class);
        i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        ctx.startActivity(i);
    }
    
    public boolean isKioskModeActive(final Context context) {
        SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(context);
        return sp.getBoolean(PREF_KIOSK_MODE, false);
    }

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

次のメソッドを AppContext クラスに追加して、アプリケーション コンテキストの作成によってサービスを開始します。

@Override 
public void onCreate() {   
    super.onCreate();   
    instance = this;   
    registerKioskModeScreenOffReceiver();   
    startKioskService();  // add this 
}

private void startKioskService() { // ... and this method  
    startService(new Intent(this, KioskService.class)); 
}

最後に、サービス宣言と、フォアグラウンド プロセスを取得するためのアクセス許可をマニフェストに追加します。

<service android:name=".KioskService" android:exported="false"/>

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

基本的に、スレッドは、アプリケーションがフォアグラウンドで実行されているかどうかを 2 秒ごとにチェックします。そうでない場合、スレッドはすぐにアクティビティを再作成します。

于 2015-03-01T15:51:40.330 に答える