くらげになりたい。

くらげのようにふわふわ生きたい日曜プログラマなブログ。趣味の備忘録です。

Android10からバックグラウンドからActivityを起動できなくなった(SYSTEM_ALERT_WINDOW権限)

Android10の変更点で「バックグラウンドからのアクティビティの起動に関する制限」が追加され、Service内などバックグラウンドからActivityを開くのに制限がかかるようになったよう。

基本的には、「いきなりAcitivityを開くのではなく、通知を使ってね」という形らしい。

targetVerisonに関わらず、Android10以上の端末で制限される。

制限の例外

ドキュメントで説明されている通り、記載されている1つ以上の条件を満たすと従来どおりActivityを開くことができる。

その中で、

ユーザーによってアプリにSYSTEM_ALERT_WINDOWパーミッションが付与されている

というのがあるので、必要であれば、このパーミッションを許可してもらうのが良さそう。

SYSTEM_ALERT_WINDOW権限の確認と許可

AndroidManifest.xml

SYSTEM_ALERT_WINDOWについて、AndroidManifest.xmlに追加する。

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example">
  <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
</manifest>

ソースコード

import android.content.Intent;
import android.net.Uri;
import android.provider.Settings;

import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;

public class MainActivity extends AppCompatActivity {
  private static final int REQUEST_PERMISSION_CODE = 1;
    
  // SYSTEM_ALERT_WINDOWが許可されているかのチェック
  public boolean isGranted() {
    return Settings.canDrawOverlays(this);
  }

  // SYSTEM_ALERT_WINDOWの許可をリクエストする
  public void requestPermission() {
    Uri uri = Uri.parse("package:" + getPackageName());
    Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION, uri);
    startActivityForResult(intent, REQUEST_PERMISSION_CODE);
  }
  
  // 許可されたかの確認は、onActivityResultでチェックする
  @Override
  protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
    if (requestCode == REQUEST_PERMISSION_CODE) {
      if (Settings.canDrawOverlays(this)) {
          // 許可されたときの処理
      } else {
          // 拒否されたときの処理
      }
    } else {
        super.onActivityResult(requestCode, resultCode, data);
    }
  }
}

以上!

参考にしたサイト様