본문 바로가기

Android + Kotlin

[Crashlytics] 외부 브라우저 연동시 SecurityException 수정

반응형

크래시틱스에 아래와 같이 이슈가 올라왔습니다.

 

Fatal Exception: java.lang.SecurityException: Permission Denial: starting Intent { act=android.intent.action.VIEW dat=https://webdt.edunet.net/... cmp=com.mxtech.videoplayer.ad/com.mxtech.videoplayer.ActivityWebBrowser } from ProcessRecord{8de9fc0 1592:com.***.***.***/u0a269} (pid=1592, uid=10269) not exported from uid 10247
       at android.os.Parcel.createExceptionOrNull(Parcel.java:2376)
       at android.os.Parcel.createException(Parcel.java:2360)
       at android.os.Parcel.readException(Parcel.java:2343)
       at android.os.Parcel.readException(Parcel.java:2285)
       at android.app.IActivityTaskManager$Stub$Proxy.startActivity(IActivityTaskManager.java:3882)
       at android.app.Instrumentation.execStartActivity(Instrumentation.java:1727)
       at android.app.Activity.startActivityForResult(Activity.java:5389)
       at androidx.activity.ComponentActivity.startActivityForResult(ComponentActivity.java:574)
       at android.app.Activity.startActivityForResult(Activity.java:5347)
       at androidx.activity.ComponentActivity.startActivityForResult(ComponentActivity.java:560)
       at android.app.Activity.startActivity(Activity.java:5733)
       at android.app.Activity.startActivity(Activity.java:5686)
       at com.***.***.***.ui.common.activity.BaseDetailActivityV2$initViews$5$1$1.shouldOverrideUrlLoading(BaseDetailActivityV2.kt:552)
       at org.chromium.android_webview.AwContentsClientBridge.shouldOverrideUrlLoading(:90)
       at android.os.MessageQueue.nativePollOnce(MessageQueue.java)
       at android.os.MessageQueue.next(MessageQueue.java:335)
       at android.os.Looper.loop(Looper.java:193)
       at android.app.ActivityThread.main(ActivityThread.java:7861)
       at java.lang.reflect.Method.invoke(Method.java)
       at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:600)
       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:967)

 

소스의 해당 위치를 살펴보니 웹뷰의 shouldOverrideUrlLoading() 함수에서 Intent.ACTION_VIEW 로 외부 브라우저를 호출할때 발생하였습니다.

 

특별히 이상한 부분이 없어 에러 내용을 자세히 살펴보니 아래와같은 내용이 눈에 띄었습니다.

 

cmp=com.mxtech.videoplayer.ad/com.mxtech.videoplayer.ActivityWebBrowser

 

위의 패키지 네임을 구글링을 해보니, MX 플레이어가 나왔습니다.

MX 플레이어에 브라우저 기능을 하는 웹뷰 Activity가 있고, 이를 사용자가 선택하여 발생하는 이슈였습니다.

 

이를 해결하려면 MX 플레이어의 ActivityWebBrowser에 android:exported="true" 를 설정을 해야하는데, 다른 앱에 어떻게 설정을 하겠습니까?

그래서, 외부 부라우저 호출시에 exported 여부를 확인하도록 수정하였습니다.

 

Intent(Intent.ACTION_VIEW, url).also {
    try {
        val activityInfo = it.resolveActivityInfo(packageManager, it.flags)
        if(activityInfo != null && activityInfo.exported) {
            context.startActivity(it)
        }
    } catch (e: ActivityNotFoundException) {
        Toast.makeText(context, "연결할수 있는 앱이 없습니다.", Toast.LENGTH_SHORT).show()
    }
}

 

반응형