web-dev-qa-db-ja.com

Androidロック画面アプリのようにホームボタンを無効にする方法は?

私はこの質問が何度も尋ねられることを知っていますが、どのソリューションも機能していないことがわかりました。以下のコードを試しました...

   protected void onPause() {
   super.onPause();
    Intent intent = new Intent(this,LockActivity.class);
    intent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT |Intent.FLAG_ACTIVITY_NEW_TASK);
    startActivity(intent);
    }

Androidホーム画面が起動されたときに現在のアクティビティを再び前面に表示しますが、ホーム画面が起動されたときにアクティビティを前面に表示するには約3〜4秒かかります。

ホームボタンをクリックしてもホーム画面が起動しないロック画面アプリをいくつか使用しました。そのようなことを達成したいです。

また、onUserLeavesHintメソッド、onKeyDownメソッド、およびonKeyDispatchメソッドも使用しましたが、どれも機能しませんでした。

Androidのホームボタンを無効にすることはできないので、答えたりコメントしたりしないでください。このような回答やコメントについては、PlayStoreのロック画面アプリをいくつかお使いになることをお勧めします。また、ソースコードに沿ってgithubで動作するアプリを見つけました。それは私の携帯電話で動作しており、アプリはdisableKeyguardを使用していましたが、アプリで同じことを行うと動作しません(disableKeyguardは非推奨ですが、@ supress warnings( "deprecation")を使用します)。

17
Ruag

ソース- https://github.com/shaobin0604/Android-HomeKey-Locker

//Copy this class
public class HomeKeyLocker {
    private OverlayDialog mOverlayDialog;
    public void lock(Activity activity) {
        if (mOverlayDialog == null) {
            mOverlayDialog = new OverlayDialog(activity);
            mOverlayDialog.show();
        }
    }
    public void unlock() {
        if (mOverlayDialog != null) {
            mOverlayDialog.dismiss();
            mOverlayDialog = null;
        }
    }
    private static class OverlayDialog extends AlertDialog {

        public OverlayDialog(Activity activity) {
            super(activity, R.style.OverlayDialog);
            WindowManager.LayoutParams params = getWindow().getAttributes();
            params.type =  WindowManager.LayoutParams.TYPE_SYSTEM_ERROR;
            params.dimAmount = 0.0F; // transparent
            params.width = 0;
            params.height = 0;
            params.gravity = Gravity.BOTTOM;
            getWindow().setAttributes(params);
            getWindow().setFlags( WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED |  WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL, 0xffffff);
            setOwnerActivity(activity);
            setCancelable(false);
        }

        public final boolean dispatchTouchEvent(MotionEvent motionevent) {
            return true;
        }

        protected final void onCreate(Bundle bundle) {
            super.onCreate(bundle);
            FrameLayout framelayout = new FrameLayout(getContext());
            framelayout.setBackgroundColor(0);
            setContentView(framelayout);
        }
    }
}

//Paste this in your activity
mHomeKeyLocker = new HomeKeyLocker();
mHomeKeyLocker.lock(this);
7
NitinM

完璧な非ルートロック画面機能を提供する確実な方法は、「ロッカー」アプリのアイデアをランチャーアプリと組み合わせることです。

マニフェストの簡単な変更により、アプリをホームスクリーン/ランチャーとして登録できるようになります。これにより、.apkホームボタンを完全に制御できます:

_<application
    Android:launchMode="singleTask"
    Android:clearTaskOnLaunch="true"
    Android:stateNotNeeded="true"
    Android:icon="@drawable/ic_launcher"
    Android:label="@string/app_name"
    Android:theme="@style/AppTheme" >
    <activity
        Android:name="ch.arnab.simplelauncher.HomeScreen"
        Android:label="@string/app_name"
        Android:launchMode="singleTask"
        Android:excludeFromRecents="true"
        Android:screenOrientation="nosensor">
        <intent-filter>
            <action Android:name="Android.intent.action.MAIN" />

            <!-- These 2 intent-filters identify a launcher: -->
            <category Android:name="Android.intent.category.HOME" />
            <category Android:name="Android.intent.category.DEFAULT" />
        </intent-filter>
    </activity>
</application>
_

このチュートリアルから取得

次に、ホーム画面用とロック画面用の2つのアクティビティがあります。

ロック画面のアクティビティを表示するには、画面がオフ/オンになるタイミングを検出する必要があります

_public class MainActivity extends Activity {

    //Create a receiver for screen-on/screen-off
    BroadcastReceiver mybroadcast = new BroadcastReceiver() {   
        @Override
        public void onReceive(Context context, Intent intent) {
            if (intent.getAction().equals(Intent.ACTION_SCREEN_ON)) {
                //Show lock-screen
            }
            else if (intent.getAction().equals(Intent.ACTION_SCREEN_OFF)) {
                //Also show lock-screen, to remove flicker/delay when screen on?
            }

        }
    };
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        registerReceiver(mybroadcast, new IntentFilter(Intent.ACTION_SCREEN_ON));
        registerReceiver(mybroadcast, new IntentFilter(Intent.ACTION_SCREEN_OFF));
    }
}
_

この回答からプル

参考までに、この時点で「ロック画面」はランチャーの一部とみなされるため、アプリはロック画面上で起動できますが、これは次の場合には不適切です:ユーザーがメッセージ/ツイーツなどをクリックする通知ドロワーが、次の場合にも有効です:電話のロックを解除せずに着信コールに応答できること

いずれにしても、ロック画面アクティビティはonPauseをオーバーライドし、ユーザーが「認証」されているかどうかを確認し、そうでない場合はユーザーが何かを開いてロック画面に戻ると想定します。

_@Override
public void onPause() {
    super.onPause();
    if(password!=storedPassword) {
      //Lockscreen activity shouldn't ever be escaped without the right password!
      //Return to launcher without root!
      Intent homeIntent = new Intent(Intent.ACTION_MAIN);
      homeIntent.addCategory(Intent.CATEGORY_HOME);
      homeIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
      startActivity(homeIntent);
    }
}
_

ユーザーエクスペリエンスを向上させるには、いくつかのアプリがロック画面(Spotifyなど)をバイパスできるようにするオプションをユーザーに提供する必要があります。これを上記のifステートメントに含めることができます(例:if(password!=storedPassword||isForegroundAppSpotify))。

ホーム画面にアプリを読み込む限り、独自のランチャーアクティビティを作成するために Googleのチュートリアル を参照できます。

ランチャーとロック画面の組み合わせは、ルートアクセスを回避する最も簡単な方法です。ルートを使用する方が簡単な場合もありますが、顧客ベースは制限されます。

お役に立てれば!

3
Aaron Gillion

私はロック画面を設計するために多くの研究を行い、最終的に解決策を見つけました。 Android [戻る]ボタンを除くシステムバーをオーバーライドする機能を無効にしました。ただし、この作業を行うには少しの回避策があります。

画面のピン留めを辛抱強く理解して実装すると、成功します。

アプリを作成して、画面のピン留めを実装するすべてのアプリケーションを制御するか、ピン留めする同じアプリケーションに直接画面のピン留めを実装できます。

この記事の後半の実装を紹介します。

1。まず、アプリはデバイスの所有者である必要があります。

いくつかの方法で実行できますが、最も簡単なのはコマンドを実行することです:

adb Shell dpm set-device-owner [yourPackageName] /。[MyDeviceAdminReceiver]

DeviceAdminReceiverを拡張するレシーバー(MyDeviceAdminReceiver)を作成します。ここにコードは必要ありません。デバイス所有者の実装の詳細については、このリンクを参照してください
http://florent-dupont.blogspot.com/2015/02/10-things-to-know-about-device-owner.html

この方法でAndroidManifest.xmlファイルにレシーバーを登録します。

<receiver
       Android:name=".MyDeviceAdminReceiver"
       Android:label="@string/app_name"
       Android:permission="Android.permission.BIND_DEVICE_ADMIN">
     <meta-data
       Android:name="Android.app.device_admin"
       Android:resource="@xml/device_admin" />

       <intent-filter>
         <action Android:name="Android.app.action.DEVICE_ADMIN_ENABLED" />
       </intent-filter>
  </receiver>

2。 onCreateメソッドは次のようになります。

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_lock_screen);

    ComponentName deviceAdmin = new ComponentName(this, MyDeviceAdminReceiver.class);
    DevicePolicyManager mDpm = (DevicePolicyManager) getSystemService(Context.DEVICE_POLICY_SERVICE);


    if (mDpm.isDeviceOwnerApp(getPackageName())) {
        mDpm.setLockTaskPackages(deviceAdmin, new String[]{getPackageName()});
    }

    if (mDpm.isLockTaskPermitted(this.getPackageName()))
        startLockTask();

3。画面の固定を解除してナビゲーションバーを機能させるには

コード内の固定を解除する場所で関数stopLockTask()を呼び出します。たとえば、私のアプリケーションでは、ユーザーが正しいパスコードを入力したことを確認したらすぐに、この関数を呼び出します。

 if (userInput.length() == 4) {

                    if (userInput.equals(passcode)) {
                        userInput = "";
                        etxtPasscodeDisplay.setText("");
                        stopLockTask(); // this is what you need
                        unlockHomeButton(); // A method to show home screen when 
                         passcode is correct
                        finishAffinity(); //kill other activities
                    }

ロック画面に通常必要な追加情報:

1。アプリが起動後に最初に表示される場合

これには、サービス(StartAtBootService)とレシーバー(BootCompletedReceiver)が必要です。

2。画面のロックとロック解除後にアプリを表示する場合(ロックとロック解除のために電源ボタンを押します):

serviceを拡張するAEScreenOnOffServiceとBroadcastReceiverを拡張するAEScreenOnOffReceiverを作成します画面がオンのとき。

ここで言及したすべての詳細情報については、 http://www.sureshjoshi.com/mobile/Android-kiosk-mode-without-root/ を参照してください。
これはすばらしい記事であり、私を大いに助けてくれました。著者に感謝します。

3つ以上のリンクを投稿するには、少なくとも10の評判が必要です。私はstackoverflowを初めて使用するので、評判が足りないので、紹介したすべてのリンクを共有できないのは残念です。アクセスできたら、投稿を確実に更新します。

2
Nithesh

これを行うには、 shaobin0604 library を使用できます。戻るボタンも無効になります。アクティビティは次のようになります。


public class MainActivity extends Activity {

HomeKeyLocker homeKeyLocker;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    homeKeyLocker = new HomeKeyLocker();
    homeKeyLocker.lock(this);
}
</ code>

}
2
Jordan Junior

あなたの質問に対する簡単な答えは、あなたはそれをできないということです。

あなたが言及した解決策は、約4年前に私によって提案されました [リンク]

onUserLeavesHint、onKeyDown、およびonKeyDispatchは、ハードウェアキーを「無効にする」ことはありません。

ホームボタンを本当に「処理」したい場合は、アプリケーションをホーム画面として作成する必要があります。 this および this を参照してください。

ホーム画面アプリケーションを作成せずにハードウェアキーを無効にする場合は、デバイスをルート化し、対応するデバイスファイルをカーネルモジュールから削除する必要があります。 (ご自身の責任でお試しください!)

1
PC.