web-dev-qa-db-ja.com

androidでカスタムLockScreenを作成する

私はカスタムロック画面アプリを開発しています.4.0以下では4.0で問題なく機能しますが、4.0以上ではホームボタンを押すとアプリが停止します。ホームボタンを押しても画面がロック解除されるまでアプリは停止しません(ロッカーアプリのように)。 )

16
kk1

LockScreenアプリを開発するもう1つの方法は、Viewsを使用することです。

まず、一部のデバイスでは、KEYGUARDを無効にすることで、システムロック画面を「無効」にできます。

((KeyguardManager)getSystemService(Activity.KEYGUARD_SERVICE)).newKeyguardLock("IN").disableKeyguard();

このコード行をServiceに配置する必要があります。

その後、画面が消えるたびにアクティビティを起動できます。

public class AutoStart extends BroadcastReceiver {

    public void onReceive(Context arg0, Intent arg1) {
        if(arg1.getAction().equals("Android.intent.action.SCREEN_OFF")) {
            Intent localIntent = new Intent(arg0, LockScreen.class);
            localIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            localIntent.addFlags(WindowManager.LayoutParams.TYPE_SYSTEM_ERROR);
            arg0.startActivity(localIntent);
        }
    }
}

WindowManager.LayoutParams.TYPE_SYSTEM_ERRORのドキュメントを読むと、内部システムエラーウィンドウの一種であり、可能なすべての上に表示されることが説明されています。マルチユーザーシステムでは、所有ユーザーのウィンドウにのみ表示されます。

これで、すべての上にアクティビティがありますが、HOMEボタンを押すとアクティビティが終了します。

ここにViewsが現れます。レイアウトリソースからビューを膨らませて、TYPE_SYSTEM_ERRORとしてWindowManagerに追加できるため、すべての上に配置されます。また、このViewをいつ削除するかを制御できるため、onDestroyボタンを押すとアクティビティが一時停止されるだけで、ビューは引き続き表示されるため、ActivityHOMEが最適な場所です。見える。

public WindowManager winManager;
public RelativeLayout wrapperView;

 @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
 WindowManager.LayoutParams localLayoutParams = new WindowManager.LayoutParams( WindowManager.LayoutParams.TYPE_SYSTEM_ERROR,
                WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE|
                        WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL|
                        WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN,
                PixelFormat.TRANSLUCENT);
        this.winManager = ((WindowManager)getApplicationContext().getSystemService(WINDOW_SERVICE));
        this.wrapperView = new RelativeLayout(getBaseContext());
        getWindow().setAttributes(localLayoutParams);
        View.inflate(this, R.layout.lock_screen, this.wrapperView);
        this.winManager.addView(this.wrapperView, localLayoutParams);
}

 public void onDestroy()
    {
        this.winManager.removeView(this.wrapperView);
        this.wrapperView.removeAllViews();
        super.onDestroy();
    }

表示の通知バーを回避するために、すべてのポインターイベントを消費するフラグFLAG_NOT_FOCUSABLE | FLAG_NOT_TOUCH_MODAL | FLAG_LAYOUT_IN_SCREENを追加しました。

次の2行をマニフェストに追加することを忘れないでください。

<uses-permission Android:name="Android.permission.DISABLE_KEYGUARD" />
<uses-permission Android:name="Android.permission.SYSTEM_ALERT_WINDOW" />

ここからは、ロック画面アプリのロジックを追加して、ユーザーがスマートフォンを使用できるようにする必要があります:)

13
Miguel

私はSamsung Galaxy S4 5.0で開発しており、私のために働いたのは単にgetWindow().setFlags(..)getWindow().addFlags(..)に変更することでした

0
superuserdo

まず、本当にホームキーをハイジャックしたいかどうかを自問すべきでしょう。時々それが欲しいかもしれません。ただし、アプリをAndroidロック画面に配置し、ホームキーを通常どおりに動作させ、基になるAndroidロック画面にパスワード保護を任せることで、多くの場合、デバイスは実際に必要なものです(これがデフォルトで行われる方法を変更する場合を除きます)。
最終的に、アプリをAndroid=ロック画面に表示できるようにすることで、独自のカスタムロック画面を作成するのにかなり近づきます。管理する必要がないため、明らかに簡単ですパスワードは自分で入力します。ホームキーをハイジャックしないため、安全で信頼性が高いことは言うまでもありません。
私はこのようにそれをしました、そしてそれは非常にうまくいきます。あなたはここで詳細を見ることができます:

Androidロック画面)にWebサイトを表示

それは私が興味を持っていたので、ロック画面にウェブサイトを表示することに関する質問ですが、答えはより一般的であり、どのアプリでも動作します。 Google Playにあり、次のように書かれたアプリをここで見ることができます:

https://play.google.com/store/apps/details?id=com.a50webs.intelnav.worldtime

0
VSim

カスタムランチャーは基本的にはアプリです(グリッドのように動作させたり、リストにしたり、独自のドラッグアンドドロップを実装したりできます)。これらの行をメインアクティビティのインテントフィルターに追加するだけで、これが完了した後、アプリをインストールしてホームボタンを押すと、アプリが利用可能なホーム画面のリストに表示されます。

<category Android:name="Android.intent.category.HOME" />
<category Android:name="Android.intent.category.DEFAULT" />

私が見つけられないのは、ロック画面を置き換える方法です。電話のロック画面を無効にしたり、カスタムランチャーでアクティビティを使用したりするなどのハッキングは、実際にはロック画面を置き換えません^^

0
nunoh123

以下の方法を使用して、AndroidでHomeキーを無効にすることができます。

@Override
public void onAttachedToWindow() {
    this.getWindow().setType(WindowManager.LayoutParams.TYPE_KEYGUARD);
    super.onAttachedToWindow();
}
0
Snehal Masne