1. ホーム
  2. android

[解決済み] Androidです。ウィンドウを追加できません。このウィンドウタイプに対するパーミッションが拒否されました。

2023-03-01 19:05:50

質問

あるアプリケーションで、いくつかの情報を含むウィンドウを表示する必要があります。 オン をロック画面 (キーガード) に表示する必要があります。私はおそらく私がそれを行うことができると考え WindowManager.LayoutParams.TYPE_KEYGUARD_DIALOG でできると考えました。

しかし、私のアプリは毎回次のようなエラーでクラッシュします。

android.view.WindowManager$BadTokenException: Unable to add window android.view.ViewRootImpl$W@40ec8528 -- permission denied for this ウィンドウタイプ

これらの投稿( はこちら , ここ そして はこちら など)いずれも同じ答えになります。 Manifestファイルに以下のパーミッションを追加する。

android.permission.SYSTEM_ALERT_WINDOWを追加します。

私が実装したソリューションですが、私はまだ同じエラーが表示されます。 私が間違ってやっていることのいずれかのアイデア?

以下は私のマニフェストファイルのパーミッションです。

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.droidpilot.keyguardwindow" >

<uses-sdk
    android:minSdkVersion="16"
    android:targetSdkVersion="21" />

<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.VIBRATE" />

そして、これはロック画面に Window を追加するために使用しているコードです。

WindowManager wm = (WindowManager) getSystemService(WINDOW_SERVICE);
    LayoutInflater mInflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);

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

    WindowManager.LayoutParams params = new WindowManager.LayoutParams(
            WindowManager.LayoutParams.WRAP_CONTENT,
            WindowManager.LayoutParams.WRAP_CONTENT,
            WindowManager.LayoutParams.TYPE_KEYGUARD_DIALOG,
            WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED
                    | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON
                    | WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON,
            PixelFormat.TRANSLUCENT
    );

    wm.addView(mView, params);

誰か心当たりはないですか?

追伸: Android 4.4.2 を実行している HTC Desire 620 DS でテストしています。

どのように解決するのですか?

完全に明白な理由であるはずです。 通常のアプリでは、ロック画面の上に任意のウィンドウを作成することはできません。 . もし私がロック画面にウィンドウを作成し、そのウィンドウが実際のロック画面を完全に模倣して、見分けがつかないようにしたらどうなると思いますか?

このエラーの技術的な理由は TYPE_KEYGUARD_DIALOG フラグです。 android.permission.INTERNAL_SYSTEM_WINDOW という署名レベルの権限が必要です。つまり 同じ証明書 で署名されたアプリのみが使用できることを意味します。

の作成者は android.permission.INTERNAL_SYSTEM_WINDOW の作成者は Android システムそのものなので、あなたのアプリが OS の一部でない限り、チャンスはないでしょう。

の方法はよく定義され、よく文書化されています。 ロックスクリーンからの情報をユーザーに通知する . ロックスクリーンに表示されるカスタマイズされた通知を作成することができ、ユーザーはそれらと対話することができます。