为什么CustomTabsClient.bindCustomTabsService不能工作?

问题描述 投票:0回答:1

我最近一直在努力增加一些 浏览器自定义标签 到我的 Android 应用程序中,但由于某些原因,我无法绑定到 CustomTabsService。

  • 我有一个更新版本的 Chrome
  • 安卓Gradle插件4.0.0版
  • Gradle版本6.1.1

我已经添加了日志调用,看看我的连接是否成功,但它从来没有。我试图通过使用CustomTabsCallback来根据用户在CustomTabs中的导航采取行动,但我需要先连接到服务。感谢任何帮助

依赖性

// Custom Tabs
    implementation 'androidx.browser:browser:1.3.0-alpha01'
    implementation 'com.google.guava:listenablefuture:9999.0-empty-to-avoid-conflict-with-guava'

我也试过用这个(当前版本是 此处):

implementation 'androidx.browser:browser:1.2.0'

CustomTabsFragment

package com.mullr.rabbithole.ui.dig

import android.app.Service
import android.content.ComponentName
import android.content.Context
import android.content.Intent
import android.graphics.Color
import android.net.Uri
import android.os.Bundle
import android.util.Log
import androidx.fragment.app.Fragment
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.appcompat.content.res.AppCompatResources
import androidx.browser.customtabs.*
import androidx.core.content.ContextCompat
import androidx.core.graphics.drawable.DrawableCompat
import androidx.core.graphics.drawable.toBitmap
import com.mullr.rabbithole.R
import com.mullr.rabbithole.main.MainActivity
import kotlinx.android.synthetic.main.dig_fragment.*

private lateinit var main: MainActivity

class DigTabs : Fragment() {

    // Custom Tabs
    lateinit var client: CustomTabsClient
    lateinit var session: CustomTabsSession
    lateinit var serviceConnection: CustomTabsServiceConnection
    var builder = CustomTabsIntent.Builder()

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        main = requireActivity() as MainActivity

       serviceConnection = object : CustomTabsServiceConnection() {
            override fun onCustomTabsServiceConnected(name: ComponentName, mClient: CustomTabsClient) {
                Log.d("Service", "Connected")
                client = mClient
                client.warmup(0L)
                val callback = RabbitCallback()
                session = mClient.newSession(callback)!!
                builder = CustomTabsIntent.Builder(session);
            }

            override fun onServiceDisconnected(name: ComponentName?) {

            }
        }

        Log.d("start", "attempt")
        // Connect to service
        var ok =  CustomTabsClient.bindCustomTabsService(main, main.packageName, serviceConnection)
        if (ok) {
            Log.d("start", "connected")
        } else {
            Log.d("start", ok.toString())
        }
    }

    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        // Inflate the layout for this fragment
        return inflater.inflate(R.layout.fragment_dig_tabs, container, false)
    }

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        wiki_button.setOnClickListener {
            var url = "https://www.wikipedia.org/"
            loadCustomTab(url)
        }

        google_button.setOnClickListener {
            var url = "https://www.google.com"
            loadCustomTab(url)
        }
    }

    fun loadCustomTab(url: String) {
        builder.setSecondaryToolbarColor(ContextCompat.getColor(main, R.color.colorAccent))
        builder.setToolbarColor(
            ContextCompat.getColor(
                main,
                R.color.black
            )
        ) // Change tab toolbar color
        builder.setShowTitle(true)
        builder.addDefaultShareMenuItem()
        builder.enableUrlBarHiding()
        AppCompatResources.getDrawable(main, R.drawable.close_icon)?.let {
            DrawableCompat.setTint(it, Color.WHITE)
            builder.setCloseButtonIcon(it.toBitmap())
        }
        val customTabsIntent: CustomTabsIntent = builder.build()
        customTabsIntent.launchUrl(main, Uri.parse(url))
    }

    override fun onDestroy() {
        super.onDestroy()
        main.unbindService(serviceConnection)
    }

    class RabbitCallback : CustomTabsCallback() {
        override fun onNavigationEvent(navigationEvent: Int, extras: Bundle?) {
            super.onNavigationEvent(navigationEvent, extras)
            Log.d("Nav", "test")
            when (navigationEvent) {
                1 -> Log.d("Navigation", "Start")
                NAVIGATION_FINISHED -> Log.d("Navigation", "Finished")
                NAVIGATION_FAILED -> Log.d("Navigation", "Failed")
                NAVIGATION_ABORTED -> Log.d("Navigation", "Aborted")
                TAB_SHOWN -> Log.d("Navigation", "Tab Shown")
                TAB_HIDDEN -> Log.d("Navigation", "Tab Hidden")
                else -> Log.d("Navigation", "Else")
            }
        }
    }
}
android android-studio kotlin chrome-custom-tabs
1个回答
0
投票

这原来是一个愚蠢的错误。CustomTabsClient.bindCustomTabsService方法需要的是Custom Tabs服务的包名,而不是调用活动的包名。所以这个...

var ok =  CustomTabsClient.bindCustomTabsService(main, main.packageName, serviceConnection)

应该是...

var ok =  CustomTabsClient.bindCustomTabsService(main, "com.android.chrome", serviceConnection)

可能的包名可以在下面找到 此处. 它们包括:

  • com.android.chrome
  • com.chrome.beta
  • com.chrome.dev
© www.soinside.com 2019 - 2024. All rights reserved.