Chrome Custom Tabs를 지원하는 비 Chrome 브라우저 응용 프로그램

Firefox와Sams 인터넷 Browser가 Chrome Custom Tabs에 대응한다고 들었습니다.
실제로 Chrome Custom Tabs의 프로토콜은 상당히 간단합니다.다른 대응하는 브라우저 앱이 있어도 이상하지 않다.
그래서 우리는 어떤 브라우저가 대응하는지 조사하기 위해 간단한 프로그램을 만들었다.
소스 코드 여기 있습니다.
https://github.com/ohmae/custom-tabs-sample
※ 크롬 커스텀 테이블로 이동하는 인터내셔널 투척에 불과합니다.bind 하면 다른 기사 내줄 거야.
※ 크롬이 아니면 크롬 커스텀 택스라고 부르지 않겠습니다. 제가 먼저 놓을게요.

응용 프로그램에 대한 조사 방법


Chrome Custom Tabs의 샘플 코드는 다음과 같습니다.
https://github.com/GoogleChrome/custom-tabs-client
지원되는 패키지는 CustomTabsHelper#getPackageNameToUse입니다.
https://github.com/GoogleChrome/custom-tabs-client/blob/master/shared/src/main/java/org/chromium/customtabsclient/shared/CustomTabsHelper.java
하고 있는 일을 대략적으로 쓰다
-http://www.example.com에 반응하는 패키지 조사(≈ 브라우저 애플리케이션)
- 동작에 반응하는 서비스만 꺼내기android.support.customtabs.action.CustomTabsService하나만 있으면 그걸로 할게요.
- 여러 개의 경우 http://www.example.com 관련 프로그램(≈ 기본 브라우저)이 있으면 Chrome의 stable→beta→dev→local 우선순위로 이 프로그램을 사용합니다
이런 느낌이야.Chrome Custom Tabs를 사용하는 경우 이 처리를 참조하여 해당 패키지를 꺼내는 작업을 작성하십시오.
(솔직히 브라우저에서 찾은 게 아니라 android.support.customtabs.action.CustomTabsService에 반응하는 서비스만 제공하면 돼...)
정정: Chrome Custom Tabs에서도 URL을 여는 Intent는 ACTION입니다.VIEW가 URL을 지정하는 물건이기 때문에 둘 다 대응할 필요가 있다.

샘플 응용 프로그램


이번에는 우선순위에 따라 하나를 뽑는 것이 아니라 대응하는 응용 프로그램 목록을 모두 뽑아낸다.
원시 처리는 좀 간단하다. 아래와 같다.http://www.example.com에 반응하는 패키지(≈ 브라우저 애플리케이션)의 패키지 이름을 Set으로 제거합니다.
private fun getBrowserPackages(pm: PackageManager): Set<String> {
    val intent = Intent(Intent.ACTION_VIEW, Uri.parse("http://www.example.com/"))
    intent.addCategory(Intent.CATEGORY_BROWSABLE)
    val flags = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        PackageManager.MATCH_ALL
    } else {
        0
    }
    return pm.queryIntentActivities(intent, flags)
        .mapNotNull { it.activityInfo?.packageName }
        .toSet()
}
※ 위의 안드로이드 M 이상인 경우 queryIntentActivities의 두 번째 매개 변수PackageManager.MATCH_ALL에 지정되지 않으면 기본 브라우저가 설정되어 해당 패키지만 반환됩니다. 주의하십시오.android.support.customtabs.action.CustomTabsService에 반응하는 서비스의 응용 프로그램과 브라우저 응용 프로그램만 꺼내면 됩니다.
표시하기 위해서 먼저 아이콘과 프로그램 이름을 꺼내십시오.
private fun createPackageList(): List<PackageInfo> {
    val pm = packageManager
    val browsers = getBrowserPackages(pm)
    return pm.queryIntentServices(Intent(ACTION_CUSTOM_TABS_CONNECTION), 0)
        .mapNotNull { it.serviceInfo }
        .filter { browsers.contains(it.packageName) }
        .map {
            PackageInfo(
                it.loadIcon(pm),
                it.loadLabel(pm).toString(),
                it.packageName
            )
        }
}
private data class PackageInfo(
    val drawable: Drawable?,
    val label: String,
    val packageName: String
)
그리고 RecyclearView에 이것을 보여 주십시오.
클릭하면 EditText에 적힌 URL이 CustomTabs에서 열립니다.
샘플에는 MainActivity가 하나밖에 없어요.

결실


Google Play에서 브라우저 등을 통해 검색하고 다양한 브라우저 애플리케이션을 설치한 후 실행하면 이런 느낌입니다.


외관
Chrome
Edge


Yandex
Firefox


총결산


이것은 대응하는 응용 프로그램 일람표를 알고 있다.
  • Chrome (stable/dev/beta/canary)
  • Firefox (stable/beta/nightly/focus)
  • Yandex (stable/beta/alpha)
  • Edge
  • 삼성 브라우저
  • Kiwi Browser
  • Brave
  • 브라우저 프로그램이 많기 때문에 빠른 검색으로만 찾을 수 있습니다.
    또 지금 대응하는 것이 없으면 머지않아 대응할 것이다.
    Chrome Custom Tabs는 상당히 많은 브라우저 애플리케이션을 지원합니다.
    나는 최대 두세 개를 찾았으면 좋겠다고 생각했지만, 이렇게 많을 줄은 몰랐다.
    브라우저 프로그램을 만들려면 대응이 필요할 수도 있습니다.
    다른 한편, 사용하고자 하는 응용 프로그램은 샘플 코드에 따라 설치하면 크롬 이외의 소프트웨어를 사용할 수 있다는 것을 인식해야 한다.
    크롬이 아니면 곤란해지기 때문에 가방의 선택 논리를 바꾸어 크롬 이외의 물건이 사용되지 않도록 해야 한다.
    반면 특별한 이유가 없다면 사용자가 기본적으로 설정한 브라우저를 사용하는 것이 편의성 면에서 가장 좋은 선택 알고리즘이다.
    그게 다야.

    좋은 웹페이지 즐겨찾기