web-dev-qa-db-ja.com

Androidシステムオーバーレイウィンドウ

システムオーバーレイを作成しようとしています。しかし、私は引き続き「許可が拒否されました」。 SDKバージョン23を使用しています。

私のマニフェストファイル:

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

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

<application
    Android:allowBackup="true"
    Android:icon="@mipmap/ic_launcher"
    Android:label="@string/app_name"
    Android:theme="@style/AppTheme" >
    <activity
        Android:name=".activity.MainActivity"
        Android:label="@string/app_name" >
        <intent-filter>
            <action Android:name="Android.intent.action.MAIN" />

            <category Android:name="Android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
</application>

</manifest>

オーバーレイの作成に使用するコード:

    //mView = new HUDView(this);
    mButton = new Button(this);
    mButton.setText("Overlay button");
    mButton.setOnTouchListener(this);

    WindowManager.LayoutParams params = new WindowManager.LayoutParams(
            WindowManager.LayoutParams.WRAP_CONTENT,
            WindowManager.LayoutParams.WRAP_CONTENT,
            WindowManager.LayoutParams.TYPE_SYSTEM_ALERT,
            WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH,
            PixelFormat.TRANSLUCENT);
    params.gravity = Gravity.RIGHT | Gravity.TOP;
    params.setTitle("Load Average");
    WindowManager wm = (WindowManager) getSystemService(WINDOW_SERVICE);
    wm.addView(mButton, params);
18
Tom

まず、_SYSTEM_OVERLAY_WINDOW_という名前の権限はありません。 _SYSTEM_ALERT_WINDOW_です。

第二に、targetSdkVersionが23以上で、Android 6.0+デバイスで実行している場合、アプリは最初からこの許可を取得しません。Settings.canDrawOverlays()権限があるかどうかを確認し、権限がない場合は_ACTION_MANAGE_OVERLAY_PERMISSION_を使用してユーザーを設定に移動します。

31
CommonsWare

AndroidManifestの場合(バージョン<23の場合)

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


public static int ACTION_MANAGE_OVERLAY_PERMISSION_REQUEST_CODE= 5469;
//Random value

    public void testPermission() {
        if (!Settings.canDrawOverlays(this)) {
            Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION,
                    Uri.parse("package:" + getPackageName()));
            startActivityForResult(intent, ACTION_MANAGE_OVERLAY_PERMISSION_REQUEST_CODE);
        }
    }

結果:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == ACTION_MANAGE_OVERLAY_PERMISSION_REQUEST_CODE) {
        if (Settings.canDrawOverlays(this)) {
            // You have permission
        }
    }
}
23
Anthone

代替ソリューションとして、WindowManager.LayoutParams.TYPE_SYSTEM_ALERTの代わりにWindowManager.LayoutParams.TYPE_TOASTを試すことができます。これには許可は必要ありません。私はそれを使用して画像を表示しています、多分ボタンは

0
Arkady

特定のアプリのオーバーレイページにユーザーを誘導することもできます。ドキュメント states

入力:オプションで、IntentのデータURIはアプリケーションパッケージ名を指定して、パッケージ名に固有の管理GUIを直接呼び出すことができます。たとえば、「package:com.my.app」。

のようなもの:

intent.setData(Uri.fromParts("package", getPackageName(), null));
0
Nonos

以下および上記のユーザーの場合Android 8 use

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
   LAYOUT_FLAG = WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY;
} else {
    LAYOUT_FLAG = WindowManager.LayoutParams.TYPE_PHONE;
}
0
arwTheDev