보류 중인 "누락"을 해결하는 방법안드로이드 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.gradle
Android 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
'programing' 카테고리의 다른 글
Express 명령을 찾을 수 없습니다. (0) | 2023.08.07 |
---|---|
PowerShell을 사용하여 파일을 휴지통으로 이동하는 방법은 무엇입니까? (0) | 2023.08.07 |
MYSQL, 선택한 필드를 한 테이블에서 다른 테이블로 복사 (0) | 2023.08.07 |
PHP - 배열을 클래스 상수로 사용합니다. (0) | 2023.08.07 |
동일한 데이터베이스에서 스토리지 엔진을 혼합해도 괜찮습니까? (0) | 2023.08.02 |