2013-04-03 14 views
15

Ciao Ho creato un'app Webview per il mio sito di video. Il design del sito è un ibrido che carica per gli utenti mobili. Solo i video compatibili con i dispositivi mobili vengono caricati sull'ibrido. I giocatori provengono da Vk, dailymotion, youtube, quicktime. I video vengono riprodotti solo su sdk 11 e versioni successive, ma quando faccio clic sul pulsante del lettore per andare a schermo intero, interrompe solo la riproduzione del video senza avviarlo mai in modalità a schermo intero. Sto includendo tutto il codice che posso, nella speranza che qualcuno possa aiutarmi. L'ho interrogato a morte senza alcun progresso. Qualsiasi aiuto sarebbe molto apprezzato.L'app Android Webview non consente al lettore video di andare a schermo intero

(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" /> 
+0

Chiunque? Sono davvero bloccato con questo e sta uccidendo i miei voti delle app al momento. – digiboomz

+0

Potrei anche fare una risposta a questa domanda. Ho iniziato una taglia nella speranza che possa essere d'aiuto. –

risposta

53

È necessario implementare showCustomView & hideCustomView metodo WebChromeClient , inoltre è necessario android:hardwareAccelerated="true" i n il tuo file AndroidManifest. Sto postando il mio progetto di esempio qui. Quello che ho fatto è conservato un Framelayout (customContainer) nel mio main.xml, e aggiungendo la vista ricevuta in showCustomView qui, e rimuovendola in onHide. Anche nascondendo/mostrando di conseguenza la webview. Sotto il codice funziona perfettamente sul dispositivo.

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. 
     } 
    } 

} 

You can clone sample project from here..

+0

Grazie, farò un tentativo. – digiboomz

+0

Grazie anche a te, questa è una risposta molto autorevole. Lo proverò e, se tutto va bene, la taglia è tua. –

+0

Devo dire che questo esempio di progetto funziona meglio del mio. Ho video che funzionano su 2.3.3 che non funzionerebbe su quella versione con il mio progetto. Non sono nemmeno sicuro di come hai fatto quella parte. – digiboomz

Problemi correlati