4

ロック画面の前にアクティビティを表示したい。onCreateメソッドでこのコードを試しました:

super.onCreate(savedInstanceState);
Window window = getWindow();

window.addFlags(LayoutParams.FLAG_SHOW_WHEN_LOCKED);        
setContentView(R.layout.test);

これは、画面全体に表示されるアクティビティには最適ですが、高さが 200px しかないアクティビティを作成したいと考えています。私はそれをこのコードと一致させることができると思いました:

super.onCreate(savedInstanceState);
Window window = getWindow();

LayoutParams layout = new WindowManager.LayoutParams();
layout.copyFrom(window.getAttributes());
layout.height = 200;

window.setAttributes(layout);
window.addFlags(LayoutParams.FLAG_SHOW_WHEN_LOCKED);

setContentView(R.layout.test);

ただし、アクティビティはロック画面の前に表示されません。電話のロックを解除すると、アクティビティが直接表示されます。これを修正する理由と方法はありますか?

編集:ウィンドウのフローティング FLAG と関係があると思います。このフラグが設定されている場合 (サイズを変更すると設定されると思います)、アクティビティはロック画面に表示されません。しかし、これはあくまでも推測です。これを修正するためのアイデアや回避策はありますか?

4

4 に答える 4

0

音楽プレーヤーを設計する際にも、同様の要件がありました。ロック画面ウィジェットで最終的に行うことは次のとおりです。

  1. 私のロック画面ウィジェットの透明な背景がありました。
  2. レイアウトの下部に「クリックしてロック画面を終了する」ボタンを追加しました。
  3. ボックス感を出すために、ボタンの周りに白い境界線を追加しました。

私のミュージックプレイヤー「Fusion Music Player」をGoogle Playからダウンロードしてご覧いただけます。

于 2013-08-20T02:33:30.160 に答える
0

まず、環境設定Keyguardインスタンスに保存します。

その後、電話のデフォルトのロック画面をプログラムで無効にします。

Service次に、電話がロック状態になったときのキャッチを実装します。

スタック内のアクティビティをチェックするときSCREEN_ON、彼女が存在する場合は彼女を表示し、NO - で起動しsingleTaskます。

これは、Activity on Lockscreen を実装する 1 つの方法です。Google はメークアップ ロック画面を拒否しており、これを操作することはすべてハックであるためです。

ウィジェットを作成して、ロック画面または書き込み方法の下に配置できます。

参考までに: google it my lock for android (source on code.google.com)

于 2013-08-20T15:48:08.690 に答える
0

最後に私は同じことを達成しました。セキュリティ上の理由から、Android はアクティビティの背後にロック画面を表示しないため、アクティビティには行かないでください。サービスのためです。

以下は、私のサービスの onStartCommand の私のコードです

WindowManager mWindowManager = (WindowManager) getSystemService(WINDOW_SERVICE);

View mView = mInflater.inflate(R.layout.score, null);

WindowManager.LayoutParams mLayoutParams = new WindowManager.LayoutParams(
        ViewGroup.LayoutParams.WRAP_CONTENT,
        ViewGroup.LayoutParams.WRAP_CONTENT, 0, 0,
        WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY,
        WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED
                | WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD
                | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON
        /* | WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON */,
        PixelFormat.RGBA_8888);

mWindowManager.addView(mView, mLayoutParams);
于 2014-05-21T10:35:15.760 に答える
-1

あなたの最善の策Viewは、画面いっぱいに を作成することですが、必要な部分以外のすべての場所に透明な背景があります。

これは、ファイルでカスタム テーマを定義することで実行できますres/values/styles.xml(元は Android で透明なアクティビティを作成するにはどうすればよいですか? に示されています)。

<?xml version="1.0" encoding="utf-8"?>
<resources>
  <style name="Theme.Transparent" parent="android:Theme">
    <item name="android:windowIsTranslucent">true</item>
    <item name="android:windowBackground">@android:color/transparent</item>
    <item name="android:windowContentOverlay">@null</item>
    <item name="android:windowNoTitle">true</item>
    <item name="android:backgroundDimEnabled">false</item>
  </style>
</resources>

Activity次に、このテーマをのマニフェスト宣言に追加します。

android:theme="@style/Theme.Transparent"

次に、このファイルR.layout.lockscreenを追加して、このアクティビティのレイアウト ( ) を作成できます。XMLここでは、高さをピクセル単位で指定します。

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content" >

    <FrameLayout 
        android:layout_width="match_parent"
        android:layout_height="200px"
        android:centerInParent="true" >

        <include layout="@layout/test" /> <!-- This points to your R.layout.test layout. -->

    </FrameLayout>

</RelativeLayout>

最後に、上記の最初のメソッドを使用してアクティビティを表示します。

super.onCreate(savedInstanceState);
Window window = getWindow();

window.addFlags(LayoutParams.FLAG_SHOW_WHEN_LOCKED);        
setContentView(R.layout.lockscreen);
于 2013-08-19T13:33:54.520 に答える