Android Question Play YouTube video in Android TV app

hatzisn

Expert
Licensed User
Longtime User
Good afternoon everybody,

I researched what is mentioned in the title several times in the past but got dissapointed. Was anyone capable of doing this? I have used the IFrame player api and created a webpage that works flawlessly in browser but the same web page with loadHTML in an android tv webview, and execute some javascript code in it, will not work at all. This is the case even if I have set the JavaScriptEnabled to true in WebView. Has anyone been able to work make the iFrame player api work with an app in android tv?

I also found this which contains a reference to a library but I do not have the knowledge to take advantage of it and create a wrapper. If anyone is able to do it then please by any means do so...

 

hatzisn

Expert
Licensed User
Longtime User
Since Google is not available (like it was ever) to ask I asked Gemini. Here is what I have got (a bit generative but accurate at the most part or Newton's first law in action ;) ) :

Unfortunately, directly showing YouTube videos within your Android TV app isn't possible due to licensing restrictions imposed by YouTube. Their official API doesn't allow embedding videos in third-party apps on connected TVs like Android TV. However, there are alternative approaches you can consider:


1. Utilize the existing YouTube app:


  • This is the simplest and most recommended approach. Guide users to the official YouTube app pre-installed on most Android TVs. You can achieve this by:
    • Providing a button or link: Launch the YouTube app with a specific video or search query pre-filled.
    • Displaying a message: Inform users about the pre-installed YouTube app and suggest they search for the desired video there.

2. Leverage casting functionality:


  • If your app involves user-generated content or videos not available on YouTube, casting allows users to "throw" content from your app to the YouTube app on their TV.
  • Popular casting solutions include Google Cast and Chromecast. Implement the necessary SDKs and APIs to enable casting functionality within your app.

3. Explore alternative video platforms:


  • Consider integrating with other video platforms with APIs that allow embedding in connected TV apps. Research and compare different platforms based on your specific needs and content type.

Important notes:


  • Remember to respect copyright and licensing terms of any video platform you choose.
  • Ensure a seamless user experience when directing users to other apps or platforms.
  • Thoroughly test your implementation on different Android TV models and versions for compatibility.

I hope this guidance helps! Feel free to ask if you have further questions or need more specific information about any of these approaches.
 
Last edited:
Upvote 0

hatzisn

Expert
Licensed User
Longtime User
I Asked also this:

Please show me the licensing restrictions imposed by YouTube that prohibit me displaying a video in my Android TV app.



The result:

Unfortunately, YouTube's licensing restrictions aren't explicitly laid out in a single document but rather spread across various resources and agreements. However, I can highlight key points that directly impact displaying videos in third-party Android TV apps:
1. YouTube Terms of Service:
  • Section 8.2.2 specifically prohibits "reproducing, distributing, transmitting, displaying, publicly performing, creating derivative works from, selling, licensing, or otherwise exploiting" any YouTube content "except as expressly permitted by the Services or these Terms."
2. YouTube API Services Agreement:
  • This agreement, which developers must adhere to when using YouTube APIs, clearly states that the "Embedding Restriction" allows embedding only on "web pages and non-embedded mobile/web apps." Connected TVs like Android TV fall outside this scope.
3. Developer Policies:
  • YouTube's developer policies emphasize that their APIs are not intended for "downloading or accessing content in a way that is not intended by the YouTube service." Displaying videos within your app would violate this policy.
4. Content Owner Permissions:
  • Even if your app met YouTube's technical restrictions, you would still need individual permission from each video owner for display within your app. This is impractical for most scenarios.
Alternative Resources:
  • While not directly focused on licensing, YouTube's "Embedding Videos on Websites" page () provides further context on their embedding policies.
  • The YouTube for Developers website (https://developers.google.com/youtube) offers various resources and support for developers using YouTube APIs, but confirms the limitations for connected TV apps.
I understand that navigating these restrictions can be frustrating. However, it's crucial to respect YouTube's policies and user agreements to avoid copyright infringement and potential legal issues. By exploring the alternative approaches I mentioned earlier, you can still offer a valuable video experience within your Android TV app while complying with regulations.
 
Upvote 0

hatzisn

Expert
Licensed User
Longtime User
Gemini 3/3

Question:

Why then does it allow to display youtube videos with the proper library in phones?


Response:

You're correct that the YouTube Mobile app SDK does allow embedding YouTube videos within mobile apps on phones and tablets. While it might seem contradictory to their restrictions on Android TV apps, there are key differences:
1. Platform and Intent:
  • Phone and tablet screens are generally smaller and considered personal devices for individual consumption. Embedding videos in these contexts offers a more seamless and controlled experience within the app itself.
  • Android TV, on the other hand, is designed for larger screens and shared viewing experiences. Allowing embedding on TVs could potentially lead to unauthorized distribution, mirroring, or public screenings, which go against YouTube's content licensing and monetization model.
2. Commercial Agreements:
  • YouTube might have specific commercial agreements or partnerships with mobile device manufacturers or software developers, allowing embedding within their approved mobile apps under certain conditions. These agreements are likely absent for broader Android TV app development.
3. User Control and Revenue Model:
  • On phones, users primarily interact directly with the YouTube app, ensuring YouTube maintains control over ad placements and other revenue-generating mechanisms. Embedded videos still direct users back to the main YouTube app or open in a web browser controlled by YouTube.
  • On Android TV, embedding could potentially allow developers to circumvent YouTube's ad placements and viewing experience, impacting their revenue model and control over content distribution.
It's important to note that YouTube's policies and restrictions can evolve over time. While mobile embedding is currently allowed, future changes might affect its availability. Always stay updated on their developer guidelines and terms of service to ensure compliance.
For your Android TV app, remember that the mentioned alternative approaches of directing users to the YouTube app, utilizing casting functionality, or exploring alternate video platforms are still viable options that respect YouTube's licensing restrictions and offer valuable video experiences to your users.
 
Upvote 0

hatzisn

Expert
Licensed User
Longtime User
Gemini 4/4

Question:

What is keeping Google from creating a similar library for Android TV and modifying the terms to allow displaying in Android TV? Isn't public reproduction possible though the original YouTube app? Isn't it the same?


Response:

There are several factors to consider when it comes to the question of why Google hasn't created a similar library for Android TV and modified the terms to allow video display:
Technical Considerations:
  • User Interfaces: Android TV and phone/tablet platforms differ significantly in terms of user interaction and controls. Developing a separate library to ensure a seamless and optimized experience on TVs requires additional investment and resources.
  • Performance and Compatibility: Streaming high-quality video content on larger screens with varying hardware capabilities requires technical adjustments and optimizations compared to mobile devices.
Licensing and Legal Issues:
  • Content Rights: As mentioned previously, YouTube content creators hold rights to their works. Enabling broader embedding on connected TVs could raise complex legal issues regarding unauthorized distribution, public screenings, and potential copyright infringement.
  • Commercial Agreements: Existing agreements with TV manufacturers and content providers might have specific terms that wouldn't align with unrestricted video embedding through a third-party library.
Business and Policy Decisions:
  • User Experience and Control: YouTube prioritizes the user experience within its official app, ensuring control over ad placements, viewing metrics, and overall content presentation. Unrestricted embedding could disrupt their ecosystem and impact revenue streams.
  • Maintaining a Balanced Ecosystem: Allowing embedded videos on any Android TV app might create an imbalanced ecosystem where certain developers could gain unfair advantages or circumvent YouTube's policies, leading to potential misuse and negative impacts.
Public Reproduction through the YouTube App:
While public reproduction is technically possible through the YouTube app on Android TV, it's important to distinguish between:
  • Individual user viewing: Watching a video within the official YouTube app is licensed and controlled by YouTube, ensuring proper rights management and revenue generation.
  • Embedding in a third-party app: This creates a separate context outside YouTube's control, potentially leading to unauthorized distribution or public screenings without proper licensing agreements.
Ultimately, Google's decision reflects a balance between technical feasibility, licensing and legal concerns, business models, and maintaining a controlled and positive user experience for both content creators and viewers. As the landscape of online video evolves, future changes in policies and technologies are always possible, so it's crucial to stay informed and compliant with current regulations.
I hope this clarifies the complex factors involved in this decision. If you have any further questions about specific aspects of this topic, feel free to ask!
 
Upvote 0

nedium

Active Member
Licensed User
Longtime User

Hello, @achank
I wanted to know how to use this library since I use the example but it gives me an error. I don't know if I'm leaving something out. Could you upload an example of everything that is needed for it to work?






Lineas log:
--------- beginning of main
Copying updated assets files (1)
*** Service (starter) Create ***
** Service (starter) Start **
** Activity (main) Create (first time) **
** Activity (main) Resume **
Youtube view is ready
java.lang.NoClassDefFoundError: Failed resolution of: Landroid/support/v4/content/ContextCompat;
    at com.pierfrancescosoffritti.youtubeplayer.PlayerControlsWrapper.onStateChange(PlayerControlsWrapper.java:243)
    at com.pierfrancescosoffritti.youtubeplayer.YouTubePlayerBridge$1.run(YouTubePlayerBridge.java:35)
    at android.os.Handler.handleCallback(Handler.java:958)
    at android.os.Handler.dispatchMessage(Handler.java:99)
    at android.os.Looper.loopOnce(Looper.java:230)
    at android.os.Looper.loop(Looper.java:319)
    at android.app.ActivityThread.main(ActivityThread.java:8919)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:578)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1103)
Caused by: java.lang.ClassNotFoundException: android.support.v4.content.ContextCompat
    ... 10 more
 
Last edited:
Upvote 0

achank

New Member
Hello, @achank
I wanted to know how to use this library since I use the example but it gives me an error. I don't know if I'm leaving something out. Could you upload an example of everything that is needed for it to work?






Lineas log:
--------- beginning of main
Copying updated assets files (1)
*** Service (starter) Create ***
** Service (starter) Start **
** Activity (main) Create (first time) **
** Activity (main) Resume **
Youtube view is ready
java.lang.NoClassDefFoundError: Failed resolution of: Landroid/support/v4/content/ContextCompat;
    at com.pierfrancescosoffritti.youtubeplayer.PlayerControlsWrapper.onStateChange(PlayerControlsWrapper.java:243)
    at com.pierfrancescosoffritti.youtubeplayer.YouTubePlayerBridge$1.run(YouTubePlayerBridge.java:35)
    at android.os.Handler.handleCallback(Handler.java:958)
    at android.os.Handler.dispatchMessage(Handler.java:99)
    at android.os.Looper.loopOnce(Looper.java:230)
    at android.os.Looper.loop(Looper.java:319)
    at android.app.ActivityThread.main(ActivityThread.java:8919)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:578)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1103)
Caused by: java.lang.ClassNotFoundException: android.support.v4.content.ContextCompat
    ... 10 more
Hi @nedium , Sorry, I don't always log in to this account, so I just found out that there was a message from you, okay, I'll include a snippet of my project, I hope it can help, thank you B4X

B4X:
#Region  Project Attributes
    #ApplicationLabel: B4A Example
    #VersionCode: 1
    #VersionName:
    'SupportedOrientations possible values: unspecified, landscape or portrait.
    #SupportedOrientations: unspecified
    #CanInstallToExternalStorage: False
#End Region

#Region  Activity Attributes
    #FullScreen: False
    #IncludeTitle: True
    #BridgeLogger: True
    #AdditionalRes: D:\B4A\JWS2024\res
    #AdditionalJar: com.android.support:support-v4
#End Region

Sub Process_Globals
    'These global variables will be declared once when the application starts.
    'These variables can be accessed from all modules.

End Sub

Sub Globals
    'These global variables will be redeclared each time the activity is created.
    'These variables can only be accessed from this module.

    Private ScrollView_slide As ScrollView
    Private Panel_slide As Panel
    Dim cs As CSBuilder
    Private PanelStream As Panel
    Dim yt As YouTubePlayerView
    Dim Link_Yotube As String
    Private ButtonCheck As Button
    Private EditTextURL As EditText
    Private ButtonSend As Button
    Private EditTextID As EditText
    Dim yt_Tutor As YouTubePlayerView
    Dim Link_Tutor = "qIRYMWLeVC0" As String
    Dim Click As Boolean
    Private PanelTutorial As Panel
    Private Panel3 As Panel
End Sub

Sub Activity_Create(FirstTime As Boolean)
    'Do not forget to load the layout file created with the visual designer. For example:
    Activity.LoadLayout("scroll_stream")
    ScrollView_slide.Panel.LoadLayout("Stream")
    ScrollView_slide.panel.Height = Panel_slide.Height
    Activity.Title = cs.Initialize.Color(Colors.White).Append("Yotube Streaming").PopAll

    yt.Initialize("yt")
    yt_Tutor.Initialize("yt_Tutor")
    PanelStream.AddView(yt,0,0,100%x,50%y)
    Panel3.AddView(yt_Tutor,0,0,100%x,50%y)
    If File.Exists(File.DirInternal, "Link.txt") Then
        Link_Yotube = File.ReadString(File.DirInternal, "Link.txt")
        EditTextID.Text = Link_Yotube
    Else
        Link_Yotube = "qIRYMWLeVC0"
    End If

End Sub


Sub LoadYoutube(Link As String)
    yt.loadVideo(Link, 0) '4YwNW8OlvqU
    yt.playVideo
End Sub

Sub LoadYoutube1(Link As String)
    yt_Tutor.loadVideo(Link, 0) '4YwNW8OlvqU
    yt_Tutor.playVideo
End Sub

Sub yt_ready
    Log("Youtube view is ready")
    LoadYoutube(Link_Yotube)
End Sub

Sub yt_enterfullscreen
    Log("FullScreen")
'    yt.loadVideo("UnmznFua_9s", 0)
'    yt.playVideo
End Sub
Sub yt_exitfullscreen
    Log("ExitFullScreen")
End Sub

Sub Activity_Resume
    
End Sub

Sub Activity_Pause (UserClosed As Boolean)
    yt.release
End Sub


Private Sub ButtonCheck_Click
    Log(EditTextURL.Text)
    If EditTextURL.Text.Length > 0 Then
        Test(EditTextURL.Text)
    End If
End Sub

Private Sub EditTextURL_TextChanged (Old As String, New As String)
    
End Sub

Private Sub ButtonSend_Click
    If EditTextID.Text.Length > 0 Then
'        CallSub2(Starter, "SendMessage", "Youtube URL" & "#" & EditTextID.Text & "#")
        File.WriteString(File.DirInternal, "Link.txt", EditTextID.Text)
    End If
End Sub

Private Sub EditTextID_TextChanged (Old As String, New As String)
    If EditTextID.Text.Length > 0 Then
        LoadYoutube(EditTextID.Text)
    End If
End Sub

Sub Test(URL As String)
    Log("URL : " & URL)
    Dim m As Map = ExtractURLStruct(URL)
 
'    For Each Key As String In m.Keys
'        Log( "Key: " & Key & " : " & m.Get(Key))       
'    Next 
'    Log(" ----- Path ----- ")
    For Each Value As String In Regex.Split("/", m.Get("path"))
        If Value.Length = 0 Then Continue
        Log("Value: " & Value)
        EditTextID.Text = Value
    Next
End Sub
Public Sub ExtractURLStruct(URL As String) As Map
    Dim Pattern As String = $"^([^:\/?#]+):\/\/([^\/:]+)(?::(\d+))?(\/[^?#]*)?(?:\?([^#]*))?(?:#(.*))?"$
    Dim Matcher As Matcher = Regex.Matcher(Pattern, URL)
    Dim Result As Map : Result.Initialize
    If Matcher.Find Then
        Result.Put("url",       Matcher.Group(0))
        Result.Put("scheme",    Matcher.Group(1))
        Result.Put("domain",     Matcher.Group(2))
        Result.Put("port",         Matcher.Group(3))
        Result.Put("path",         Matcher.Group(4))
        Result.Put("parameters",Matcher.Group(5))
        Result.Put("anchor",    Matcher.Group(6))
    End If
    Return Result
End Sub

Private Sub Button_back_Click
    Activity.Finish
End Sub
Sub Activity_KeyPress (KeyCode As Int) As Boolean 'Return True to consume the event
    If KeyCode = KeyCodes.KEYCODE_BACK Then
        Activity.Finish
    End If
    Return False
End Sub

Private Sub LabelIconYoutube_Click
    Click = Click <> True
    If Click  Then
        PanelTutorial.Visible = True
        LoadYoutube1(Link_Tutor)
    Else
        yt_Tutor.pauseVideo
        PanelTutorial.Visible = False
    End If
End Sub

Private Sub LabelTutorial_Click
    Click = Click <> True
    If Click  Then
        PanelTutorial.Visible = True
        LoadYoutube1(Link_Tutor)
    Else
        yt_Tutor.pauseVideo
        PanelTutorial.Visible = False
    End If
End Sub

 
Upvote 0
Top