web-dev-qa-db-ja.com

Android webview?

Webビューで再生されているYouTubeビデオを停止するにはどうすればよいですか?戻るボタンをクリックしても、ビデオは停止せず、バックグラウンドで継続します。

コード:

webView = (WebView) findViewById(R.id.webview); 
webView.getSettings().setPluginsEnabled(true);
webView.getSettings().setJavaScriptEnabled(true);
webView.getSettings().setBuiltInZoomControls(false); 
webView.getSettings().setSupportZoom(false);
webView.loadData(myUrl,"text/html", "utf-8");
62
Droid

WebViewスレッドが停止しない に関する次の投稿を参照してください

基本的に、独自のアクティビティのonPauseメソッドからWebViewのonPauseメソッドを呼び出す必要があります。

これに関する唯一のトリックは、WebViewのonPauseメソッドが非表示であるため、直接呼び出すことができないことです。したがって、リフレクションを介して間接的に呼び出す必要があります。次のコードを使用すると、独自のアクティビティのonPauseメソッドの設定を開始できます。

@Override
public void onPause() {
    super.onPause();

    try {
        Class.forName("Android.webkit.WebView")
                .getMethod("onPause", (Class[]) null)
                            .invoke(webview, (Object[]) null);

    } catch(ClassNotFoundException cnfe) {
        ...
    } catch(NoSuchMethodException nsme) {
        ...
    } catch(InvocationTargetException ite) {
        ...
    } catch (IllegalAccessException iae) {
        ...
    }
}

上記のtryブロックの変数「webview」はクラスのプライベートインスタンス変数であり、アクティビティのonCreateメソッドで割り当てられていることに注意してください。

88
Andrew Thompson

解決策:1-多くの時間を費やした後、WebView _<iframe>_ HTMLの概念で遊んでいるビデオの一時停止に結論が出ました。

ActivityまたはFragmentでWebViewを使用した場所でonPause()メソッドをオーバーライドして呼び出します。わたしにはできる。

_@Override
public void onPause() {
    super.onPause();
    mWebView.onPause();
}

@Override
public void onResume() {
    super.onResume();
    mWebView.onResume();
}
_

解決策:2-上記の解決策が機能しない場合は、WebViewに存在しないHTMLファイルを強制的にロードさせることができます。

_mWebview.loadUrl("file:///Android_asset/nonexistent.html");
_
68
vishesh chandra

また、onResume()メソッドを実装する必要があります。そうしないと、2回目は機能しません。

@Override
public void onResume()
{
    super.onResume();
    webView.onResume();
}

@Override
public void onPause()
{
    super.onPause();
    webView.onPause();
}
17
CLucera

上記のソリューションは、サムスンギャラクシーSでAndroid 2.3.3で失敗しました。しかし、私は以下の回避策を試して成功しました:

    webview.loadUrl("file:///Android_asset/nonexistent.html");

WebViewに存在しないHTMLファイルを強制的にロードさせています。これは、WebViewを強制的にクリーンアップするようです。

15
dangel

これを試して:

@Override
public void onPause() {
    super.onPause();
    myWebView.onPause();
    myWebView.pauseTimers();
}

@Override
public void onResume() {
    super.onResume();
    myWebView.resumeTimers();
    myWebView.onResume();
}


@Override
protected void onDestroy() {
    myWebView.destroy();
    myWebView = null;
    super.onDestroy();
}
6
Joolah

私の個人的なお気に入りは次のとおりです。

@Override
protected void onPause() {
    super.onPause();
    if (isFinishing()) {
        webView.loadUrl("about:blank");
    } else {
        webView.onPause();
        webView.pauseTimers();
    }
}

@Override
protected void onResume() {
    super.onResume();
    webView.resumeTimers();
    webView.onResume();
}

ビューが一時停止している場合のみWebViewを一時停止しますが、アクティビティが終了するとWebViewをクリアします。

これには少なくともAndroid 3.0-API 11(Honeycomb)

5
Björn Kechel
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
    // TODO Auto-generated method stub
    if(keyCode==event.KEYCODE_BACK)
    {
        mWebview.loadUrl("");
        mWebview.stopLoading();

        finish();

    }
    return super.onKeyDown(keyCode, event);
}

できます

4
user3437083

Webview.loadUrl( "about:blank");

それも働いています

3
Sanghwa Jung

この問題に遭遇した後、onPauseは何もしていないように思われます...私にとっては、バックグラウンドで再生されているものを停止していませんでした。

だから私のコードは次のようになります

@Override
protected void onPause() {
    mWebView.onPause();
    super.onPause();
}

@Override
protected void onResume() {
    mWebView.onResume();
    super.onResume();
}

@Override
protected void onSaveInstanceState(Bundle outState) {
    mWebView.saveState(outState);
    super.onSaveInstanceState(outState);
}

@Override
protected void onDestroy() {
    mWebView.destroy();
    mWebView = null;        
    super.onDestroy();
}

私と同じ問題を抱えている人に役立つことを願っています

3

これを試すことができます

webView.loadUrl("javascript:document.location=document.location");

ロード中のページが編集可能なページである場合、オーディオを停止し、好きなように停止したいときに呼び出すjavascriptメソッドを記述できます。

Javascript関数

 function stopAudio(){
    audios=document.querySelectorAll('audio');
      for(i=0;i<audios.length;i++){
       audios[i].stop();
      }
    }

Andoridからこのメソッドを呼び出します

webView.loadUrl("javascript:stopAudio()");

あなたがページを編集できない場合は、jsコードを挿入できます

   @Override
   public void onPageFinished(WebView view, String url) {
      super.onPageFinished(view, url);

      injectScriptFile(view, "js/script.js"); 

   }

注入方法詳細はこちらを参照

2

これ 私のために働く。

@Override
protected void onPause() {
    super.onPause();
    if (wViewCampaign != null){
        wViewCampaign.stopLoading(); 
        wViewCampaign.loadUrl("");
        wViewCampaign.reload();
        wViewCampaign = null;
    }
}

ActivityのメソッドonPause()を実行すると、WebViewのメソッドonPause()を使用して実行できます。

@override
public void onPause() {
        super.onPause();
        if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB){
          webview.onPause();
        }
}
  • API >= 11Honeycomb
0
Jorgesys

上記のアプローチは私にとってはうまくいきませんでしたが、私にとってはうまくいきました:

@Override
protected void onPause() {
    super.onPause();
    ((AudioManager)getSystemService(
            Context.AUDIO_SERVICE)).requestAudioFocus(
                    new OnAudioFocusChangeListener() {
                        @Override
                        public void onAudioFocusChange(int focusChange) {}
                    }, AudioManager.STREAM_MUSIC, 
                    AudioManager.AUDIOFOCUS_GAIN_TRANSIENT);
}
0
sommesh

上記のすべての答えを試しましたが、それらのほとんどは私のために機能しません。 WebViewで再生するすべてのタイプのメディアで正常に動作する独自のソリューションを作成するだけです

 String lastUrl = "";
 @Override
    public void onPause() {
        super.onPause();
        lastUrl =  webView.getUrl();
        webView.loadUrl("");
    }

    @Override
    protected void onResume() {
        super.onResume();
        webView.loadUrl(lastUrl);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        webView = null;
    }
0
Abhishek Garg

これは、このページで提供されているすべてのコードを試した後に最終的に機能したものです。うわ!

@Override
protected void onPause() {
    super.onPause();
    if (mWebView != null) {
        mWebView.stopLoading();
        mWebView.reload();
    }
}

@Override
protected void onResume() {
    super.onResume();
}
0
Ramesh Seervi

私の状況では、プレーヤーはWebViewが「onPause」になった後も実行を続けます。そのため、ビデオや音楽を再生する前に、WebViewがウィンドウに接続されているかどうかを確認します。

これは、WebViewの「isAttachedToWindow()」がtrue/falseを返すことを確認するためのJavaScriptInterfaceメソッドです。

(そして、Activity/FragmentでonPause/onResumeを呼び出すことを忘れませんでした。)

0
hsu.tw