システムオーバーレイを作成しようとしています。しかし、私は引き続き「許可が拒否されました」。 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);
まず、_SYSTEM_OVERLAY_WINDOW
_という名前の権限はありません。 _SYSTEM_ALERT_WINDOW
_です。
第二に、targetSdkVersion
が23以上で、Android 6.0+デバイスで実行している場合、アプリは最初からこの許可を取得しません。Settings.canDrawOverlays()
権限があるかどうかを確認し、権限がない場合は_ACTION_MANAGE_OVERLAY_PERMISSION
_を使用してユーザーを設定に移動します。
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
}
}
}
代替ソリューションとして、WindowManager.LayoutParams.TYPE_SYSTEM_ALERTの代わりにWindowManager.LayoutParams.TYPE_TOASTを試すことができます。これには許可は必要ありません。私はそれを使用して画像を表示しています、多分ボタンは
特定のアプリのオーバーレイページにユーザーを誘導することもできます。ドキュメント states :
入力:オプションで、IntentのデータURIはアプリケーションパッケージ名を指定して、パッケージ名に固有の管理GUIを直接呼び出すことができます。たとえば、「package:com.my.app」。
のようなもの:
intent.setData(Uri.fromParts("package", getPackageName(), null));
以下および上記のユーザーの場合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;
}