web-dev-qa-db-fra.com

Android L'application Webview ne laisse pas le lecteur vidéo passer en plein écran

Salut, j'ai créé une application WebView pour mon site vidéo. La conception du site est un hybride qui se charge pour les utilisateurs mobiles. Seules les vidéos compatibles avec les appareils mobiles sont chargées sur l'hybride. Les joueurs sont issus de Vk, DailyMotion, YouTube et QuickTime.

Les vidéos ne sont lues que sur le SDK 11 et supérieur, mais lorsque je clique sur le bouton du lecteur pour passer en plein écran, cela arrête uniquement la lecture de la vidéo sans jamais se lancer en mode plein écran.

(Webviewactivity.Java)

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    getWindow().requestFeature(Window.FEATURE_PROGRESS);
    setContentView(R.layout.main);

    parentView = (RelativeLayout) findViewById(R.id.parent_rl);

    webviewProgress = (ProgressBar) findViewById(R.id.webview_progress);

    webview = (WebView) findViewById(R.id.webview);
    webview.getSettings().setJavaScriptEnabled(true);
    webview.getSettings().setBuiltInZoomControls(true);
    webview.getSettings().setAllowFileAccess(true);
    webview.setWebViewClient(new MyWebViewClient());
    webview.getSettings().setPluginState(WebSettings.PluginState.ON);
    webview.loadUrl(URL);
    webviewProgress.setProgress(0);

    webview.setWebChromeClient(new MyWebChromeClient());
    webview.setDownloadListener(new DownloadListener() {
        public void onDownloadStart(String url, String userAgent,
                String contentDisposition, String mimetype,
                long contentLength) {
            mProgressDialog = new ProgressDialog(WebViewActivity.this);
            mProgressDialog.setMessage("Downloading...");
            mProgressDialog.setIndeterminate(false);
            mProgressDialog.setMax(100);
            mProgressDialog
                    .setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
            DownloadFile downloadFile = new DownloadFile();
            downloadFile.execute(url);
        }
    });

    initSlider();

    initAdmob();
}

/**
 * When when file was chosen
 */
@Override
protected void onActivityResult(int requestCode, int resultCode,
        Intent intent) {
    if (requestCode == FILECHOOSER_RESULTCODE) {
        if (null == mUploadMessage)
            return;
        Uri result = intent == null || resultCode != RESULT_OK ? null
                : intent.getData();
        mUploadMessage.onReceiveValue(result);
        mUploadMessage = null;

(Main.xml)

Android:id="@+id/parent_rl"
Android:layout_width="fill_parent"
Android:layout_height="fill_parent"
Android:keepScreenOn="true" >

<ProgressBar
    Android:id="@+id/webview_progress"
    style="?android:attr/progressBarStyleHorizontal"
    Android:layout_width="fill_parent"
    Android:layout_height="wrap_content"
    Android:layout_alignParentTop="true"
    Android:maxHeight="5dip"
    Android:minHeight="5dip"
    Android:progressDrawable="@drawable/blueprogress" />

<FrameLayout
    Android:id="@+id/framelayout"
    Android:layout_width="fill_parent"
    Android:layout_height="wrap_content"
    Android:layout_below="@id/webview_progress"
    Android:orientation="vertical" >

    <WebView
        xmlns:Android="http://schemas.Android.com/apk/res/Android"
        Android:id="@+id/webview"
        Android:layout_width="fill_parent"
        Android:layout_height="fill_parent" />

(Manifest.xml)

package="com.wCHfree"
Android:versionCode="7"
Android:versionName="1.1" >

<uses-sdk
    Android:minSdkVersion="11"
    Android:targetSdkVersion="17" />

<uses-permission Android:name="Android.permission.ACCESS_NETWORK_STATE" />
<uses-permission Android:name="Android.permission.INTERNET" />

<application
    Android:icon="@drawable/ic_launcher_red"
    Android:label="@string/app_name"
    Android:theme="@Android:style/Theme.Black" >
    <activity
        Android:name="com.webview.splashScreen.SplashScreenActivity"
        Android:label="@string/app_name"
        Android:theme="@Android:style/Theme.NoTitleBar.Fullscreen" >
        <intent-filter>
            <action Android:name="Android.intent.action.MAIN" />

            <category Android:name="Android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    <activity
        Android:name="com.webview.splashScreen.WebViewActivity"
        Android:configChanges="orientation|screenSize|screenLayout"
        Android:label="@string/app_name"
        Android:theme="@Android:style/Theme.NoTitleBar.Fullscreen" >
    </activity>
    <activity
        Android:name="com.google.ads.AdActivity"
        Android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|uiMode|screenSize|smallestScreenSize" />
20
digiboomz

Vous devez implémenter la méthode showCustomView & hideCustomView de WebChromeClient, vous devez également Android:hardwareAccelerated="true" dans votre fichier AndroidManifest. Je poste mon exemple de projet ici. Ce que j'ai fait, c'est garder un Framelayout (customContainer) dans mon main.xml, et ajouter la vue reçue dans showCustomView ici, et la supprimer dans onHide. Masquer/afficher également la vue Web en conséquence. Le code ci-dessous fonctionne parfaitement sur l'appareil.

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:Android="http://schemas.Android.com/apk/res/Android"
          package="com.example.webview"
          Android:versionCode="1"
          Android:versionName="1.0">
    <uses-sdk Android:minSdkVersion="8"/>
    <uses-permission Android:name="Android.permission.INTERNET"/>
    <application Android:label="@string/app_name" Android:icon="@drawable/ic_launcher"
            Android:hardwareAccelerated="true">
        <activity Android:name="MyActivity"
                  Android:configChanges="orientation|keyboardHidden"
                  Android:hardwareAccelerated="true"
                  Android:label="@string/app_name">
            <intent-filter>
                <action Android:name="Android.intent.action.MAIN"/>
                <category Android:name="Android.intent.category.LAUNCHER"/>
            </intent-filter>
        </activity>
    </application>
</manifest>

main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
              Android:orientation="vertical"
              Android:layout_width="fill_parent"
              Android:layout_height="fill_parent"
        >
    <WebView
            Android:layout_width="fill_parent"
            Android:layout_height="fill_parent"
            Android:id="@+id/webView"
            Android:layout_gravity="center"
            />
    <FrameLayout
            Android:id="@+id/customViewContainer"
            Android:layout_width="fill_parent"
            Android:layout_height="fill_parent"
            Android:visibility="gone"
            />
</LinearLayout>

video_progress.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
              Android:id="@+id/progress_indicator"
              Android:orientation="vertical"
              Android:layout_centerInParent="true"
              Android:layout_width="fill_parent"
              Android:layout_height="fill_parent">

    <ProgressBar Android:id="@Android:id/progress"
                 style="?android:attr/progressBarStyleLarge"
                 Android:layout_gravity="center"
                 Android:layout_width="wrap_content"
                 Android:layout_height="wrap_content"/>

    <TextView Android:paddingTop="5dip"
              Android:layout_width="wrap_content"
              Android:layout_height="wrap_content"
              Android:layout_gravity="center"
              Android:text="loading"
              Android:textSize="14sp"
              Android:textColor="?android:attr/textColorPrimary"/>
</LinearLayout>

MyActivity.Java

package com.example.webview;

import Android.app.Activity;
import Android.graphics.Bitmap;
import Android.os.Bundle;
import Android.view.KeyEvent;
import Android.view.LayoutInflater;
import Android.view.View;
import Android.webkit.WebChromeClient;
import Android.webkit.WebView;
import Android.webkit.WebViewClient;
import Android.widget.FrameLayout;

public class MyActivity extends Activity {
    private WebView webView;
    private FrameLayout customViewContainer;
    private WebChromeClient.CustomViewCallback customViewCallback;
    private View mCustomView;
    private myWebChromeClient mWebChromeClient;
    private myWebViewClient mWebViewClient;

    /**
     * Called when the activity is first created.
     */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        customViewContainer = (FrameLayout) findViewById(R.id.customViewContainer);
        webView = (WebView) findViewById(R.id.webView);

        mWebViewClient = new myWebViewClient();
        webView.setWebViewClient(mWebViewClient);

        mWebChromeClient = new myWebChromeClient();
        webView.setWebChromeClient(mWebChromeClient);
        webView.getSettings().setJavaScriptEnabled(true);
        webView.getSettings().setAppCacheEnabled(true);
        webView.getSettings().setBuiltInZoomControls(true);
        webView.getSettings().setSaveFormData(true);
        webView.loadUrl("http://m.youtube.com");
    }

    public boolean inCustomView() {
        return (mCustomView != null);
    }

    public void hideCustomView() {
        mWebChromeClient.onHideCustomView();
    }

    @Override
    protected void onPause() {
        super.onPause();    //To change body of overridden methods use File | Settings | File Templates.
        webView.onPause();
    }

    @Override
    protected void onResume() {
        super.onResume();    //To change body of overridden methods use File | Settings | File Templates.
        webView.onResume();
    }

    @Override
    protected void onStop() {
        super.onStop();    //To change body of overridden methods use File | Settings | File Templates.
        if (inCustomView()) {
            hideCustomView();
        }
    }

    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if (keyCode == KeyEvent.KEYCODE_BACK) {

            if (inCustomView()) {
                hideCustomView();
                return true;
            }

            if ((mCustomView == null) && webView.canGoBack()) {
                webView.goBack();
                return true;
            }
        }
        return super.onKeyDown(keyCode, event);
    }

    class myWebChromeClient extends WebChromeClient {
        private Bitmap mDefaultVideoPoster;
        private View mVideoProgressView;

        @Override
        public void onShowCustomView(View view, int requestedOrientation, CustomViewCallback callback) {
           onShowCustomView(view, callback);    //To change body of overridden methods use File | Settings | File Templates.
        }

        @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;
            }
            mCustomView = view;
            webView.setVisibility(View.GONE);
            customViewContainer.setVisibility(View.VISIBLE);
            customViewContainer.addView(view);
            customViewCallback = callback;
        }

        @Override
        public View getVideoLoadingProgressView() {

            if (mVideoProgressView == null) {
                LayoutInflater inflater = LayoutInflater.from(MyActivity.this);
                mVideoProgressView = inflater.inflate(R.layout.video_progress, null);
            }
            return mVideoProgressView;
        }

        @Override
        public void onHideCustomView() {
            super.onHideCustomView();    //To change body of overridden methods use File | Settings | File Templates.
            if (mCustomView == null)
                return;

            webView.setVisibility(View.VISIBLE);
            customViewContainer.setVisibility(View.GONE);

            // Hide the custom view.
            mCustomView.setVisibility(View.GONE);

            // Remove the custom view from its container.
            customViewContainer.removeView(mCustomView);
            customViewCallback.onCustomViewHidden();

            mCustomView = null;
        }
    }

    class myWebViewClient extends WebViewClient {
        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String url) {
            return super.shouldOverrideUrlLoading(view, url);    //To change body of overridden methods use File | Settings | File Templates.
        }
    }

}

Vous pouvez cloner un exemple de projet à partir d'ici ..

59
Akhil