Come faccio a mettere in pausa il contenuto flash in un webview Android quando la mia attività non è visibile?

StackOverflow https://stackoverflow.com/questions/3431351

Domanda

Sto sperimentando l'utilizzo di un webview per visualizzare il contenuto flash all'interno della mia attività. Tutto funziona abbastanza bene, ma quando l'utente colpisce la chiave di casa per mettere l'attività in background, il contenuto flash continua a funzionare (il suono continua a suonare, ecc.)

Ho notato che sia il browser Android di serie che il browser delfino sembrano evitare questo problema e mettere in pausa correttamente il contenuto del flash quando l'attività di navigazione viene messa in background.

Idealmente, vorrei una soluzione che uccide completamente il webview se l'attività sta finendo, ma la fa una pausa altrimenti (sostanzialmente copia il comportamento predefinito del browser)

Ecco un semplice test che ho messo insieme che carica un gioco su Kongregate che ha un po 'di musica di sottofondo:

    public class BrowserTest extends Activity {
    private WebView mWebView;

        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);

            mWebView = new WebView(this);
            mWebView.getSettings().setJavaScriptEnabled(true);
            mWebView.getSettings().setPluginsEnabled(true);

            mWebView.loadUrl("http://m.kongregate.com/games/Jiggmin/the-game-of-disorientation-mobile");
            setContentView(mWebView);
        }

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

            mWebView.pauseTimers();
            if(isFinishing()){
                mWebView.loadUrl("about:blank");
                setContentView(new FrameLayout(this));
            }
        }

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

Ho dato un'occhiata all'ultima fonte per il browser azionario e sembra fare qualcosa di simile (chiamare pausetimers/resumetimers), anche se temo che il codice che ho guardato è obsoleto, perché sta chiamando funzioni che Don non Sembra più esistere.

Ho verificato che la chiamata a Pausetimers stia funzionando testando con un semplice setInterval JavaScript che aggiorna un contatore. C'è qualcos'altro ovvio che dovrei provare in merito alla gestione della finestra o della vista?

La documentazione per Mobile Flash Player dice:

Flash Player metterà in pausa anche la riproduzione SWF non è in vista o l'applicazione in primo piano, ad esempio quando viene ricevuta una chiamata o l'allarme, per ridurre l'utilizzo della CPU, l'utilizzo della batteria e l'utilizzo della memoria.

Questo sembra funzionare perfettamente sia nel browser azionario che nel browser delfino, ma non nella mia app. Qualsiasi idea/soluzioni sarebbe molto apprezzata!

Aggiornare: Ecco la funzione che abbiamo finito per aggiungere alla nostra attività per farlo funzionare. Lo chiamiamo con "OnPause" nella funzione OnPause dell'attività e "OnResume" nella funzione OnResume dell'attività:

private void callHiddenWebViewMethod(String name){
    if( mWebView != null ){
        try {
            Method method = WebView.class.getMethod(name);
            method.invoke(mWebView);
        } catch (NoSuchMethodException e) {
            Log.error("No such method: " + name, e);
        } catch (IllegalAccessException e) {
            Log.error("Illegal Access: " + name, e);
        } catch (InvocationTargetException e) {
            Log.error("Invocation Target Exception: " + name, e);
        }
    }
}
È stato utile?

Soluzione

Non vedo dove lo vedi BrowserActivity o qualcosa sta chiamando pauseTimers(). Vedo dove onPause() per BrowserActivity Alla fine percorsi verso onPause() di WebView. Tuttavia, onPause() di WebView ha il @hide L'annotazione e così non fanno parte dell'SDK. Fuori dal bracciale, sembrerebbe che OnPause () sia quello che vuoi, dato il commento:

Chiama questo per mettere in pausa qualsiasi elaborazione aggiuntiva associata a questa vista e il suo DOM/plugins/javascript/ecc. Ad esempio, se la vista viene messa fuori dallo schermo, questo potrebbe essere chiamato per ridurre il traffico di CPU e/o di rete inutili. Quando la vista è di nuovo "attiva", chiama onResume ().

Nota il riferimento a "plugin", che non è menzionato nel pauseTimers() documentazione.

Proverei a usare la riflessione per vedere se onPause() (e più tardi onResume(), quando vuoi che le cose si riavviano) fa ciò di cui hai bisogno. In tal caso, pubblica un problema a b.android.com A proposito, chiedendo loro di aggiungere questi metodi (o equivalenti) all'SDK. Il tuo requisito sembra che sarà comune e una soluzione che passa oltre l'SDK non è una buona soluzione.

Altri suggerimenti

@Override
protected void onPause() {
    super.onPause();
    this.callHiddenWebViewMethod("onPause");
}

@Override
protected void onResume() {
    super.onResume();
    this.callHiddenWebViewMethod("onResume");
}

È così che lo chiami nella tua attività ... funziona come un fascino.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top