Android

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

 

Leave a Reply

error: Content is protected !!