在 Android 的 Webview 中嵌入 Spotify 无法正常工作

Posted

技术标签:

【中文标题】在 Android 的 Webview 中嵌入 Spotify 无法正常工作【英文标题】:Embed Spotify not working properly at Android's Webview 【发布时间】:2020-05-06 20:20:29 【问题描述】:

我在我的应用程序内的 webview 中使用了 embed spotify,一切正常。但它突然停止工作。现在,每次我单击播放按钮或单击播放列表中的一首歌时,它都会将我重定向到“spotify:playlist:(playlist code)”。我实际上是在捕捉这种意图,但我希望歌曲在 webview 中播放,而不是像以前那样重定向到 spotify 的应用程序。

我的 WebViewClient:

class MyWebViewClient(private val originUrl: String?) : WebViewClient() 

    override fun shouldOverrideUrlLoading(view: WebView?, url: String?): Boolean 
        if (Uri.parse(url).scheme.containsIntent(listOf("market", "whatsapp", "spotify")))
            val intent = Intent(Intent.ACTION_VIEW)
            intent.data = Uri.parse(url)
            val host: Activity = view?.context as Activity
            host.startActivity(intent)

            view.loadUrl(originUrl)
            return true
        


        return false
    

我实际上是在回收站视图中初始化它:

class WebViewHolder(itemView: View) : ViewHolder(itemView),
    HolderInterface 
    private val webView: WebView = itemView.findViewById(R.id.webview)
    private var link: String? = null

    init 
        webView.webChromeClient = WebChromeClient()
    

    override fun bind(message: Message) 
        if (link == null)
            link = message.text

            webView.webViewClient = MyWebViewClient(link)

            webView.settings.javascriptEnabled = true

            webView.setOnTouchListener  view, _ ->
                view.parent.requestDisallowInterceptTouchEvent(true)
                false
            

            webView.loadUrl(link)
        
    

用这个布局给它充气:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:orientation="vertical"
    android:layout_
    android:layout_
    android:paddingLeft="15dp"
    android:paddingStart="15dp"
    android:paddingRight="15dp"
    android:paddingEnd="15dp"
    android:paddingTop="10dp"
    android:paddingBottom="10dp" >

    <androidx.cardview.widget.CardView
        android:id="@+id/bot_image"
        android:layout_
        android:layout_
        android:layout_alignParentStart="true"
        android:layout_alignParentLeft="true"
        android:layout_margin="1dp"
        android:thicknessRatio="1.9"
        app:cardCornerRadius="30dp">

        <ImageView
            android:layout_
            android:layout_
            android:layout_gravity="center"
            android:src="@drawable/chat_bot_avatar"/>
    </androidx.cardview.widget.CardView>

    <RelativeLayout
        android:layout_
        android:layout_
        android:layout_marginStart="5dp"
        android:layout_marginLeft="5dp"
        android:layout_toEndOf="@id/bot_image"
        android:layout_toRightOf="@id/bot_image">

        <WebView
            android:id="@+id/webview"
            android:layout_
            android:layout_
            android:focusable="true"
            android:clickable="true" />

    </RelativeLayout>

</RelativeLayout>

我正在使用此链接测试此 web 视图:https://open.spotify.com/embed/playlist/27XP00bk55vpUc9KaQoIjz

它曾经在我的回收站视图中工作。从那以后,我没有对我的 webview 文件进行任何更改。

这段代码有问题吗?

[编辑]

我实际上发现大多数手机都不会发生此错误。到目前为止,我是唯一受影响的,不仅在应用程序上,而且在浏览器上(包含 embed spotify 的网站)。有没有人有任何想法?

【问题讨论】:

【参考方案1】:

Spotify 需要 Webview 的外部权限。

尝试在您的WebChromeClient 中实现onPermissionRequest()

 override fun onPermissionRequest(request: PermissionRequest?) 
            val resources = request?.resources
            for (i in resources?.indices!!) 
                if (PermissionRequest.RESOURCE_PROTECTED_MEDIA_ID == resources[i]) 
                    request.grant(resources)
                    return
                
            
            super.onPermissionRequest(request)
        

【讨论】:

以上是关于在 Android 的 Webview 中嵌入 Spotify 无法正常工作的主要内容,如果未能解决你的问题,请参考以下文章

在android webview中制作嵌入视频全屏

将 instagram 嵌入 Android WebView

Android程序中嵌入WebView,单击其中的链接时无反应,请问是啥原因引起的?如何解决?

在 Android WebView 中自动播放嵌入的 YouTube 视频有啥新技巧吗?

强制横向时Android应用程序(嵌入式WebView)崩溃

使用嵌入式 HTML 代码加载 WebView - Android