programing

Media Session Compat:S+(버전 31 이상)를 대상으로 하려면 보류 중 생성 시 FLAG_IMMOBLE 또는 FLAG_MUTABLE 중 하나를 지정해야 합니다.의도

sourcetip 2023. 1. 30. 22:50
반응형

Media Session Compat:S+(버전 31 이상)를 대상으로 하려면 보류 중 생성 시 FLAG_IMMOBLE 또는 FLAG_MUTABLE 중 하나를 지정해야 합니다.의도

응용 프로그램을 Android SDK 31로 업데이트하려고 하는데 Media Session Compat에 문제가 있습니다.

MediaBrowserServiceCompat()를 확장하는 MediaService가 있으며 메서드 onCreate에서 MediaSessionCompat를 초기화합니다.

override fun onCreate() {
  super.onCreate()
  mediaSession = MediaSessionCompat(this, TAG).apply {
    setCallback(mediaSessionCallback)
    isActive = true
  }
...

하지만 다음과 같은 오류가 있습니다.

java.lang.RuntimeException: Unable to create service com.radio.core.service.MediaService: java.lang.IllegalArgumentException: com.xxx.xxx: Targeting S+ (version 31 and above) requires that one of FLAG_IMMUTABLE or FLAG_MUTABLE be specified when creating a PendingIntent.
    Strongly consider using FLAG_IMMUTABLE, only use FLAG_MUTABLE if some functionality depends on the PendingIntent being mutable, e.g. if it needs to be used with inline replies or bubbles.
        at android.app.ActivityThread.handleCreateService(ActivityThread.java:4498)
        at android.app.ActivityThread.access$1500(ActivityThread.java:250)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2064)
        at android.os.Handler.dispatchMessage(Handler.java:106)
        at android.os.Looper.loopOnce(Looper.java:201)
        at android.os.Looper.loop(Looper.java:288)
        at android.app.ActivityThread.main(ActivityThread.java:7829)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:982)
     Caused by: java.lang.IllegalArgumentException: com.xxx.xxx: Targeting S+ (version 31 and above) requires that one of FLAG_IMMUTABLE or FLAG_MUTABLE be specified when creating a PendingIntent.
    Strongly consider using FLAG_IMMUTABLE, only use FLAG_MUTABLE if some functionality depends on the PendingIntent being mutable, e.g. if it needs to be used with inline replies or bubbles.
        at android.app.PendingIntent.checkFlags(PendingIntent.java:375)
        at android.app.PendingIntent.getBroadcastAsUser(PendingIntent.java:645)
        at android.app.PendingIntent.getBroadcast(PendingIntent.java:632)
        at android.support.v4.media.session.MediaSessionCompat.<init>(MediaSessionCompat.java:567)
        at android.support.v4.media.session.MediaSessionCompat.<init>(MediaSessionCompat.java:537)
        at android.support.v4.media.session.MediaSessionCompat.<init>(MediaSessionCompat.java:501)
        at android.support.v4.media.session.MediaSessionCompat.<init>(MediaSessionCompat.java:475)
        at com.radio.core.service.MediaService.onCreate(MediaService.kt:63)
        at android.app.ActivityThread.handleCreateService(ActivityThread.java:4485)
            ... 9 more

Andriod "S"에서 이 요구사항을 처리할 수 있는 최신 버전의 미디어 라이브러리("Androidx.media:media:1.4.0")를 사용하고 있습니다.Media Session Compact.java 클래스에서 볼 수 있습니다.


// TODO(b/182513352): Use PendingIntent.FLAG_MUTABLE instead from S.
/**
 * @hide
 */
@RestrictTo(LIBRARY)
public static final int PENDING_INTENT_FLAG_MUTABLE = 
  Build.VERSION.CODENAME.equals("S") ? 0x02000000 : 0;

...

if (mbrComponent != null && mbrIntent == null) {
  // construct a PendingIntent for the media button
  Intent mediaButtonIntent = new Intent(Intent.ACTION_MEDIA_BUTTON);
  // the associated intent will be handled by the component being registered
  mediaButtonIntent.setComponent(mbrComponent);
  mbrIntent = PendingIntent.getBroadcast(context,
    0/* requestCode, ignored */, mediaButtonIntent,
    PENDING_INTENT_FLAG_MUTABLE);
}

문제를 나타내는 소스 코드(https://github.com/adelinolobao/issue-media-session-compat

어떻게 하면 오류를 고칠 수 있을까요?

사용하지 않는 경우PendingIntent아무 곳이나.이 종속성을 추가하거나 업데이트하면 문제가 해결될 수 있습니다.

    // required to avoid crash on Android 12 API 31
    implementation 'androidx.work:work-runtime-ktx:2.7.0'

이것으로 문제가 해결되었다.

방금 사용한 에러 해결.PendingIntent.FLAG_MUTABLEAndroid 버전 12 또는 S의 경우

PendingIntent pendingIntent = null;
    if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.S) {
        pendingIntent = PendingIntent.getActivity
               (this, 0, notificationIntent, PendingIntent.FLAG_MUTABLE);
    }
    else
    {
         pendingIntent = PendingIntent.getActivity
                (this, 0, notificationIntent, PendingIntent.FLAG_ONE_SHOT);
    }

앱이 Android 12를 대상으로 하는 경우, 각 앱의 가변성을 지정해야 합니다.PendingIntent앱이 만드는 객체.

당신의 경우,android.support.v4.media.session.MediaSessionCompat를 작성했습니다.PendingItent초기화 중에MediaSessionCompat.

솔루션:운 좋게도, 추가 정보가 있습니다.@constructor를 위해MediaSessionCompat우리가 합격할 수 있도록pendingItent파라미터로 지정합니다.null을 통과하면componentparam, 라이브러리에서 초기화됩니다.

override fun onCreate() {
        super.onCreate()

        val mediaButtonIntent = Intent(Intent.ACTION_MEDIA_BUTTON)
        val pendingItent = PendingIntent.getBroadcast(
            baseContext,
            0, mediaButtonIntent,
            PendingIntent.FLAG_IMMUTABLE
        )

        mediaSession = MediaSessionCompat(baseContext, TAG, null, pendingItent).also {
            it.isActive = true
        }

        sessionToken = mediaSession.sessionToken
        packageValidator = PackageValidator(this@MediaService, R.xml.allowed_media_browser_callers)
    }

소스 코드: https://github.com/dautovicharis/issue-media-session-compat

업데이트: 감사합니다.

  • CommonsWare -> TODO (b/182513352)에 근거해 라이브러리를 갱신할 필요가 있는 것을 나타냅니다.
  • Adelino -> FLAG_IMMOBLE이 1.3.0-rc02에서 지원되는 것을 확인할 수 있는 릴리스 노트 링크를 제공합니다.

버전 1.3.0에서는 Media Session Compat에서 TODO(b/182513352)의 코멘트에 근거해 Android 12와 관련된 무언가가 결여되어 있는 것을 명확하게 알 수 있는 새로운 변경이 있었습니다.

새것까지androidx.media:media:이 릴리스에서는, 지금까지의 회피책을 사용하면, 정상적으로 동작합니다.

업데이트: TODO(b/182513352)가 다음 릴리즈에서 수정되기를 희망합니다.그때까지 우리는implementation "androidx.media:media:1.3.0-rc02"어디서FLAG_IMMUTABLE지원되고 있습니다.

Java를 사용하는 사용자의 경우:

다음 행을 에 추가합니다.build.gradle(app)아래dependencies.

dependencies {
  // ...
  implementation 'androidx.work:work-runtime:2.7.1'
}

앱에서 보류 중인 의도를 사용하지 않는 경우 이 'androidx 구현'을 사용해 보십시오.작업: work-facebooks-facebooks: 2.7.0'

그렇지 않으면 보류 중인 의도를 사용하는 경우 이 값을 변경합니다.

pendingIntent = PendingIntent.getActivity(
                        this,
                        0, intentToLaunchThisActivityFromNotification,
                        PendingIntent.FLAG_UPDATE_CURRENT);

로.

`

if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.S) {

 

               pendingIntent = PendingIntent.getActivity(
                        this,
                        0, intentToLaunchThisActivityFromNotification,
                        PendingIntent.FLAG_IMMUTABLE);
            }
            else
            {
                 pendingIntent = PendingIntent.getActivity(
                        this,
                        0, intentToLaunchThisActivityFromNotification,
                        PendingIntent.FLAG_UPDATE_CURRENT);
            }`

저는 업그레이드해야 했습니다.

    liteImplementation "com.google.android.gms:play-services-ads:20.4.0"

로.

    liteImplementation "com.google.android.gms:play-services-ads:20.6.0"

play-services-ads:20.4.0은 sdk31을 지원하지 않는 작업 런타임 버전에 의존합니다.

java 또는 react-native를 사용하는 경우 이 app/build.gradle 내부에 붙여넣습니다.

dependencies {
  // ...
  implementation 'androidx.work:work-runtime:2.7.1'
}

Kotlin을 사용하는 경우 다음을 사용합니다.

dependencies {
  // ...
  implementation 'androidx.work:work-runtime-ktx:2.7.0'
}

보류 중 사용 시 오류 발생의도

if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.S) {

 

               pendingIntent = PendingIntent.getActivity(
                        this,
                        0, intentToLaunchThisActivityFromNotification,
                        PendingIntent.FLAG_IMMUTABLE);
            }
            else
            {
                 pendingIntent = PendingIntent.getActivity(
                        this,
                        0, intentToLaunchThisActivityFromNotification,
                        PendingIntent.FLAG_UPDATE_CURRENT);
            }

Android 12의 크래시 문제를 안고 있는 사람이 있다면 AndroidMenifest.xml에 다음 항목을 추가해 주세요.

<activity 
   ...
   android:exported="true" // in most cases it is true but based on requirements it can be false also   
>   


   // If using react-native push notifications then make sure to add into it also

 <receiver   
android:name="com.dieam.reactnativepushnotification.modules.RNPushNotificationBootEventReceiver" android:exported="true">
 
   //  Similarly
 
 <service android:name="com.dieam.reactnativepushnotification.modules.RNPushNotificationListenerService" android:exported="true">
  1. build.gradle(앱)에 다음 행을 추가합니다.
implementation 'androidx.work:work-runtime:2.7.1'
  1. Manifest.xml에 다음 권한을 추가합니다.
<uses-permission android:name="android.permission.SCHEDULE_EXACT_ALARM"/>
  1. 보류 중인 의도를 다음과 같이 수정합니다.

if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.S) { alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), AlarmManager.INTERVAL_DAY, PendingIntent.getBroadcast(getApplicationContext(), 0, alertIntent, PendingIntent.FLAG_MUTABLE)); } else { alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), AlarmManager.INTERVAL_DAY, PendingIntent.getBroadcast(getApplicationContext(), 0, alertIntent, PendingIntent.FLAG_UPDATE_CURRENT)); }

이 문제는 버전 1.4.1 이상으로 업데이트하면 지금 수정해야 합니다.

https://developer.android.com/jetpack/androidx/releases/media#media-1.4.1

버전 1.4.1 2021년8월 4일

Androidx.media:media 1.4.1이 출시되었습니다.버전 1.4.1에는 이러한 커밋이 포함되어 있습니다.

버그 수정

  • 보류 중인 생성에 대한 변경 가능성 플래그 수정Android S를 타겟으로 할 때 크래시를 방지하려는 의도입니다.
  • Notification Compat의 ClassVerificationFailure를 수정합니다.Media Style.

SdkVersion을 31로 변경한 후 라이브러리를 업데이트했더니 오류가 사라졌습니다.

Android 버전 12 또는 S로 앱 대상 업그레이드(사용 대기 중만)Intent.FLAG_MUTABLE 및 보류 중의도.FLAG_Immmouble

int intentFlagType = PendingIntent.FLAG_ONE_SHOT;
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.S) {
    intentFlagType = PendingIntent.FLAG_IMMUTABLE;  // or only use FLAG_MUTABLE >> if it needs to be used with inline replies or bubbles.
}
PendingIntent pendingIntent = PendingIntent.getActivity(context, notificationID, intent, intentFlagType);

언급URL : https://stackoverflow.com/questions/68473542/mediasessioncompattargeting-s-version-31-and-above-requires-that-one-of-flag

반응형