setColorFilter() 메소드가 API 29에서 deprecated되었다.NullPointerException 오류 발생을 방지하기 위해 BlendModeColorFilter()메소드를 사용해야한다.
새로운 오류보고가 올라왔다. 오류가 발생한 운영체제는 안드로이드 5.1.1과 안드로이드 10이다. 보통 deprecated된 메소드를 사용해도 문제가 되지않았는데, 이번엔 달랐다.
[오류가 발생한 코드]
토스트 메세지 알림창 배경화면을 바꿔주는 부분에서 발생된 오류이다.
private void finishToast(){
Toast toast = Toast.makeText(GeneralActivity.this, getResources().getString(R.string.c_5), Toast.LENGTH_LONG);
toast.setGravity(Gravity.CENTER, 0, 0);
View view = toast.getView();
view.getBackground().setColorFilter(getResources().getColor(R.color.dot_dark_screen1), PorterDuff.Mode.SRC_IN);
TextView text = view.findViewById(android.R.id.message);
text.setTextColor(getResources().getColor(R.color.colorxml_color_41));
toast.show();
}
[오류 내용]
NullPointerException:: Attempt to invoke virtual method ‘void android.graphics.drawable.Drawable.setColorFilter(int, android.graphics.PorterDuff$Mode)’ on a null object reference
Caused by java.lang.NullPointerException:
Attempt to invoke virtual method 'void android.graphics.drawable.Drawable.setColorFilter
(int, android.graphics.PorterDuff$Mode)' on a null object reference
at com.test.GeneralActivity.finishToast(GeneralActivity.java:3)
at android.app.Activity.performDestroy(Activity.java:8158)
at android.app.Instrumentation.callActivityOnDestroy(Instrumentation.java:1341)
at android.app.ActivityThread.performDestroyActivity(ActivityThread.java:5233)
at android.app.ActivityThread.handleDestroyActivity(ActivityThread.java:5277)
at android.app.servertransaction.DestroyActivityItem.execute(DestroyActivityItem.java:44)
at android.app.servertransaction.TransactionExecutor.executeLifecycleState(TransactionExecutor.java:176)
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:97)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2203)
at android.os.Handler.dispatchMessage(Handler.java:107)
at android.os.Looper.loop(Looper.java:213)
at android.app.ActivityThread.main(ActivityThread.java:7976)
at java.lang.reflect.Method.invoke(Method.java)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:503)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:938)
API 29에서 BlendModeColorFilter 메소드가 새롭게 추가되었다.
setColorFilter()메소드는 더 이상 사용되지 않는다.
즉 지원이 중단된다는 뜻이다.
[해결방법]
BlendModeColorFilter()메소드를 사용하여 처리하되, 안드로이드 버전을 Q부터 적용되록 분기처리한다. Q는 안드로이드 10을 의미하여 API 29를 의미한다. 이 메소드를 사용하게 되면, getResources().getColor()메소드 역시 Deprecated 되어 사용할 수 없음으로 ContextCompat.getColor()메소드를 사용하여 해결할 수 있다. 안드로이드 5.1.1 버전에서는 동일한 오류가 발생할 수 있으니, try..catch()문으로 묶어서 사용하자.
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
view.getBackground().setColorFilter(
new BlendModeColorFilter(ContextCompat.getColor(this, R.color.dot_dark_screen1)
, BlendMode.SRC_ATOP));
} else {
view.getBackground().setColorFilter(getResources().getColor(R.color.dot_dark_screen1), PorterDuff.Mode.SRC_IN);
}
[REFERENCE]
개발자 문서: https://developer.android.com/reference/android/graphics/drawable/Drawable
개발자 문서: https://developer.android.com/reference/android/graphics/BlendModeColorFilter
https://stackoverflow.com/questions/56716093/setcolorfilter-is-deprecated-on-api29/56717316