HOME
  Security
   Software
    Hardware
  
FPGA
  CPU
   Android
    Raspberry Pi
  
nLite
  Xcode
   etc.
    ALL
  
LINK
BACK
 

2022/07/02

Android 10で BOOT_COMPLETEDでアプリの Activityの自動起動が制限されるのを回避する方法 Android 10で BOOT_COMPLETEDでアプリの Activityの自動起動が制限されるのを回避する方法

(Android 10 API 29で RECEIVE_BOOT_COMPLETEDで Activityが起動できなくてハマった件)

Tags: [Android開発]




● Android 10で BOOT_COMPLETEDでアプリの Activityの自動起動が制限されるのを回避する方法

 Android 10 API 29で RECEIVE_BOOT_COMPLETEDで Activityが起動できなくてハマった件。

 Androidで自動起動するアプリのサービスを展開していますが、使用している端末を Android 10(Android Q、API level 29)にアップデートしました。

 アプリを入れて動作確認をしたのですが、アプリが自動起動しません。

 クソッタレ。知ってはいましたが Android OSのアップデートでセキュリティ関係で制限が入りました。

バックグラウンドからのアクティビティの起動に関する制限
 Android 10 (API レベル 29) 以上では、バックグラウンドで実行されているアプリに対してアクティビティを開始できる状況に制限があります。

 今回の場合、下記の解決方法をしていない場合。
 ・エミュレータ(API 29)ではアプリが自動起動しなかった。
 ・サービスを提供する実機(TECLAST TLA007 Android 10)では自動起動しなかった。


●解決方法 その1

 制限の例外として下記の条件があります。
 ユーザーによってアプリに SYSTEM_ALERT_WINDOW パーミッションが付与されている。

 と言う訳で安直に AndroidManifest.xmlに
    <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
 を追加します。
 SYSTEM_ALERT_WINDOW権限は Android 6.0 Marshmallow API level 23以降では「実行時パーミッション」が必要になります。
Android 6.0 の変更点
アプリの権限をリクエストする

 端末の設定から、「アプリと通知」の項目を選択して、該当のアプリの「アプリ情報」に移動します。
 「詳細設定」をタップして「他のアプリの上に重ねて表示」を「許可」します。
 ("Display over Other apps")

 解決方法 その1の場合。
 ・エミュレータ(API 29)ではアプリが自動起動しなかった。
 ・エミュレータ(API 30)ではアプリが自動起動する様になった。
 ・サービスを提供する実機(TECLAST TLA007 Android 10)では自動起動しなかった。

int REQUEST_OVERLAY_PERMISSION_CODE = 1234;

Settings.canDrawOverlays(getApplicationContext());

// Uri uri = Uri.parse("package:" + getPackageName());
Uri uri = Uri.parse("package:" + BuildConfig.APPLICATION_ID);
Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION, uri);
startActivityForResult(intent, REQUEST_OVERLAY_PERMISSION_CODE);

@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
  if (requestCode == REQUEST_OVERLAY_PERMISSION_CODE) {
    if (Settings.canDrawOverlays(getApplicationContext())) {
        // Granted
    } else {
        // Not Granted
    }
  }

  super.onActivityResult(requestCode, resultCode, data);
}

Android 11 での権限に関する更新
 システム アラート ウィンドウの変更
 Android 11 では、アプリに SYSTEM_ALERT_WINDOW 権限を付与する方法がいくつか変更されています。この変更は、権限を付与する際の意識を高めることで、ユーザーを保護するのが目的です。

Background activity start [callingPackage: jp.ne.neko.freewing.HogehogeApp; callingUid: 10170; isCallingUidForeground: false; callingUidHasAnyVisibleWindow: false; callingUidProcState: RECEIVER; isCallingUidPersistentSystemProcess: false; realCallingUid: 10170; isRealCallingUidForeground: false; realCallingUidHasAnyVisibleWindow: false; realCallingUidProcState: RECEIVER; isRealCallingUidPersistentSystemProcess: false; originatingPendingIntent: null; isBgStartWhitelisted: false; intent: Intent { flg=0x10000000 cmp=jp.ne.neko.freewing.HogehogeApp/.HogehogeActivity }; callerApp: ProcessRecord{268f2bb 4085:jp.ne.neko.freewing.HogehogeApp/u0a170}]

2022-07-03 19:06:23.161 531-4164/system_process I/ActivityManager: Killing 4085:jp.ne.neko.freewing.HogehogeApp/u0a170 (adj 985): empty #17
2022-07-03 19:28:31.931 865-1004/? W/PackageParser: Unknown element under <manifest>: queries at /data/app/jp.ne.neko.freewing.HogehogeApp-TXXXXX_abcdogggg8_1123==/base.apk Binary XML file line #60
2022-07-03 19:28:32.051 865-1011/? D/PackageManager: SPRD : takeAndScanPackageLI: /data/app/jp.ne.neko.freewing.HogehogeApp-TXXXXX_abcdogggg8_1123==
2022-07-03 19:28:32.142 865-865/? I/PackageManager: Un-granting permission android.permission.SYSTEM_ALERT_WINDOW from package jp.ne.neko.freewing.HogehogeApp (protectionLevel=1250 flags=0x3008bf44)
2022-07-03 19:28:34.817 865-865/? I/PackageManager: Un-granting permission android.permission.SYSTEM_ALERT_WINDOW from package jp.ne.neko.freewing.HogehogeApp (protectionLevel=1250 flags=0x3088bf44)
2022-07-03 19:28:35.737 865-865/? I/PackageManager: Un-granting permission android.permission.SYSTEM_ALERT_WINDOW from package jp.ne.neko.freewing.HogehogeApp (protectionLevel=1250 flags=0x3088bf44)
2022-07-03 19:29:03.953 865-1155/? I/ActivityTaskManager: START u0 {act=android.settings.APPLICATION_DETAILS_SETTINGS dat=package:jp.ne.neko.freewing.HogehogeApp flg=0x10008000 cmp=com.android.settings/.applications.InstalledAppDetails bnds=[120,296][560,408]} from uid 10113, pid 1407
2022-07-03 19:29:05.113 3519-3539/? W/Role: jp.ne.neko.freewing.HogehogeApp not qualified for android.app.role.HOME due to missing RequiredComponent{mIntentFilterData=IntentFilterData{mAction='android.intent.action.MAIN', mCategories='[android.intent.category.HOME]', mDataScheme='null', mDataType='null'}, mPermission='null', mMetaData=[]}
2022-07-03 19:29:05.133 3519-3539/? W/Role: jp.ne.neko.freewing.HogehogeApp not qualified for android.app.role.DIALER due to missing RequiredComponent{mIntentFilterData=IntentFilterData{mAction='android.intent.action.DIAL', mCategories='[]', mDataScheme='null', mDataType='null'}, mPermission='null', mMetaData=[]}
2022-07-03 19:29:05.152 3519-3539/? W/Role: jp.ne.neko.freewing.HogehogeApp not qualified for android.app.role.SMS due to missing RequiredComponent{mIntentFilterData=IntentFilterData{mAction='android.provider.Telephony.SMS_DELIVER', mCategories='[]', mDataScheme='null', mDataType='null'}, mPermission='android.permission.BROADCAST_SMS', mMetaData=[]}
2022-07-03 19:29:06.535 3519-3519/? V/ManagePermsFragment: AppPermissionFragment view logged with sessionId=6183456286568752638 viewId=-3586623266236278867 permissionGroupName=android.permission-group.MICROPHONE uid=10149 packageName=jp.ne.neko.freewing.HogehogeApp category=1


●解決方法 その2

 制限の例外として下記の条件があります。
 システムによってバインドされたサービスがこのアプリにある。この条件は次のサービスにのみ適用されます(UI の起動が必要となる場合があります)。 AccessibilityService、AutofillService、CallRedirectionService、HostApduService、InCallService、TileService、VoiceInteractionService、および VrListenerService。

 ダミーの AccessibilityServiceを実装します。

独自のユーザー補助サービスを作成する

 端末の設定から、「ユーザー補助」の項目を選択して、上記で追加したダミーのサービスの「サービスを使用する」を「有効」にします。

 解決方法 その2の場合。
 ・エミュレータ(API 29)ではアプリが自動起動する様になった。
 ・エミュレータ(API 30)ではアプリが自動起動する様になった。
 ・サービスを提供する実機(TECLAST TLA007 Android 10)では自動起動する様になった。

 結果的に「解決方法 その2」で解決しました。

package com.example.android.apis.accessibility;

import android.accessibilityservice.AccessibilityService;
import android.view.accessibility.AccessibilityEvent;

public class MyAccessibilityService extends AccessibilityService {

    @Override
    public void onAccessibilityEvent(AccessibilityEvent event) {
    }

    @Override
    public void onInterrupt() {
    }
}

<application>
  <service android:name=".MyAccessibilityService"
      android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE"
      android:label="@string/accessibility_service_label">
    <intent-filter>
      <action android:name="android.accessibilityservice.AccessibilityService" />
    </intent-filter>
    <meta-data
      android:name="android.accessibilityservice"
      android:resource="@xml/accessibility_service_config" />
  </service>
</application>

res/xml/accessibility_service_config.xml
<?xml version="1.0" encoding="utf-8"?>
<accessibility-service xmlns:android="http://schemas.android.com/apk/res/android"
    android:description="@string/accessibility_service_description"
    android:packageNames="jp.ne.neko.freewing.HogehogeApp"
    android:accessibilityEventTypes="typeAllMask"
    android:accessibilityFlags="flagDefault"
    android:accessibilityFeedbackType="feedbackSpoken"
    android:notificationTimeout="100"
    android:canRetrieveWindowContent="true"
    android:settingsActivity="jp.ne.neko.freewing.HogehogeApp.dummy.Activity"
    />


●解決方法 その3

 良くわからん。
# 起動を許可する?
adb shell settings put global background_activity_starts_enabled 1

# 起動を許可しない?(デフォルトの状態?)
adb shell settings put global background_activity_starts_enabled 0



Tags: [Android開発]

●関連するコンテンツ(この記事を読んだ人は、次の記事も読んでいます)

AACの記事から1年経ってデータ バインディングの俺的カンニング帳を作る
AACの記事から1年経ってデータ バインディングの俺的カンニング帳を作る

  Android開発 データ バインディング 虎の巻 Android Studio

Androidのアプリ開発で AAR形式のライブラリを Androidプロジェクトに組み込む方法
Androidのアプリ開発で AAR形式のライブラリを Androidプロジェクトに組み込む方法

  Androidプロジェクトに AAR/JAR形式のライブラリを組み込む方法のバリエーション

Android JNI NDKの C言語側で R.rawや Assetのファイルを FileDescriptor経由で直接読み込む方法
Android JNI NDKの C言語側で R.rawや Assetのファイルを FileDescriptor経由で直接読み込む方法

  Android JNIの C言語で FileDescriptor経由でダイレクトに rawリソースを読み込む、メモリ受け渡しやダミーファイル作成が不要

Kotlin大嫌い人間が Kotlin言語を必死に勉強する
Kotlin大嫌い人間が Kotlin言語を必死に勉強する

  行末にセミコロン;の無い言語は大嫌い

2019年になったから Android Architecture Componentsで開発しようじゃないか!今から始めても遅くない!
2019年になったから Android Architecture Componentsで開発しようじゃないか!今から始めても遅くない!

  Androidの開発で AACって何? DataBinding、LiveData、ViewModel、LifecycleObserverについて解説

Androidアプリ作成に必須の多端末に対応するデザイン方法について解説する dipを極める
Androidアプリ作成に必須の多端末に対応するデザイン方法について解説する dipを極める

  Androidの開発で dipって何?密度非依存ピクセル?Density-Independent Pixels?って何者?




[HOME] | [BACK]
リンクフリー(連絡不要、ただしトップページ以外は Web構成の変更で移動する場合があります)
Copyright (c) 2022 FREE WING,Y.Sakamoto
Powered by 猫屋敷工房 & HTML Generator

http://www.neko.ne.jp/~freewing/android/android_10_boot_completed_launch_activity/