46

私はWebViewでYouTubeビデオを再生しようとしていますが、WebViewは再生ボタンでビデオの最初の外観を示していますが、再生ボタンをクリックした後、プログレスバーを開始し、2〜3秒後にプログレスバーを停止し、画面が黒色で空白になります。

画像1:再生ボタンを使用したビデオの最初の外観

Image2:再生ボタンをクリックすると画面が空白になります。

お願いします!ビデオが開始されない理由を教えてください。

画像:1これはWebビューの最初の外観です

画像:2 ここに画像の説明を入力してください

これは、ウェブビューでYouTubeVideoを再生するための私のソースコードです。助けてください...

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    WebView wv = (WebView) findViewById(R.id.webView1);
    wv.getSettings().setJavaScriptEnabled(true);
    wv.getSettings().setPluginsEnabled(true);
    final String mimeType = "text/html";
    final String encoding = "UTF-8";
    String html = getHTML();
    wv.loadDataWithBaseURL("", html, mimeType, encoding, "");
}

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

11 に答える 11

72

HTML コンテンツを WebView にロードする前に、これらの行を追加します。

wv.setWebChromeClient(new WebChromeClient() {
});

ドキュメントから:

アプリケーションでインライン HTML5 ビデオをサポートするには、ハードウェア アクセラレーションをオンにして、 WebChromeClient を設定する必要があります。全画面表示をサポートするには、onShowCustomView(View, WebChromeClient.CustomViewCallback) と onHideCustomView() の実装が必要です。getVideoLoadingProgressView() はオプションです。

于 2012-10-05T18:09:13.800 に答える
18

Web コア フレームワークによって開始されるビデオ プレーヤーを表示するには、次のコードが必要です。フロー全体の鍵は、VideoView が WebChromeClient に戻され、そのビューをビュー階層にアタッチする必要があることです。

AOSP の一部として入手できるブラウザのソース コードを確認して組み立てました。

このコードは、明らかではない 4 つのビューを参照しています。ビューの階層は次のとおりです。

  • FrameLayout mContentView(根)
  • WebView mWebView(mContentView の子)
  • FrameLAyout mCustomViewContainer(mContentView の子)
  • View mCustomView(mCustomViewContainer の子)

ビューは、コンテナー アクティビティの設定の一部として構成されます。

<FrameLayout
    android:id="@+id/fullscreen_custom_content"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#FF000000"/>

    <FrameLayout
        android:id="@+id/main_content"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1" >

        <WebView
            android:id="@+id/webView"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent" />
    </FrameLayout>
</FrameLayout>

あなたの活動でonCreate

    mContentView = (FrameLayout) findViewById(R.id.main_content);
    mWebView = (WebView) findViewById(R.id.webView);
    mCustomViewContainer = (FrameLayout) findViewById(R.id.fullscreen_custom_content);

で a を登録WebChromeClientmWebViewます。そのクライアントは、次の 2 ~ 4 つのメソッドをオーバーライドする必要があります。

void onShowCustomView(View view, WebChromeClient.CustomViewCallback callback)
{
    // if a view already exists then immediately terminate the new one
    if (mCustomView != null)
    {
        callback.onCustomViewHidden();
        return;
    }

    // Add the custom view to its container.
    mCustomViewContainer.addView(view, COVER_SCREEN_GRAVITY_CENTER);
    mCustomView = view;
    mCustomViewCallback = callback;

    // hide main browser view
    mContentView.setVisibility(View.GONE);

    // Finally show the custom view container.
    mCustomViewContainer.setVisibility(View.VISIBLE);
    mCustomViewContainer.bringToFront();
}

void onHideCustomView()
{
    if (mCustomView == null)
        return;

    // 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);
}

public Bitmap getDefaultVideoPoster()
{
    if (mDefaultVideoPoster == null)
    {
        mDefaultVideoPoster = BitmapFactory.decodeResource(getResources(), R.drawable.default_video_poster);
    }
    return mDefaultVideoPoster;
}

public View getVideoLoadingProgressView()
{
    if (mVideoProgressView == null)
    {
        LayoutInflater inflater = LayoutInflater.from(this);
        mVideoProgressView = inflater.inflate(R.layout.video_loading_progress, null);
    }
    return mVideoProgressView;
}

次のようなアクティビティ ライフサイクル バインディングを追加することもできます。

@Override
protected void onStop()
{
    super.onStop();
    if (mCustomView != null)
    {
        if (mCustomViewCallback != null)
            mCustomViewCallback.onCustomViewHidden();
        mCustomView = null;
    }
}

@Override
public void onBackPressed()
{
    if (mCustomView != null)
    {
        onHideCustomView();
    } else
    {
        finish();
    }
}

アクティビティが停止されたとき、または戻るボタンが押されたときにビデオを非表示にするアクティビティに。

于 2012-10-12T01:00:29.213 に答える
12

webview.setWebChromeClient(new WebChromeClient());ビデオの追加用にプラグインを追加して有効にするには:

if (Build.VERSION.SDK_INT < 8) {
            webview.getSettings().setPluginsEnabled(true);
        } else {
            webview.getSettings().setPluginState(PluginState.ON);
        }
于 2013-02-07T04:45:58.997 に答える
5

モバイル デバイスでストリーミングされる YouTube 動画に問題があります。Web ビューで URL を直接読み込んで実行しようとすると、ビデオは再生されません。この問題を解決する難しい方法の 1 つは、ビデオ ビューでビデオをストリーミングすることです。私はこれを試していませんが、これは可能です。
YouTube 動画を再生する別の方法として、Web ビュー設定でユーザー エージェントをモバイル デバイスからデスクトップに変更する方法を簡単に説明します。ユーザー エージェントは、YouTube ビデオが実行されるデバイスの種類を示し、それに応じてその種類の Web ページがサーバーによって送信されます。このようにして、YouTube ビデオをストリーミングして再生することができます。これを行う方法は次のとおりです。

public static final int USER_MOBILE  = 0;
public static final int USER_DESKTOP = 1;
wv.getSettings().setUserAgent(USER_DESKTOP);   // 1 is for the desktop
于 2012-10-09T18:43:31.603 に答える
0

なぜあなたはあなたのチューブビデオをウェブビューで再生したいのですか?このインテントを使ってプレイできます

startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(stringUrl)));

それ以外の場合、webViewで再生したい場合は、このリンクをたどってください

http://www.stackoverflow.com/questions/9565533/android-how-to-play-youtube-video-in-webview?rq=1

于 2012-10-10T06:08:27.420 に答える
-3

これを試してください

startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(stringUrl)));
于 2013-01-24T12:48:38.470 に答える