如何在亚马逊消防电视播放YouTube视频中的WebView? [英] How to play YouTube videos in WebView on Amazon Fire TV?

查看:290
本文介绍了如何在亚马逊消防电视播放YouTube视频中的WebView?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想在web视图亚马逊消防电视播放YouTube视频。

截至今天,有播放YouTube视频的消防OS没有官方的API(的链接),所以我就先用Android的WebView功能工作。在的Andr​​oid的WebView 的文件被写入,该应用程序需要有硬件加速开启,并且web视图需要有一个WebChromeClient以播放YouTube视频。

我试图得到它的工作,但是当我开始一个YouTube视频,比我只看到在全屏模式下加载微调。

下面是我的code:

  @覆盖
公共无效的onCreate(包savedInstanceState){
  super.onCreate(savedInstanceState);

  的WebView的WebView =新的WebView(本);
  的setContentView(web视图);

  。webview.getSettings()setBuiltInZoomControls(真正的);
  webview.getSettings()setJavaScriptEnabled(真)。
  webview.setWebChromeClient(新WebChromeClient(){

    @覆盖
    公共无效onShowCustomView(查看视图,CustomViewCallback回调){
      Log.i(火的电视,显示自定义视图);

      super.onShowCustomView(查看,回调);
      如果(查看的instanceof的FrameLayout){
        的FrameLayout帧=(的FrameLayout)视图;
        如果(frame.getFocusedChild()的instanceof VideoView){
          VideoView视频=(VideoView)frame.getFocusedChild();
          frame.removeView(视频)
          的setContentView(视频)
          video.start();
        }
      }
    }

    @覆盖
    公共无效onHideCustomView(){
      Log.i(火的电视,隐藏自定义视图。);
    }

  });

  webview.setWebViewClient(新WebViewClient(){

    @覆盖
    公共布尔shouldOverrideUrlLoading(web视图查看,字符串URL){
      返回false;
    }

  });

  最后弦乐MIMETYPE =text / html的;
  最终的字符串编码=UTF-8;
  串的HTML = getHTML();

  Log.i(火的电视,加载:+ HTML);
  webview.loadDataWithBaseURL(,HTML,MIMETYPE,编码,);
}

私人字符串getHTML(){
  字符串的HTML =< IFRAME类= \的YouTube播放器\的风格= \边界:0;宽度:100%;高度:100%;填充:0px;保证金:0px \ID = \ytplayer \型= \text / html的\SRC = \http://www.youtube.com/embed/
          +h11u3vtcpaY
          +?FS = 0 \FRAMEBORDER = \0 \> \ N
          +< / IFRAME> \ N的;

  返回HTML;
}
 

解决方案

我写了一个类来播放YouTube的视频火的电视上,它也适用于Kindle Fire的为好。如你所知,YouTube不会有正式的API,我们不得不求助于使用webviews这一点。我在这里贴类有很多东西,除了webviews,你可能会好奇,所以我会解释。首先,你会发现,一个YouTube播放的WebView会继续玩,当你离开你的活动,除非你告诉它停止。因此,解决办法的人告诉其他人是使用的onPause和pauseTimers方法闭嘴视频。但是,亚马逊已经强加给我们一个棘手的问题,那就是音频和视频资源不释放到操作系统(不与谷歌Android棒棒糖即Nexus的播放器有问题)的其余部分。当资源被你的应用程序举行,主要视频无法播放和亚马逊不会让你在商店的应用程序。他们知道,织补以及我们必须使用webviews YouTube的,所以他们给了我们建议的这一点:

  

问:我可以用一个Android的WebView和视频的HTML标记   播放?
  答:是的,有限制。硬件媒体资源不是   目前该系统发布的时候你的应用程序暂停或停止。至   解决此问题,实现你的onStop()方法来明确   杀掉该进程为您的应用程序:

<一个href="https://developer.amazon.com/public/solutions/devices/fire-tv/docs/amazon-fire-tv-sdk-frequently-asked-questions"相对=nofollow>亚马逊源

像AVGN会说:他们在想什么?

您不会相信多么正义的力量杀死一个应用程序或活动会导致吨问题..以及我敢肯定,你这样做,因为你有比我更多的是几个千分点。

唯一的解决办法我能找到的是加载在很短的720p高清短片(必须有声音!)中的onPause方法。我与webView.onPause和.pauseTimers结合它是的......

如果你使用这个类,请我blank.mp4文件复制到自己的服务器,因为它可能不是还有一个月。

哦,但还有更多。所以,你得到你的YouTube的文件在你的web视图...蛋糕右边那条?错了,它不会因为webViews播放,HTML5平时从不自动播放。你不能将URL设置为自动播放没什么区别。所以我的解决办法是用java弄虚作假强制点击。它的工作方式是,web视图没有立即加载,它需要的时间变量为它完全加载。它之后,将视频显示在屏幕的中心的播放按钮图标。小遥控器不能触摸它的某些原因。但我把code强制在web视图中心的点击。

哦还有一件事,你必须处理音频焦点或亚马逊将不允许在店里你的应用程序。潘多拉可以在后台,除非你搞定比赛。

为什么亚马逊为什么

 包com.ohiovr.modules.youtube;


进口android.app.Activity;
进口android.content.Context;
进口android.content.pm.ActivityInfo;
进口android.graphics.Point;
进口android.media.AudioManager;
进口android.os.Bundle;
进口android.os.SystemClock;
进口android.util.Log;
进口android.view.Display;
进口android.view.KeyEvent;
进口android.view.MotionEvent;
进口android.view.View;
进口android.view.WindowManager;
进口android.webkit.WebChromeClient;
进口android.webkit.WebSettings;
进口android.webkit.WebView;
进口android.webkit.WebViewClient;

进口java.util.Timer中;
进口java.util.TimerTask中;



公共类youtubeKindleWebView延伸活动{


    字符串StringYoutubeUrl;
    的WebView web视图;

    AFChangeListener hocusFocus;
    私人字符串videoBlanker =htt​​p://ohiovr.com/church_files/blank.mp4;

    @覆盖
    公共无效的onCreate(包savedInstanceState){
        super.onCreate(savedInstanceState);
        的setContentView(R.layout.activity_generic_web_view);

        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);

        web视图=(web视图)findViewById(R.id.webView);
        WebSettings webSettings = webView.getSettings();
        webSettings.setBuiltInZoomControls(真正的);
        webSettings.setJavaScriptEnabled(真正的);
        webSettings.setAppCacheEnabled(假);
        webSettings.setLoadWithOverviewMode(真正的);
        webSettings.setUseWideViewPort(真正的);
        //我用这条线在一个旧的,现在不使用实时流执行力度。它的工作原理,所以我没有将其删除。但你可能
        //希望看到的,如果它是nessisary:
        webSettings.setUserAgentString("Mozilla/5.0(iPhone;U;CPUiPhoneOS4_0likeMacOSX;en-us)AppleWebKit/532.9(KHTML,likeGecko)Version/4.0.5Mobile/8A293Safari/6531.22.7");


        webView.setWebViewClient(新的回调());
        webView.setWebChromeClient(新WebChromeClient());


    }

    类AFChangeListener实现AudioManager.OnAudioFocusChangeListener {
        @覆盖
        公共无效onAudioFocusChange(INT focusChange){
            如果(focusChange == AudioManager.AUDIOFOCUS_LOSS_TRANSIENT){
                // mp.pause();
            }否则,如果(focusChange == AudioManager.AUDIOFOCUS_GAIN){
                // mp.start();
            }否则,如果(focusChange == AudioManager.AUDIOFOCUS_LOSS){
                // mp.stop();
            }
        }
    }

    @覆盖
    公共布尔的onkeydown(INT键code,KeyEvent的事件){
        布尔处理= FALSE;

        开关(钥匙code){
            案例KeyEvent.KEY code_DPAD_CENTER:
                forceAClick();
                打破;
            案例KeyEvent.KEY code_BUTTON_A:
                // ...手柄的选择
                办理=真;
                打破;
            案例KeyEvent.KEY code_DPAD_LEFT:
                // ...处理左行动
                办理=真;
                打破;
            案例KeyEvent.KEY code_DPAD_RIGHT:
                // ...处理正确的行动
                办理=真;
                打破;
        }
        返回处理|| super.onKeyDown(键code,事件);
    }


    公共无效forceAClick(){

        定时器定时=新的Timer();
        timer.schedule(新的TimerTask(){
            @覆盖
            公共无效的run(){
                runOnUiThread(新的Runnable(){
                    @覆盖
                    公共无效的run(){
                        显示显示= getWindowManager()getDefaultDisplay()。
                        点大小=新的点();
                        display.getSize(大小);
                        INT宽度= size.x;
                        INT高= size.y;


                        //获取MotionEvent对象
                        长时间停机= SystemClock.uptimeMillis();
                        长eventTime = SystemClock.uptimeMillis()+ 100;
                        浮X =宽度/ 2;
                        浮动Y =身高/ 2;
                        //元国家名单中的位置:developer.android.com/reference/android/view/KeyEvent.html#getMetaState()
                        INT亚状态= 0;
                        MotionEvent motionEvent = MotionEvent.obtain(
                                停机时间,
                                eventTime,
                                MotionEvent.ACTION_DOWN,
                                X,
                                Y,
                                亚状态
                        );

                        webView.setOnTouchListener(新View.OnTouchListener(){
                            @覆盖
                            公共布尔onTouch(视图V,MotionEvent事件){
                                Log.d(触摸,降落);
                                返回false;
                            }
                        });

                        webView.dispatchTouchEvent(motionEvent);
                    }
                });
            }
        },1);

        timer.schedule(新的TimerTask(){
            @覆盖
            公共无效的run(){
                runOnUiThread(新的Runnable(){
                    @覆盖
                    公共无效的run(){
                        显示显示= getWindowManager()getDefaultDisplay()。
                        点大小=新的点();
                        display.getSize(大小);
                        INT宽度= size.x;
                        INT高= size.y;


                        //获取MotionEvent对象
                        长时间停机= SystemClock.uptimeMillis();
                        长eventTime = SystemClock.uptimeMillis()+ 100;
                        浮X =宽度/ 2;
                        浮动Y =身高/ 2;
                        //元国家名单中的位置:developer.android.com/reference/android/view/KeyEvent.html#getMetaState()
                        INT亚状态= 0;
                        MotionEvent motionEvent = MotionEvent.obtain(
                                停机时间,
                                eventTime,
                                MotionEvent.ACTION_UP,
                                X,
                                Y,
                                亚状态
                        );

                        webView.setOnTouchListener(新View.OnTouchListener(){
                            @覆盖
                            公共布尔onTouch(视图V,MotionEvent事件){
                                Log.d(触摸,润色);
                                返回false;
                            }
                        });

                        webView.dispatchTouchEvent(motionEvent);


                    }
                });
            }
        },120);


        AudioManager上午=(AudioManager)this.getSystemService(Context.AUDIO_SERVICE);
//请求音频焦点回放
        hocusFocus =新AFChangeListener();
        INT结果= am.requestAudioFocus(hocusFocus,AudioManager.STREAM_MUSIC,AudioManager.AUDIOFOCUS_GAIN);
    }


    @覆盖
    公共无效onResume(){
        super.onResume();
        webView.onResume();
        webView.resumeTimers();
        StringYoutubeUrl =htt​​ps://www.youtube.com/embed/+ getIntent()getStringExtra(youtubeID);
        webView.loadUrl(StringYoutubeUrl);
        。getWindow()addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);

    }


    私有类回调扩展WebViewClient {//这是由于某种原因,很重要的。不要删除!
        @覆盖
        公共布尔shouldOverrideUrlLoading(web视图查看,字符串URL){
            返回(假);
        }
    }


    @覆盖
    保护无效的onPause(){
        super.onPause();

        webView.loadUrl(videoBlanker);
        webView.pauseTimers();
        webView.onPause();
    }



    / *
    问:我可以用一个Android的WebView和&lt;视频&GT; HTML标记的视频播放?
    A:
    是的,有限制。硬件媒体资源目前尚未被系统发布的时候你的应用程序暂停或停止。要解决此问题,实现你的onStop()方法来显式终止该进程为您的应用程序:

    https://developer.amazon.com/public/solutions/devices/fire-tv/docs/amazon-fire-tv-sdk-frequently-asked-questions
    公共无效的onStop(){
        super.onStop();
        android.os.Process.killProcess(android.os.Process.myPid());
    }
    此问题也可能会导致不稳定,用户体验和导航为您的应用程序。该视龙SDK是在设备上的媒体播放推荐的方法。
    * /

    @覆盖
    保护无效的onStop(){
        super.onStop();
        //下一行的迷人的部分是,它不会杀死的应用程序,只有这个意图
        ///////////// android.os.Process.killProcess(android.os.Process.myPid());
        //不不不!亚马逊的建议是不好的。这导致了大量的问题。
        //原来的问题是,web视图视频查看frankenhybrid不会释放
        //当用户退出了视频播放器硬件。
        //唯一的,正确的解决办法是加载一个很短的安静夹入的WebView
        //当用户离开
        //看到的onPause对我实施

    }


}
 

I want to play a YouTube video in a WebView for Amazon Fire TV.

As of today, there is no official API for playing YouTube videos on Fire OS (link), so I tried to get it working with Android's WebView. In the Android WebView documentation it is written, that the app needs to have hardware acceleration turned on and that the WebView needs to have a WebChromeClient in order to playback YouTube videos.

I tried to get it work but when I start a YouTube video, than I only see the loading spinner in fullscreen mode.

Here is my code:

@Override
public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);

  WebView webview = new WebView(this);
  setContentView(webview);

  webview.getSettings().setBuiltInZoomControls(true);
  webview.getSettings().setJavaScriptEnabled(true);
  webview.setWebChromeClient(new WebChromeClient() {

    @Override
    public void onShowCustomView(View view, CustomViewCallback callback) {
      Log.i("fire-tv", "Show custom view");

      super.onShowCustomView(view, callback);
      if (view instanceof FrameLayout) {
        FrameLayout frame = (FrameLayout) view;
        if (frame.getFocusedChild() instanceof VideoView) {
          VideoView video = (VideoView) frame.getFocusedChild();
          frame.removeView(video);
          setContentView(video);
          video.start();
        }
      }
    }

    @Override
    public void onHideCustomView() {
      Log.i("fire-tv", "Hide custom view.");
    }

  });

  webview.setWebViewClient(new WebViewClient() {

    @Override
    public boolean shouldOverrideUrlLoading(WebView view, String url) {
      return false;
    }

  });

  final String mimeType = "text/html";
  final String encoding = "UTF-8";
  String html = getHTML();

  Log.i("fire-tv", "Loading: " + html);
  webview.loadDataWithBaseURL("", html, mimeType, encoding, "");
}

private String getHTML() {
  String html = "<iframe class=\"youtube-player\" style=\"border: 0; width: 100%; height: 100%; padding:0px; margin:0px\" id=\"ytplayer\" type=\"text/html\" src=\"http://www.youtube.com/embed/"
          + "h11u3vtcpaY"
          + "?fs=0\" frameborder=\"0\">\n"
          + "</iframe>\n";

  return html;
}

解决方案

I've written a class to play a youtube video on Fire TV and it also works on the kindle fire as well. As you know, Youtube doesn't have an offical api and we have to resort to using webviews for this. The class I've pasted here has a lot of stuff besides webviews that you might be curious about so I will explain. First of all, you will find that a YouTube playing webview will keep playing when you leave your Activity unless you tell it to stop. So the solution people tell others is to use the onPause and pauseTimers methods to shut up the video. But there is a nasty problem that Amazon has foisted on us and that is the audio and video resources are not released to the rest of the operating system (not a problem with Google Android Lolipop ie Nexus Player). When the resources are held by your app, prime video will not play and amazon will not allow your app on the store. They know darned well we have to use webviews for youtube, so they gave us this little bit of advice:

Q: Can I use an Android WebView and the HTML tag for video playback?
A: Yes, with limitations. Hardware media resources are not currently released by the system when your app pauses or stops. To work around this issue implement your onStop() method to explicitly kill the process for your app:

Amazon source

Like AVGN would say "WHAT WERE THEY THINKING??"

You wouldn't believe how just force killing an app or Activity would lead to tons of problems.. well I'm sure you do, cause you got a few thousand points more than myself.

The only solution I could find is to load a very short 720p HD clip (must have audio!) in the onPause method. I combined it with webView.onPause and .pauseTimers to be sure...

If you use this class please copy my blank.mp4 file to your own server because it might not be there in a month.

Oh but there is more. So you get your YouTube file in your webView... Piece of cake right? Wrong, it doesn't play because in webViews, Html5 usually never auto plays. You cannot set the url to auto play it makes no difference. So my solution was to force a click using java trickery. The way it works is that the webview doesn't load immediately, it takes a variable amount of time for it to fully load. After it does, the video shows a play button icon at the center of the screen. The little remote can't touch it for some reason. But I put in code to force a click in the center of the webview.

Oh and there is one more thing, you must handle audio focus or amazon will not allow your app in the store. Pandora could play in the background unless you handle that.

why Amazon why

package com.ohiovr.modules.youtube;


import android.app.Activity;
import android.content.Context;
import android.content.pm.ActivityInfo;
import android.graphics.Point;
import android.media.AudioManager;
import android.os.Bundle;
import android.os.SystemClock;
import android.util.Log;
import android.view.Display;
import android.view.KeyEvent;
import android.view.MotionEvent;
import android.view.View;
import android.view.WindowManager;
import android.webkit.WebChromeClient;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;

import java.util.Timer;
import java.util.TimerTask;



public class youtubeKindleWebView extends Activity {


    String StringYoutubeUrl;
    WebView webView;

    AFChangeListener hocusFocus;
    private String videoBlanker = "http://ohiovr.com/church_files/blank.mp4";

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_generic_web_view);

        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);

        webView = (WebView) findViewById(R.id.webView);
        WebSettings webSettings = webView.getSettings();
        webSettings.setBuiltInZoomControls(true);
        webSettings.setJavaScriptEnabled(true);
        webSettings.setAppCacheEnabled(false);
        webSettings.setLoadWithOverviewMode(true);
        webSettings.setUseWideViewPort(true);
        //I used this line in an old and now not used live stream implimentation. It works so I didn't remove it. But you may 
        //want to see if it is nessisary:
        webSettings.setUserAgentString("Mozilla/5.0(iPhone;U;CPUiPhoneOS4_0likeMacOSX;en-us)AppleWebKit/532.9(KHTML,likeGecko)Version/4.0.5Mobile/8A293Safari/6531.22.7");


        webView.setWebViewClient(new Callback()); 
        webView.setWebChromeClient(new WebChromeClient());


    }

    class AFChangeListener implements AudioManager.OnAudioFocusChangeListener {
        @Override
        public void onAudioFocusChange(int focusChange) {
            if (focusChange == AudioManager.AUDIOFOCUS_LOSS_TRANSIENT) {
                // mp.pause();
            } else if (focusChange == AudioManager.AUDIOFOCUS_GAIN) {
                //  mp.start();
            } else if (focusChange == AudioManager.AUDIOFOCUS_LOSS) {
                //  mp.stop();
            }
        }
    }

    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        boolean handled = false;

        switch (keyCode) {
            case KeyEvent.KEYCODE_DPAD_CENTER:
                forceAClick();
                break;
            case KeyEvent.KEYCODE_BUTTON_A:
                // ... handle selections
                handled = true;
                break;
            case KeyEvent.KEYCODE_DPAD_LEFT:
                // ... handle left action
                handled = true;
                break;
            case KeyEvent.KEYCODE_DPAD_RIGHT:
                // ... handle right action
                handled = true;
                break;
        }
        return handled || super.onKeyDown(keyCode, event);
    }


    public void forceAClick() {

        Timer timer = new Timer();
        timer.schedule(new TimerTask() {
            @Override
            public void run() {
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        Display display = getWindowManager().getDefaultDisplay();
                        Point size = new Point();
                        display.getSize(size);
                        int width = size.x;
                        int height = size.y;


                        // Obtain MotionEvent object
                        long downTime = SystemClock.uptimeMillis();
                        long eventTime = SystemClock.uptimeMillis() + 100;
                        float x = width / 2;
                        float y = height / 2;
                        // List of meta states found here: developer.android.com/reference/android/view/KeyEvent.html#getMetaState()
                        int metaState = 0;
                        MotionEvent motionEvent = MotionEvent.obtain(
                                downTime,
                                eventTime,
                                MotionEvent.ACTION_DOWN,
                                x,
                                y,
                                metaState
                        );

                        webView.setOnTouchListener(new View.OnTouchListener() {
                            @Override
                            public boolean onTouch(View v, MotionEvent event) {
                                Log.d("on touch", "touched down");
                                return false;
                            }
                        });

                        webView.dispatchTouchEvent(motionEvent);
                    }
                });
            }
        }, 1);

        timer.schedule(new TimerTask() {
            @Override
            public void run() {
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        Display display = getWindowManager().getDefaultDisplay();
                        Point size = new Point();
                        display.getSize(size);
                        int width = size.x;
                        int height = size.y;


                        // Obtain MotionEvent object
                        long downTime = SystemClock.uptimeMillis();
                        long eventTime = SystemClock.uptimeMillis() + 100;
                        float x = width / 2;
                        float y = height / 2;
                        // List of meta states found here: developer.android.com/reference/android/view/KeyEvent.html#getMetaState()
                        int metaState = 0;
                        MotionEvent motionEvent = MotionEvent.obtain(
                                downTime,
                                eventTime,
                                MotionEvent.ACTION_UP,
                                x,
                                y,
                                metaState
                        );

                        webView.setOnTouchListener(new View.OnTouchListener() {
                            @Override
                            public boolean onTouch(View v, MotionEvent event) {
                                Log.d("on touch", "touched up");
                                return false;
                            }
                        });

                        webView.dispatchTouchEvent(motionEvent);


                    }
                });
            }
        }, 120);


        AudioManager am = (AudioManager) this.getSystemService(Context.AUDIO_SERVICE);
// Request audio focus for playback
        hocusFocus = new AFChangeListener();
        int result = am.requestAudioFocus(hocusFocus, AudioManager.STREAM_MUSIC, AudioManager.AUDIOFOCUS_GAIN);
    }


    @Override
    public void onResume() {
        super.onResume();
        webView.onResume();
        webView.resumeTimers();
        StringYoutubeUrl = "https://www.youtube.com/embed/" + getIntent().getStringExtra("youtubeID");
        webView.loadUrl(StringYoutubeUrl);
        getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);

    }


    private class Callback extends WebViewClient {  //this is important for some reason. don't remove!
        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String url) {
            return (false);
        }
    }


    @Override
    protected void onPause() {
        super.onPause();

        webView.loadUrl(videoBlanker);
        webView.pauseTimers();
        webView.onPause();
    }



    /*
    Q: Can I use an Android WebView and the <video> HTML tag for video playback?
    A:
    Yes, with limitations. Hardware media resources are not currently released by the system when your app pauses or stops. To work around this issue implement your onStop() method to explicitly kill the process for your app:

    https://developer.amazon.com/public/solutions/devices/fire-tv/docs/amazon-fire-tv-sdk-frequently-asked-questions
    public void onStop() {
        super.onStop();
        android.os.Process.killProcess(android.os.Process.myPid());
    }
    This issue may also cause instability in the user experience and navigation for your app. The VisualOn SDK is the recommended method for media playback on the device.
    */

    @Override
    protected void onStop() {
        super.onStop();
        // the fascinating part of the next line is that it doesn't kill the application, only this intent
        /////////////  android.os.Process.killProcess(android.os.Process.myPid());
        //no no no! Amazon's advice is bad. It causes a ton of problems.
        //the original problem was that the webview video view frankenhybrid wouldn't release the
        //hardware when the user left the video player.
        //the only and correct solution is to load a very short quiet clip into the webview
        //when the user leaves
        //see onPause for my implementation

    }


}

这篇关于如何在亚马逊消防电视播放YouTube视频中的WebView?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆