2013-04-03 3 views
15

Привет, я создал приложение для веб-просмотра для своего видеосайта. Дизайн сайта - это гибрид, который загружается для мобильных пользователей. На гибрид загружаются только видео, совместимые с мобильными устройствами. Игроки из Vk, dailymotion, youtube, quicktime. Видео воспроизводятся только на sdk 11 и выше, но когда я нажимаю кнопку плеера, чтобы перейти в полноэкранный режим, он останавливает воспроизведение видео, не запуская его в полноэкранном режиме. Я ввожу столько же кода, сколько могу, надеюсь, кто-то может мне помочь. Я искал это до смерти, не достигнув прогресса. Любая помощь будет принята с благодарностью.Приложение Android Webview не позволит проигрывателю проигрывать весь экран

(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

Кто-нибудь? Я действительно застрял в этом, и на данный момент он убивает мои рейтинги приложений. – digiboomz

+0

Я тоже мог бы ответить на этот вопрос. Я начал щедрость в надежде, что это поможет. –

ответ

53

Вы должны реализовать showCustomView & hideCustomView метод WebChromeClient , также вам нужно android:hardwareAccelerated="true" i n ваш файл AndroidManifest. Я размещаю здесь свой пример проекта. В моем main.xml сохранен один Framelayout (customContainer) и добавлен вид, полученный в showCustomView, и удаляем его в onHide. Также скрывает/показывает веб-просмотр соответственно. Ниже код отлично работает на устройстве.

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

Спасибо, я попробую. – digiboomz

+0

Благодарю вас, это очень авторитетный ответ. Я попробую, и если все будет хорошо - щедрость твоя. –

+0

Я должен сказать, что этот примерный проект работает лучше, чем мой собственный. У меня есть видео, работающие над версией 2.3.3, которые не будут работать в этой версии с моим собственным проектом. Даже не уверен, как вы это сделали. – digiboomz

Смежные вопросы