programing

보류 중인 "누락"을 해결하는 방법안드로이드 api 30+의 의도 변이성 플래그" 린트 경고?

subpage 2023. 8. 7. 22:33
반응형

보류 중인 "누락"을 해결하는 방법안드로이드 api 30+의 의도 변이성 플래그" 린트 경고?

대상 SDK를 30+(Android R 이상)로 업데이트하자마자 보풀 경고Missing PendingIntent mutability flag의 게나요어에 .PendingIntent.FLAG_UPDATE_CURRENT I I want to define 때할의정플래를그▁whenPendingIntent.

앱 기능에 영향을 주지 않으면서 이 보풀을 어떻게 처리해야 합니까?

보류 중인 의도를 다음과 같이 설정할 수 있습니다.

val updatedPendingIntent = PendingIntent.getActivity(
   applicationContext,
   NOTIFICATION_REQUEST_CODE,
   updatedIntent,
   PendingIntent.FLAG_IMMUTABLE or PendingIntent.FLAG_UPDATE_CURRENT // setting the mutability flag 
)

여기 문서에 따르면: https://developer.android.com/about/versions/12/behavior-changes-12#pending-intent-mutability

FLAG_IMTUBLE을 사용하는 것을 강력히 고려하십시오. 일부 기능이 Pending에 의존하는 경우에만 FLAG_MUTABLE을 사용하십시오.의도는 가변적입니다. 예를 들어 인라인 응답 또는 버블과 함께 사용해야 하는 경우.

그에 따라 깃발을 선택합니다.

만약 당신이 이것에 대해 더 읽고 싶다면, 나는 당신이 여기에서 이 훌륭한 기사를 읽는 것을 제안합니다: https://medium.com/androiddevelopers/all-about-pendingintents-748c8eb8619 .

Android 12에서 앱을 실행하도록 허용하면 새 보류 중입니다.의도 변동성 플래그입니다.보류 중이 아닌 경우돌연변이 의도, 사용

PendingIntent pendingIntent;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        pendingIntent = PendingIntent.getActivity(this,
                0, notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE);

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

    }

보류 중인 경우변환할 의도는 다음을 사용합니다.

PendingIntent pendingIntent;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
        pendingIntent = PendingIntent.getActivity(this,
                0, notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_MUTABLE);

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

    }

Google 문서에서 FLAG_IMTUBLE 사용을 강력하게 고려하십시오. 일부 기능이 Pending에 의존하는 경우에만 FLAG_MUTABLE을 사용하십시오.의도는 가변적입니다.변화는 간단해야 합니다.또한 앱에서 AdMob 20.4.0 이하를 사용하는 경우 다음 작업 관리자 종속성을 추가해야 합니다.

//Work Manager dependency
implementation 'androidx.work:work-runtime:2.7.1'

현재 작업 관리자 종속성 버전은 2.7.1입니다.원하는 경우 버전을 최신 버전으로 업데이트할 수 있습니다.

최신 버전의 WorkManager를 사용하지 않는 경우 이 문제가 표시됩니다.버전 2.7.0-alpha02에서 수정되었습니다.

보류 중으로 만들기Android 12를 대상으로 할 때 충돌을 해결하기 위한 의도적인 가변성 명시

2.7.0-alpha02는 Android 12 Developer Preview 1 SDK와만 호환됩니다.따라서 베타나 RC에 도달할 때까지 기다리는 것이 좋습니다.

2021년 4월 21일 업데이트 -- 문제를 검색하는 사용자를 위해 이 답변에 추가하면 발생할 수 있는 버그가 다음과 같이 나타날 수 있습니다.

java.lang.IllegalArgumentException: com.myapp.myapp: Targeting S+ (version 10000 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:386)
        at android.app.PendingIntent.getBroadcastAsUser(PendingIntent.java:657)
        at android.app.PendingIntent.getBroadcast(PendingIntent.java:644)
        at androidx.work.impl.utils.ForceStopRunnable.getPendingIntent(ForceStopRunnable.java:174)
        at androidx.work.impl.utils.ForceStopRunnable.isForceStopped(ForceStopRunnable.java:108)
        at androidx.work.impl.utils.ForceStopRunnable.run(ForceStopRunnable.java:86)
        at androidx.work.impl.utils.SerialExecutor$Task.run(SerialExecutor.java:75)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
        at java.lang.Thread.run(Thread.java:920)

이 충돌을 보기 위해 앱에서 WorkManager를 직접 사용할 필요는 없습니다.

여기에 요약된 바와 같이, 솔루션은 귀사에 종속성을 추가하는 것입니다.build.gradleAndroid 12 빌드용 파일:

 implementation 'androidx.work:work-runtime-ktx:2.7.0-alpha05'

이 종속성은 Java 전용, Kotlin + 코루틴, RxJava2, GCMNetworkManager 등을 사용하는지 여부에 따라 다릅니다.따라서 위의 dox를 반드시 확인해야 합니다.

위의 버전 번호를 최신 버전으로 대체합니다.그리고 언급했듯이, 이것은 안드로이드-13 이전 빌드와 호환되지 않습니다.

final int flag =  Build.VERSION.SDK_INT >= Build.VERSION_CODES.M ? PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE : PendingIntent.FLAG_UPDATE_CURRENT;
PendingIntent pendingIntent = PendingIntent.getActivity(context, PENDING_INTENT_REQUEST_CODE, notificationIntent, flag);

앱이 Android 12를 대상으로 하는 경우 (targetSdkVersion = 31)이전 버전의 WorkManager를 직접 사용하거나 타사 라이브러리에서 사용한 다음 최신 버전으로 업데이트해야 해결할 수 있습니다.

dependencies {
    val work_version = "2.8.1"

    // (Java only)
    implementation("androidx.work:work-runtime:$work_version")

    // Kotlin + coroutines
    implementation("androidx.work:work-runtime-ktx:$work_version")

    // optional - RxJava2 support
    implementation("androidx.work:work-rxjava2:$work_version")        
}

다음과 같이 보류 중인 의도를 업데이트할 수 있습니다.

val updatedPendingIntent = PendingIntent.getActivity(
   context,
   NOTIFICATION_REQUEST_CODE,
   updatedIntent,
   PendingIntent.FLAG_IMMUTABLE or PendingIntent.FLAG_UPDATE_CURRENT 
)

보류 중인 항목을 추가할 수 있습니다.의도.플래그_불변 | 기호와 함께 사용하면 작동합니다.

Java 및 ADMOB를 사용하는 경우 보류 중입니다.SDKS 또는 Android 12에서 의도 오류가 발생했습니다.다음은 ADMOB가 올바른 작업 실행 시간을 사용하는 수정 사항입니다.

implementation 'com.google.android.gms:play-services-ads:19.5.0'
    constraints {
        implementation('androidx.work:work-runtime:2.7.0-alpha05') {
            because 'previous versions have a bug impacting this application'
        }
    }

제 경우에는 이전 WorkManager 버전을 사용하던 타사 라이브러리에서도 새 Android Work 버전을 모든 종속성에 사용하도록 강제하는 것이 root build.gradle 파일에서 다음과 같습니다.

allproject {
  project.configurations.all {
    resolutionStrategy {
      force 'androidx.work:work-runtime:2.7.0'
    }
  }
}

이 충돌은 구현 'androidx'로 해결되었습니다.작업:작업-작업:2.7.1'

네 가지 다른 Pending이 있었기 때문에제 코드의 의도는 모든 코드에 FLAG_IMTUBLE을 추가하는 것으로 시작했습니다.그러나 문제는 남아 있었습니다.저의 4가지 의도를 분석하는 데 많은 시간을 소비한 후, 저는 그 문제가 제 도서관 중 하나에서 발생할 수도 있다는 것을 깨달았습니다.

build.gradle에서 라이브러리는 일반적으로 오래된 경우 강조 표시되지만 Firebase BOM의 경우에는 그렇지 않습니다.

제가 가지고 있던 것:

implementation platform('com.google.firebase:firebase-bom:26.1.1')

이것은 매우 오래된 것으로 밝혀졌습니다.업데이트 후

implementation platform('com.google.firebase:firebase-bom:29.0.4')

모든 것이 괜찮았습니다.더 이상 FLAG_IMITUBLE 오류가 없습니다.

Android 12에서 앱을 실행하도록 허용하면 새 보류 중입니다.의도 변동성 플래그입니다.보류 중이 아닌 경우음소거할 의도, 사용

자바

PendingIntent updatedPendingIntent = PendingIntent.getActivity(
   applicationContext,
   NOTIFICATION_REQUEST_CODE,
   updatedIntent,
   PendingIntent.FLAG_IMMUTABLE | PendingIntent.FLAG_UPDATE_CURRENT // setting the mutability flag 
)

코틀린

val updatedPendingIntent = PendingIntent.getActivity(
   applicationContext,
   NOTIFICATION_REQUEST_CODE,
   updatedIntent,
   PendingIntent.FLAG_IMMUTABLE or PendingIntent.FLAG_UPDATE_CURRENT // setting the mutability flag 
)

보류 중인 경우음소거하려면 다음을 사용합니다.

자바

PendingIntent updatedPendingIntent = PendingIntent.getActivity(
   applicationContext,
   NOTIFICATION_REQUEST_CODE,
   updatedIntent,
   PendingIntent.FLAG_MUTABLE | PendingIntent.FLAG_UPDATE_CURRENT // setting the mutability flag 
)

코틀린

val updatedPendingIntent = PendingIntent.getActivity(
   applicationContext,
   NOTIFICATION_REQUEST_CODE,
   updatedIntent,
   PendingIntent.FLAG_MUTABLE or PendingIntent.FLAG_UPDATE_CURRENT // setting the mutability flag 
)

마지막으로 이 종속성 구현

//Work Manager dependency
implementation 'androidx.work:work-runtime:2.7.1'

나는 사고를 당했습니다.Fatal Exception: java.lang.IllegalArgumentException. Not posted. PendingIntents attached to actions with remote inputs must be mutable.

저는 가변성을 매개변수로 보낼 수 있는 이 util method를 작성했습니다.때때로 알림의 응답 작업과 같이 가변 플래그를 가져오는 것이 필요합니다.

private fun getPendingIntentFlags(isMutable: Boolean = false) =
    when {
        isMutable && Build.VERSION.SDK_INT >= Build.VERSION_CODES.S ->
            PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_MUTABLE

        !isMutable && Build.VERSION.SDK_INT >= Build.VERSION_CODES.M ->
            PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE

        else -> PendingIntent.FLAG_UPDATE_CURRENT
    }

사용 예:

val quickReplyPendingIntent = PendingIntent.getBroadcast(
                context, notificationId, replyIntent,
                getPendingIntentFlags(true)
            )

이 문제는 작업 라이브러리의 문제입니다.최신 버전도 2.7.0-alpha04에 영향을 받습니다.

https://issuetracker.google.com/issues/194108978

임시 해결 방법으로 "작업" 종속성을 그라데이션에 포함하여 주석 처리하고 프로젝트를 통해 해당 클래스를 사용하여 제거합니다.적어도 이런 식으로 앱을 정상적으로 실행하고 다른 기능과 영역에서 작업할 수 있습니다.

내 프로젝트에서 이 라인은 작동했습니다.

PendingIntent pendingIntent = PendingIntent.getActivity(this,0, notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE);

이 문제는 프로젝트를 업그레이드하고 Android 버전 12, Android Run App On Android 12를 대상으로 할 때 발생합니다.솔루션을 사용하면 모든 보류 중인 인턴을 업데이트할 수 있습니다.

Targeting S+(버전 31 이상)를 사용하려면 보류 중을 생성할 때 FLAG_IMTABLE 또는 FLAG_MUTABLE 중 하나를 지정해야 합니다.의도

코드 아래에서 사용

 PendingIntent pendingIntent = null;
        if (Build.VERSION.SDK_INT>= Build.VERSION_CODES.S){
             pendingIntent = stackBuilder.getPendingIntent(1, PendingIntent.FLAG_MUTABLE);

        }else {
             pendingIntent = stackBuilder.getPendingIntent(1, PendingIntent.FLAG_UPDATE_CURRENT);

        }

또한 프로젝트에서 수신기를 사용하는 경우 이 종속성 작업을 구현합니다.

//Work Manager dependency
implementation 'androidx.work:work-runtime:2.7.1'

여기 KOTLIN에서 30에서 33으로 이동하는 제 사용 사례가 있습니다.

미디어 종속성 추가

implementation "androidx.media:media:1.4.1"

작업 관리자 업데이트

 implementation "androidx.work:work-runtime-ktx:2.7.0"

변경할 수 없는 업데이트

fun getImmutableFlag() = if(isAndroidAPI31())  PendingIntent.FLAG_IMMUTABLE or PendingIntent.FLAG_UPDATE_CURRENT else 0

fun isAndroidAPI31() = android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.S

private fun createOpenAppIntent(context: Context): PendingIntent {
        val intent = Intent(context, MainActivity::class.java).apply {
            flags = Intent.FLAG_ACTIVITY_CLEAR_TOP or Intent.FLAG_ACTIVITY_SINGLE_TOP
        }
        return PendingIntent.getActivity(context, 0, intent, getImmutableFlag())
    }

모든 활동, 서비스, 공급자, 수신자에서 추가되지 않은 경우 매니페스트에 내보낸 태그 추가

android:exported="true"

이것이 효과가 있기를 바랍니다, 좋은 하루 보내세요.

업데이트했습니다.work-runtime-ktx로의 버전.2.7.1

위의 변경 후에 나는 또 다른 오류에 빠졌습니다.

java.lang.IllegalStateException: SimpleTypeImpl should not be created for error type: ErrorScope{Error scope for class <ERROR CLASS> with arguments: org.jetbrains.kotlin.types.IndexedParametersSubstitution@14ac19e7}

업데이트를 통해 위의 오류를 해결한 방법을 확인합니다.kotlin-gradle-plugin버전은 여기입니다.

저는 제 사례를 조금 공유하고 싶습니다.플래그를 FLAG_IMMOTIBLE로 변경했지만 앱이 백그라운드에 있을 때만 오류가 발생했습니다.저는 여기서 그것을 해결했습니다: https://github.com/firebase/firebase-android-sdk/issues/3115

근본 원인은 FCM 토큰을 더 이상 사용하지 않는 방법으로 검색하기 때문입니다.

FirebaseInstanceId.getInstance().getInstanceId().addOnSuccessListener(activity,  new OnSuccessListener<InstanceIdResult>() {
        @Override
        public void onSuccess(InstanceIdResult instanceIdResult) {
            String newToken = instanceIdResult.getToken();
       
        }
    });

그런 다음 종속성을 업데이트합니다.

FirebaseMessaging.getInstance().getToken().addOnCompleteListener(task -> {
            String newToken = task.getResult();
        });

시작:

https://developer.android.com/reference/android/app/PendingIntent#FLAG_MUTABLE

"빌드까지.VERSION_CODERS.R, 보류FLAG_IMTOUBLE이 설정되지 않은 경우 기본적으로 의도는 변경 가능한 것으로 간주됩니다.빌드부터 시작합니다.VERSION_CODEDS.S. Pending의 가변성을 명시적으로 지정해야 합니다.(@link #FLAG_IMTABLE} 또는 FLAG_MUTABLE을 사용하여 생성할 예정입니다.보류 중을 생성할 때는 FLAG_IMTUBLE을 사용하는 것이 좋습니다.의도.FLAG_MUTABLE은 일부 기능이 기본 의도를 수정하는 데 의존하는 경우에만 사용해야 합니다(예: 보류 중).인라인 응답 또는 버블과 함께 사용해야 하는 의도"

오늘과 같은 행동을 유지하려면 무엇이든 "보류 중"으로 변경합니다.의도.FLAG_MUTABLE | 아무거나"

보류 중인 의도/활동, 서비스, 공급자, 수신자를 생성/검색할 때

찾을 장소:

PendingIntent.getBroadcast(...

.getPendingIntent(...

PendingIntent.getService

PendingIntent.getActivity

또한 안드로이드x를 사용하는 앱인 경우.작업을 최소한 다음으로 업그레이드해야 합니다.

implementation 'androidx.work:work-runtime-ktx:2.7.0-alpha05'

그들이 alpha02에서 SDK 12의 모든 변경 사항과 관련하여 수정한 버그가 있습니다.

는 만것은든내를 만들었습니다.PendingIntentCompat.kt것상적인추를 PendingIntent논리학을 분리합니다.

object PendingIntentCompat {

    @JvmStatic
    @JvmOverloads
    fun getActivity(
        context: Context,
        requestCode: Int,
        intent: Intent,
        flags: Int,
        isMutable: Boolean = false
    ): PendingIntent {
        return PendingIntent.getActivity(
            context,
            requestCode,
            intent,
            addMutabilityFlags(isMutable, flags)
        )
    }

    @JvmStatic
    @JvmOverloads
    fun getService(
        context: Context,
        requestCode: Int,
        intent: Intent,
        flags: Int,
        isMutable: Boolean = false
    ): PendingIntent {
        return PendingIntent.getService(
            context,
            requestCode,
            intent,
            addMutabilityFlags(isMutable, flags)
        )
    }

    @JvmStatic
    @JvmOverloads
    @RequiresApi(Build.VERSION_CODES.O)
    fun getForegroundService(
        context: Context,
        requestCode: Int,
        intent: Intent,
        flags: Int,
        isMutable: Boolean = false
    ): PendingIntent {
        return PendingIntent.getForegroundService(
            context,
            requestCode,
            intent,
            addMutabilityFlags(isMutable, flags)
        )
    }

    /**
     * https://developer.android.com/about/versions/12/behavior-changes-12#pending-intent-mutability
     */
    private fun addMutabilityFlags(isMutable: Boolean, flags: Int): Int {
        var updatedFlags = flags

        if (isMutable) {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
                updatedFlags = flags or PendingIntent.FLAG_MUTABLE
            }
        } else {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                updatedFlags = flags or PendingIntent.FLAG_IMMUTABLE
            }
        }
        return updatedFlags
    }
}

Notification, DeepLink 및 Navigation과 관련하여 이 문제가 있는 경우에는 다음과 같이 내비게이션 종속성 버전을 업데이트하는 것을 잊지 마십시오.

implementation 'androidx.navigation:navigation-ui-ktx:2.5.3'
implementation 'androidx.navigation:navigation-fragment-ktx:2.5.3'

이전 버전의 탐색 의존성 때문에 이 문제가 발생했습니다.

언급URL : https://stackoverflow.com/questions/67045607/how-to-resolve-missing-pendingintent-mutability-flag-lint-warning-in-android-a

반응형