4

最初に再生される mp4 ファイルであるイントロ ビデオを持つ Android アプリケーションを作成しています。ユーザーは画面をタップしてスキップできます。

Androidエミュレーターでアプリケーションを実行しようとすると、「アクティビティがウィンドウをリークしました..最初に追加された」という例外が発生します。私の何かが終了後にダイアログを開始しようとしている場合、それについての大きな投稿がstackoverflowにあります。おそらく私の場合、プレーヤーは、プレーヤーがビデオ形式をサポートしていないというダイアログを起動しようとしています。

わかりました..だから、ビデオをスキップしたいだけです。エラーや例外をスローすることなく。

これは私の紹介活動です:

package com.tuxin.findasmile;

import android.media.MediaPlayer;
import android.net.Uri;
import android.os.Bundle;
import android.app.Activity;
import android.content.Intent;
//import android.view.Menu; 
import android.view.MotionEvent;
import android.widget.VideoView;

public class IntroActivity extends Activity {

private VideoView video;
private boolean isMenuStarted=false;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_intro);

    video = (VideoView) findViewById(R.id.videoView1);
    video.setOnErrorListener(new MediaPlayer.OnErrorListener() {

        public boolean onError(MediaPlayer mp, int what, int extra) {
            Intent menu = new Intent(IntroActivity.this,MenuActivity.class);
            startActivity(menu);
            finish();
            return false;
        }
    });
    video.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {

        public void onCompletion(MediaPlayer mp) {
            if (!isMenuStarted) { 
                isMenuStarted=true;
            Intent menu = new  Intent(IntroActivity.this,MenuActivity.class);
            startActivity(menu);
            finish();
            }

        }
    });
    Uri videoUri = Uri.parse("android.resource://" + getPackageName() + "/" + R.raw.seaofbuttons);
    video.setVideoURI(videoUri);
    video.start();
}

@Override
public boolean onTouchEvent(MotionEvent event) {
    if (video.isPlaying()) {
        video.stopPlayback();
    }
    if (!isMenuStarted) {
    isMenuStarted=true;
    Intent menu = new Intent(IntroActivity.this,MenuActivity.class);
    startActivity(menu);
    finish();
    }
    return false;

}


}

エミュレータがビデオをサポートしていないことは知っています。しかし、電話がこのビデオ形式をサポートしていないケースをサポートしたい. 例外をスローしたくありません。

04-01 16:32:38.675: E/WindowManager(533): Activity com.tuxin.findasmile.IntroActivity has     leaked window com.android.internal.policy.impl.PhoneWindow$DecorView@4052b9b0 that was originally added here
04-01 16:32:38.675: E/WindowManager(533): android.view.WindowLeaked: Activity com.tuxin.findasmile.IntroActivity has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView@4052b9b0 that was originally added here
04-01 16:32:38.675: E/WindowManager(533):   at android.view.ViewRoot.<init>(ViewRoot.java:258)
04-01 16:32:38.675: E/WindowManager(533):   at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:148)
04-01 16:32:38.675: E/WindowManager(533):   at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:91)
04-01 16:32:38.675: E/WindowManager(533):   at android.view.Window$LocalWindowManager.addView(Window.java:424)
04-01 16:32:38.675: E/WindowManager(533):   at android.app.Dialog.show(Dialog.java:241)
04-01 16:32:38.675: E/WindowManager(533):   at android.app.AlertDialog$Builder.show(AlertDialog.java:802)
04-01 16:32:38.675: E/WindowManager(533):   at android.widget.VideoView$4.onError(VideoView.java:386)
04-01 16:32:38.675: E/WindowManager(533):   at android.media.MediaPlayer$EventHandler.handleMessage(MediaPlayer.java:1341)
04-01 16:32:38.675: E/WindowManager(533):   at android.os.Handler.dispatchMessage(Handler.java:99)
04-01 16:32:38.675: E/WindowManager(533):   at android.os.Looper.loop(Looper.java:123)
04-01 16:32:38.675: E/WindowManager(533):   at android.app.ActivityThread.main(ActivityThread.java:3683)
04-01 16:32:38.675: E/WindowManager(533):   at java.lang.reflect.Method.invokeNative(Native Method)
04-01 16:32:38.675: E/WindowManager(533):   at java.lang.reflect.Method.invoke(Method.java:507)
04-01 16:32:38.675: E/WindowManager(533):   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
04-01 16:32:38.675: E/WindowManager(533):   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
04-01 16:32:38.675: E/WindowManager(533):   at dalvik.system.NativeStart.main(Native Method)
4

1 に答える 1

3

この質問への答えは複雑だと思っていたのと同じくらい。必要なのは、onError 関数で true を返すことだけです。

問題は、ビデオを表示できないというエラー メッセージを含むダイアログを表示しようとしたことです。すでに次のアクティビティに移動しているため、このダイアログがリークされ、この例外が発生したため、表示されませんでした。

onError の戻り値を false から true に変更すると、VideoView の動作がメッセージ付きのダイアログを作成しないように変更されるため、何もリークされません。

Android は videoview ポップアップ メッセージを削除します

于 2013-04-01T13:58:59.347 に答える