반응형
안드로이드에서 외부 URL을 열 때, 보통 WebView를 많이 사용하지만
그보다 속도가 빠르고, 탭에 대한 커스터마이징이 가능한 Chrome Custom Tab이라는 기능이 있다.
먼저 해당 디바이스에서 pakageManager를 통해 크롬 사용 가능 여부를 확인하여,
가능한 경우 Service 사용 단계로 넘어가도록 처리해주었다.
fun isChromeEnabled(context: Context): Boolean
= context.packageManager.getPackageInfo("com.android.chrome", 0).applicationInfo.enabled
openChromeWebService() 라는 함수를 새로 만들어, 해당 함수 내에서 실질적인 Chrome Tab View 작업을 진행한다.
fun openChromeWebService(context: Context, openUrl: String) {
if (openUrl.isEmpty()) return
val chromePackage = "com.android.chrome"
val chromeTabConnection: CustomTabsServiceConnection =
object : CustomTabsServiceConnection() {
override fun onServiceDisconnected(name: ComponentName) {
Log.i("CHROME","chrome Tab Service Disconnected")
}
override fun onCustomTabsServiceConnected(name: ComponentName, client: CustomTabsClient) {
val session = client.newSession(object : CustomTabsCallback() {
override fun onNavigationEvent(navigationEvent: Int, extras: Bundle?) {
super.onNavigationEvent(navigationEvent, extras)
when (navigationEvent) {
NAVIGATION_STARTED -> Log.i("CHROME","chrome NAVIGATION_STARTED")
NAVIGATION_FINISHED -> Log.i("CHROME","chrome NAVIGATION_FINISHED")
NAVIGATION_FAILED -> Log.i("CHROME","chrome NAVIGATION_FAILED")
NAVIGATION_ABORTED -> Log.i("CHROME","chrome NAVIGATION_ABORTED")
}
}
})
.....
CustomTabsServiceConnection의 override 되는 메서드 2가지를 통해 상황에 따른 동작 상태 확인이 가능하다.
이후 단계에서는 탭바의 타이틀 보기 설정, 또는 필요에 따라 원하는 Menu를 추가하여 목적에 맞게 Intent를 적용할 수 있다.
launchUrl 메서드를 통해 가장 중요한 openUrl을 지정해주는 것을 잊지말자.
val customTabsIntentBuilder = CustomTabsIntent.Builder(session)
customTabsIntentBuilder.setShowTitle(true)
val menuItemTitle = "my menu"
val actionIntent = Intent(
context, MainActivity::class.java
)
val menuItemPendingIntent = PendingIntent.getActivity(
context, 1, actionIntent, PendingIntent.FLAG_IMMUTABLE
)
customTabsIntentBuilder.addMenuItem(menuItemTitle, menuItemPendingIntent)
val customTabsIntent = customTabsIntentBuilder.build()
customTabsIntent.intent.setPackage(chromePackage)
customTabsIntent.intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
customTabsIntent.launchUrl(context, Uri.parse(openUrl))
최종적으로 CustomTabsClient에 bind 시켜주면 View를 열기 위한 준비가 끝난다.
CustomTabsClient.bindCustomTabsService(context, chromePackage, chromeTabConnection)
반응형