Android自定义Chrome标签,带有深层链接

时间:2018-04-06 09:09:34

标签: android kotlin android-customtabs

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

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

<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选项卡中启动)和intent过滤器之间获得了无限循环重定向,后者立即将用户重定向回活动:

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

如何实现与webviews相同的行为但不修改网址?它甚至可行吗?

1 个答案:

答案 0 :(得分:1)

我做了一些挖掘,发现你应该搜索支持&#34;温暖服务的套餐&#34;。如果返回包,则可以将包名称分配给Intent。 Google有一些带有帮助类的GitHub仓库。有问题的是CustomTabHelper#getPackageNameToUse()

所以在你的情况下:

[27/Apr/2018 10:33:37] "OPTIONS /api/scenarios/ HTTP/1.1" 200 0
{u'tasks': [{u'what_can_go_wrong': u'Lorem', u'stakeholder': 1, u'why_perform_task': u'Lorem', u'how_often': u'MO', u'title': u'One', u'how_important_task': u'RI', u'people_involved': u'Lorem', u'special_training_required': False, u'why_important_task': None, u'project': 1, u'sequence_of_actions': u'Lorem', u'how_important_improvement': u'LI', u'role': u'Lorem', u'benefits_of_improvement': u'Lorem', u'effects_of_task': u'Lorem', u'tools_used': u'Lorem', u'special_vocabulary_used': u'Lorem', u'id': 1, u'any_improvements': u'Lorem', u'what_training_required': u'Lorem'}, {u'what_can_go_wrong': u'', u'stakeholder': 1, u'why_perform_task': u'', u'how_often': u'', u'title': u'Eleven', u'how_important_task': u'', u'people_involved': u'', u'special_training_required': None, u'why_important_task': None, u'project': 1, u'sequence_of_actions': u'', u'how_important_improvement': u'', u'role': u'', u'benefits_of_improvement': u'', u'effects_of_task': u'', u'tools_used': u'', u'special_vocabulary_used': u'', u'id': 11, u'any_improvements': u'', u'what_training_required': u''}]}
('task_data: ', OrderedDict([(u'title', u'One'), (u'how_often', u'MO'), (u'how_important_task', u'RI'), (u'role', u'Lorem'), (u'why_perform_task', u'Lorem'), (u'why_important_task', None), (u'sequence_of_actions', u'Lorem'), (u'tools_used', u'Lorem'), (u'special_training_required', False), (u'what_training_required', u'Lorem'), (u'what_can_go_wrong', u'Lorem'), (u'effects_of_task', u'Lorem'), (u'special_vocabulary_used', u'Lorem'), (u'people_involved', u'Lorem'), (u'any_improvements', u'Lorem'), (u'how_important_improvement', u'LI'), (u'benefits_of_improvement', u'Lorem'), (u'stakeholder', <User: nitish123>), (u'project', <Project: One>)]))
Internal Server Error: /api/scenarios/
Traceback (most recent call last):
  File "D:\Development\Bern\VB_rewrite\vb_env_drf\lib\site-packages\django\core\handlers\exception.py", line 41, in inner
    response = get_response(request)
  File "D:\Development\Bern\VB_rewrite\vb_env_drf\lib\site-packages\django\core\handlers\base.py", line 187, in _get_response
    response = self.process_exception_by_middleware(e, request)
  File "D:\Development\Bern\VB_rewrite\vb_env_drf\lib\site-packages\django\core\handlers\base.py", line 185, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "D:\Development\Bern\VB_rewrite\vb_env_drf\lib\site-packages\django\views\decorators\csrf.py", line 58, in wrapped_view
    return view_func(*args, **kwargs)
  File "D:\Development\Bern\VB_rewrite\vb_env_drf\lib\site-packages\django\views\generic\base.py", line 68, in view
    return self.dispatch(request, *args, **kwargs)
  File "D:\Development\Bern\VB_rewrite\vb_env_drf\lib\site-packages\rest_framework\views.py", line 483, in dispatch
    response = self.handle_exception(exc)
  File "D:\Development\Bern\VB_rewrite\vb_env_drf\lib\site-packages\rest_framework\views.py", line 443, in handle_exception
    self.raise_uncaught_exception(exc)
  File "D:\Development\Bern\VB_rewrite\vb_env_drf\lib\site-packages\rest_framework\views.py", line 480, in dispatch
    response = handler(request, *args, **kwargs)
  File "D:\Development\Bern\VB_rewrite\vb_env_drf\lib\site-packages\rest_framework\decorators.py", line 53, in handler
    return func(*args, **kwargs)
  File "D:\Development\Bern\VB_rewrite\VB_DRF_Backend\scenarios\views.py", line 37, in scenarios_list
    serializer.save(stakeholder=request.user)
  File "D:\Development\Bern\VB_rewrite\vb_env_drf\lib\site-packages\rest_framework\serializers.py", line 214, in save
    self.instance = self.create(validated_data)
  File "D:\Development\Bern\VB_rewrite\VB_DRF_Backend\scenarios\serializers.py", line 17, in create
    task = Task.objects.get(pk=task_data.get('id'))
  File "D:\Development\Bern\VB_rewrite\vb_env_drf\lib\site-packages\django\db\models\manager.py", line 85, in manager_method
    return getattr(self.get_queryset(), name)(*args, **kwargs)
  File "D:\Development\Bern\VB_rewrite\vb_env_drf\lib\site-packages\django\db\models\query.py", line 380, in get
    self.model._meta.object_name
DoesNotExist: Task matching query does not exist.
[27/Apr/2018 10:33:38] "POST /api/scenarios/ HTTP/1.1" 500 18923

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