4

我有一个 Android/Kotlin 应用程序,我想为某些页面配置深层链接以在我的应用程序中打开(看起来是原生的)。

目前,我有意图过滤器,可将用户重定向到使用 WebView 的活动,在该活动中我打开所需的 url:

<activity android:name=".activity.WebViewActivity">
        <intent-filter android:label="Futurity">
            <action android:name="android.intent.action.VIEW" />

            <category android:name="android.intent.category.DEFAULT" />
            <category android:name="android.intent.category.BROWSABLE" />

            <data
                android:host="api.example.com"
                android:pathPrefix="/auth/confirm"
                android:scheme="https" />
        </intent-filter>
</activity>

class WebViewActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_web_view)

        val data = intent.data

        // construct url
        val url = if (intent.data != null ) {
            "https://" + data.host + data.path + "?" + data.query
        }

        appWebView.webViewClient = WebViewClient()
        appWebView.loadUrl(url)
    }
}

这很好用,但出于安全原因,我想改用 Chrome 自定义标签。

但是,当我尝试配置自定义选项卡而不是 WebView 时,我在页面(在 chrome 选项卡中启动)和立即将用户重定向回活动的意图过滤器之间获得了无限循环的重定向:

CustomTabsIntent.Builder builder = new CustomTabsIntent.Builder();
CustomTabsIntent customTabsIntent = builder.build();
customTabsIntent.launchUrl(this, Uri.parse(url));

如何在不修改 url 的情况下实现与 webviews 相同的行为?它甚至可行吗?

4

1 回答 1

1

我做了一些挖掘,发现您应该搜索支持“变暖服务”的软件包。如果返回一个包,那么您可以将包名称分配给 Intent。谷歌有一个带有一些帮助类的 GitHub 存储库。有问题的是CustomTabHelper#getPackageNameToUse()

所以在你的情况下:

CustomTabsIntent.Builder builder = new CustomTabsIntent.Builder();
CustomTabsIntent customTabsIntent = builder.build();
String packageName = CustomTabsHelper.getPackageNameToUse(getContext());

if (packageName != null) {
    customTabsIntent.intent.setPackage(packageName);
}
customTabsIntent.launchUrl(this, Uri.parse(url));

如果找不到包,那么您将需要一些后备代码,否则无限循环将继续发生。

于 2018-04-26T20:59:57.773 回答