Bildschirm blinkt bei Verwendung eines Webview mit Flash

Edit: Ich habe eine Demo-Apk gemacht, also kannst du verstehen was ich meine: http://cl.ly/3g0s1p030j243y0p3m2F

Für meine Anwendung möchte ich eine Art "Super Power Point" oder eine Keynote (das kommerzielle Team präsentiert das Produkt an ihre Kunden) mit allen Android-Güte, Gesten, etc. … auf einem Android-Tablet. Als Honeycomb ist noch nicht fertig und weil wir es vor dem Marsch brauchen, wählen wir etwas zufälliges Froyo Tablet (Archos 101), aber mein Problem ist für jedes Tablet / Telefon, das ich versucht habe.

Ich habe eine wirklich tolle Anwendung gemacht, aber für einige Animationen während der Präsentation wollte der Kunde Flash-Animationen verwenden. Weil ich keine Animationen (Art von kleinen Filmen / animierten Grafiken), die leicht in Android und den Mangel an Zeit, das schien eine gute Idee zu sein.

Also, nach einer Suche im Web, habe ich Webview und diesen Code verwendet:

WebView mWebView1 = (WebView) findViewById(R.id.webview1); mWebView1.getSettings().setJavaScriptEnabled(true); mWebView1.getSettings().setPluginsEnabled(true); mWebView1.loadUrl("file:///android_asset/graph_01.swf"); 

Diese Arbeit ziemlich gut, aber auf jedem Gerät habe ich versucht (Archos 101, Nexus One, Nexus S, Galaxy S, Xperia, Desire, HTC Hero und wirklich mehr) jede Aktivität mit einem Webview blinken, ein paar Millisekunden schwarzen Bildschirm, dann Die animation endlich erscheinen

PS: Mein Layout ist auch ganz einfach:

 <?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:id="@+id/webview1" android:layout_height="fill_parent" android:layout_width="fill_parent"></WebView> </LinearLayout> 

Bitte helfen Sie mir, ich kann mir nicht vorstellen, dass ich der einzige bin, der diesem Problem begegnet ist.

Vielen Dank für jede Hilfe. Du hast alle meinen Code und die Demo-Apk.

  • Anzeigen von RTSP-Video-Stream über WebView in Android App
  • Navigieren Sie nicht zu anderen Seiten in WebView, deaktivieren Sie Links und Referenzen
  • Android WebView ignoriert target = "_ blank" beim Hinzufügen von WebViewClient
  • Autosuggestion auf WebView deaktivieren?
  • Was bedeutet "DOM-Speicher-API aktivieren"?
  • Google Webfonts funktioniert nicht mit Web View in Android 4.0 und 4.2.2
  • Viewport passende Bildschirmbreite und große Bilder
  • Android Webview App wird nicht zulassen, Video-Player gehen Vollbildschirm
  • One Solution collect form web for “Bildschirm blinkt bei Verwendung eines Webview mit Flash”

    DIESE ANTWORT HINZUFÜGEN:

    Also das Problem ist, dass Adobe Flash Player erstellt eine SurfaceView in der WebView und es gibt eine Verzögerung zwischen der SurfaceView erscheinen und die Flash-Engine stört, etwas zu zeichnen. In dieser kleinen Lücke erscheint die SurfaceView total schwarz.

    Die Lösung, die ich gefunden habe, besteht darin, WebView zu subclassieren und dem View Tree eine benutzerdefinierte SurfaceView hinzuzufügen. Zweitens ist es auch wichtig, den ersten Draw () Aufruf der Adobe-Ansicht zu unterdrücken. Der Code für meine subclassed WebView ist wie folgt:

     import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.util.AttributeSet; import android.view.SurfaceHolder; import android.view.SurfaceView; import android.view.View; import android.webkit.WebView; import android.widget.AbsoluteLayout; public class FixAdobeWebView extends WebView { View whiteView; private boolean eatenFirstFlashDraw; public FixAdobeWebView(Context context, AttributeSet attrs) { super(context, attrs); whiteView = new WhiteSurfaceView(context); whiteView.setLayoutParams(new AbsoluteLayout.LayoutParams(800, 480, 0, 0)); addView(whiteView); } private class WhiteSurfaceView extends SurfaceView implements SurfaceHolder.Callback { public WhiteSurfaceView(Context context) { super(context); getHolder().addCallback(this); } @Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { Canvas canvas = holder.lockCanvas(); if (canvas != null) { canvas.drawColor(Color.WHITE); holder.unlockCanvasAndPost(canvas); } } @Override public void surfaceCreated(SurfaceHolder holder) { } @Override public void surfaceDestroyed(SurfaceHolder holder) { } } // // Override drawChild to eat the first draw of the FlashPaintSurface // @Override protected boolean drawChild (Canvas canvas, View child, long drawingTime) { if (!eatenFirstFlashDraw && child.getClass().getName().equals("com.adobe.flashplayer.FlashPaintSurface")) { eatenFirstFlashDraw = true; return true; } return super.drawChild(canvas, child, drawingTime); } } 

    Das Layout XML sollte eine Instanz dieser Klasse deklarieren, dh:

     <?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" android:background="@android:color/white" > <org.test.FixAdobeWebView android:id="@+id/webview1" android:layout_height="fill_parent" android:layout_width="fill_parent" /> </LinearLayout> 

    Auf meinem Nexus One läuft CM6.1 das funktioniert einwandfrei, dass das WebView als solide weiß erscheint, bis die Flash SurfaceView beginnt zu zeichnen. Du musst es wohl ein bisschen anpassen, zB die Hardcoded 800×480 Dimensionen loswerden und auch die weiße SurfaceView zerstören, sobald es nicht mehr benötigt wird.

    ORIGINAL (FALSCH) ANTWORT:

    Sieht aus wie Adobe sind dafür verantwortlich.

    Der am wenigsten schreckliche Umgang, den ich bisher gefunden habe, ist:

    1. Machen Sie den Hintergrund des WebViews Elternteil eine kompatible Farbe (dh weiß).
    2. Verstecke die WebView zunächst.
    3. Warten Sie, bis Sie das seitlich geladene Ereignis erhalten, und schalten Sie dann eine Warteschlange ein, um das WebView nach einer Verzögerung von einer Sekunde anzuzeigen.

    Es bedeutet, dass du eine Garantie für eine Sekunde bekommst, bevor du etwas sehen kannst, aber es ist weniger scherzhaft als das schreckliche schwarze Blitz afaik.

    Layout:

     <?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" android:background="@android:color/white" > <WebView android:id="@+id/webview1" android:layout_height="fill_parent" android:layout_width="fill_parent" android:visibility="invisible" /> </LinearLayout> 

    Code:

      final Handler handler = new Handler(); ... final WebView mWebView1 = (WebView) findViewById(R.id.webview1); mWebView1.getSettings().setJavaScriptEnabled(true); mWebView1.getSettings().setPluginsEnabled(true); mWebView1.setWebViewClient(new WebViewClient() { @Override public void onPageFinished(WebView view, String url) { handler.postDelayed(new Runnable() { @Override public void run() { mWebView1.setVisibility(View.VISIBLE); } }, 1000); } }); mWebView1.loadUrl("file:///android_asset/graph_01.swf"); 

    Es könnte ein besserer Weg sein, obwohl das die Notwendigkeit für eine feste Verzögerung …

    Es ist schon eine Weile her, seit ich irgendetwas mit Flash gemacht habe, aber ich scheine mich daran zu erinnern, dass es einen Weg für das Flash-Steuerelement gibt, um die Javascript-Engine des Browsers zu benutzen (eine schnelle Google macht die Flex Ajax Bridge, die wahrscheinlich erscheint).

    Was Sie tun können, ist, mit der oben genannten Brücke, verwenden Sie ActionScript, um eine Javascript-Funktion aufzurufen, die eine Warnung () ausführt. In deinem Java-Code würdest du deinen mWebView1 bis zu einem WebChromeClient der onJsAlert() implementiert. In dieser Funktion würdest du das WebView sichtbar machen.

    Das Android ist ein Google Android Fan-Website, Alles ├╝ber Android Phones, Android Wear, Android Dev und Android Spiele Apps und so weiter.