2013-04-03 21 views
15

Merhaba Video sitem için bir webview uygulaması hazırladım. Sitenin tasarımı, mobil kullanıcılar için yüklenen bir hibrit. Sadece mobil cihazlarla uyumlu videolar hibrit üzerine yüklenir. Oyuncular Vk, dailymotion, youtube, hızlı zamanı. Videolar sadece 11 ve üstü sdk'lerde çalıyor, ancak tam ekrana geçmek için oynatıcı düğmesine tıkladığımda, sadece videonun tam ekran moduna geçmeden oynatılmasını engelliyor. Birinin bana yardım edebileceği umuduyla olabildiğince fazla kod ekliyorum. Hiçbir ilerleme kaydedilmeden bunu ölümüne yönettim. Herhangi bir yardım büyük takdir edilecektir.Android Webview uygulaması, video oynatıcının tam ekran kullanımına izin vermez

(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) Aşağıdakilerden showCustomView & hideCustomView yöntemini uygulamak gerekir

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

Herhangi biri? Bununla gerçekten takıldım ve şu anda uygulama puanlarımı öldürüyorum. – digiboomz

+0

Bu sorunun cevabını da yapabilirim. Yardım edeceği umudda bir ödül buldum. –

cevap

53

WebChromeClient , ayrıca android:hardwareAccelerated="true" i'ye ihtiyacınız var AndroidManifest Dosya. Örnek projemi buraya gönderiyorum. Yaptığım şey, main.xml öğesinde bir Framelayout (customContainer) ve showCustomView'a alınan görünümü buraya ekleyerek ve onHide'da kaldırarak saklıyor. Ayrıca web sayfasını buna göre gizlemek/göstermek. Kodun altında cihaz üzerinde mükemmel çalışır.

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

Teşekkür ederim, bunu deneyeceğim. – digiboomz

+0

Teşekkür ederim, bu çok yetkili bir cevaptır. Bunu deneyeceğim ve eğer iyiyse - ödül senin. –

+0

Bu örnek projenin kendiminkinden daha iyi çalıştığını söylemeliyim. Kendi projemde bu sürümde çalışmayan 2.3.3 üzerinde çalışan videolarım var. O kısmı nasıl yaptığından bile emin değilsin. – digiboomz

İlgili konular