【问题标题】:Is it possible to play a Youtube video using WebView in Android是否可以在 Android 中使用 WebView 播放 Youtube 视频
【发布时间】:2023-03-17 01:33:01
【问题描述】:

我浏览了许多在 Google 上找到的教程,但没有一个答案真正奏效。我希望视频在 WebView 中播放,而不是通过 YouTube 应用程序播放。任何帮助都是极好的。谢谢。

代码:

 public class Youtube extends Activity {
WebView myWebView;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.website);

    myWebView = (WebView) findViewById(R.id.webView);
    myWebView.loadUrl("http://www.youtube.com");

    WebSettings webSettings = myWebView.getSettings();
    webSettings.setJavaScriptEnabled(true);

    myWebView.addJavascriptInterface(new WebAppInterface(this), "Android");
    myWebView.setWebViewClient(new WebViewClient());
    myWebView.getSettings().setBuiltInZoomControls(true);
    myWebView.getSettings().setSupportZoom(true);
    myWebView.getSettings().setUseWideViewPort(true);
    myWebView.getSettings().setLoadWithOverviewMode(true);

    getActionBar().setDisplayHomeAsUpEnabled(true);
}

public class WebAppInterface {
    Context mContext;

    /** Instantiate the interface and set the context */
    WebAppInterface(Context c) {
        mContext = c;
    }

    /** Show a toast from the web page */
    @JavascriptInterface
    public void showToast(String toast) {
        Toast.makeText(mContext, toast, Toast.LENGTH_SHORT).show();
    }

    private class MyWebViewClient extends WebViewClient {
        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String url) {
            if (Uri.parse(url).getHost()
                    .equals("http://www.youtube.com")) {
                // This is my web site, so do not override; let my WebView
                // load the page
                return false;
            }
            // Otherwise, the link is not for a page on my site, so launch
            // another Activity that handles URLs
            Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
            startActivity(intent);
            return true;
        }

    }
}

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
    // Check if the key event was the Back button and if there's history
    if ((keyCode == KeyEvent.KEYCODE_BACK) && myWebView.canGoBack()) {
        myWebView.goBack();
        return true;
    }
    // If it wasn't the Back key or there's no web page history, bubble up
    // to the default
    // system behavior (probably exit the activity)
    return super.onKeyDown(keyCode, event);

}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
    case android.R.id.home:
        NavUtils.navigateUpFromSameTask(this);

        return true;
    default:
        return super.onOptionsItemSelected(item);

    }
}
 }

【问题讨论】:

  • 必须是 WebView 吗?你见过developers.google.com/youtube/android/player 吗?
  • 是的,但这需要 4.2+ 我需要 ICS+。我也想加载一个频道而不仅仅是一个视频。谢谢你的尝试。 :)
  • 那是 YouTube 的 4.2 版本,而不是 Android。从我链接的页面:通常,运行 Android 2.2 (Froyo) 或更高版本并安装了 Google Play 商店应用程序的设备将在几天内收到更新。因此,您的应用程序可以使用 YouTube Android Player API 并覆盖 Android 生态系统中的大多数设备。

标签: android youtube android-webview


【解决方案1】:

使用新的 YouTube Android 播放器 API - https://developers.google.com/youtube/android/player

API 定义了加载和播放 YouTube 视频(和播放列表)以及自定义和控制视频播放体验的方法。

因此,要与频道一起使用,您将使用常规的 YoutTube API 来获取元数据,并使用 Player API 播放视频/播放列表。

【讨论】:

  • 你能告诉我一个如何做到这一点的例子吗,对不起,仅限初学者。
  • 我从未使用过它,但文档相当广泛。他们甚至有一些示例应用程序应该足以让您上路:developers.google.com/youtube/android/player/…
【解决方案2】:

在布局的 xml 文件中定义 webView 后,请尝试解决此代码:

在 MainActivity 中,获取 WebView 控件的实例,并将嵌入 YouTube 视频的 iFrame 代码转换为字符串。然后启用 Javascript 并使用 WebView 的 loaddata() 将视频 iFrame 字符串加载到 webview 实例。

public class MainActivity extends ActionBarActivity {

    private MyWebChromeClient mWebChromeClient = null;
    private View mCustomView;
    private RelativeLayout mContentView;
    private FrameLayout mCustomViewContainer;
    private WebChromeClient.CustomViewCallback mCustomViewCallback;

    private WebView myWebView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        myWebView = (WebView) findViewById(R.id.webView);
        mWebChromeClient = new MyWebChromeClient();
        myWebView.setWebChromeClient(mWebChromeClient);
        myWebView.setWebViewClient(new WebViewClient(){
            @Override
            public boolean shouldOverrideUrlLoading(WebView view, String url) {
                return false;
            }
        });
        WebSettings webSettings = myWebView.getSettings();
        webSettings.setJavaScriptEnabled(true);
        myWebView.loadUrl("https://www.youtube.com/watch?v=7bDLIV96LD4");
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) {
            return true;
        }

        return super.onOptionsItemSelected(item);
    }
    public class MyWebChromeClient extends WebChromeClient {

        FrameLayout.LayoutParams LayoutParameters = new FrameLayout.LayoutParams(FrameLayout.LayoutParams.MATCH_PARENT, FrameLayout.LayoutParams.MATCH_PARENT);

        @Override
        public void onShowCustomView(View view, CustomViewCallback callback) {
            // if a view already exists then immediately terminate the new one
            if (mCustomView != null) {
                callback.onCustomViewHidden();
                return;
            }
            mContentView = (RelativeLayout) findViewById(R.id.activity_main);
            mContentView.setVisibility(View.GONE);
            mCustomViewContainer = new FrameLayout(MainActivity.this);
            mCustomViewContainer.setLayoutParams(LayoutParameters);
            mCustomViewContainer.setBackgroundResource(android.R.color.black);
            view.setLayoutParams(LayoutParameters);
            mCustomViewContainer.addView(view);
            mCustomView = view;
            mCustomViewCallback = callback;
            mCustomViewContainer.setVisibility(View.VISIBLE);
            setContentView(mCustomViewContainer);
        }

        @Override
        public void onHideCustomView() {
            if (mCustomView == null) {
                return;
            } else {
                // Hide the custom view.
                mCustomView.setVisibility(View.GONE);
                // Remove the custom view from its container.
                mCustomViewContainer.removeView(mCustomView);
                mCustomView = null;
                mCustomViewContainer.setVisibility(View.GONE);
                mCustomViewCallback.onCustomViewHidden();
                // Show the content view.
                mContentView.setVisibility(View.VISIBLE);
                setContentView(mContentView);
            }
        }
    }
    @Override
    public void onBackPressed() {
        if (mCustomViewContainer != null)
            mWebChromeClient.onHideCustomView();
        else if (myWebView.canGoBack())
            myWebView.goBack();
        else
            super.onBackPressed();
    }
}

整个教程可以在这里找到:http://inducesmile.com/android/how-to-play-youtube-video-inside-android-webview-using-video-url/

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-12-14
    • 2017-12-23
    • 2012-09-24
    • 2013-07-13
    • 2014-02-10
    • 1970-01-01
    • 2013-07-20
    • 1970-01-01
    相关资源
    最近更新 更多