-1

私はAndroidプログラミングの初心者です。アプリに問題があります。このアプリはセンサーを使用し、特定のしきい値に達したときに使用します。別のアクティビティを開き、ビデオを再生します。センサーアクティビティは実際に機能しており、しきい値に達するとビデオを再生します。私の問題は:ビデオが終了するとクラッシュし、logcatが言う

<E / AndroidRuntime(4418):java.lang.RuntimeException:アクティビティを一時停止できません{...}:java.lang.NullPointerException。

アプリがビデオを再生した後、センサーアクティビティであるメインアクティビティに戻るようにします。

あなたが私を助けてくれることを願っています。ありがとう。

以下は私のマニフェストファイルのスニペットです:

<application
    android:allowBackup="true"
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/AppTheme" >
    <activity
        android:name="com.hahndroid.myapp.SensorActivity"
        android:label="@string/app_name" 
        android:configChanges="orientation|screenSize">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    <activity
        android:name="com.hahndroid.myapp.PlayVideoActivity"
        android:label="@string/app_name"
        android:configChanges="orientation|screenSize" >
    </activity>
</application>


以下は、センサーアクティビティである私の最初のアクティビティのスニペットであり、正常に機能します。

パッケージcom.hahndroid.myapp;

...

public class MainActivity extends Activity implements SensorEventListener {

        private SensorManager mySensorManager;

// some variables and computations

    }

private void executeShakeAction() {

    Intent Intent = new Intent(this, PlayVideoActivity.class);
            startActivityForResult(Intent, 0);

         // it plays the Video from raw folder of PlayVideoActivity.class 
}

以下は、PlayVideoActivity.classという名前の2番目のアクティビティのJavaコードです。

パッケージcom.hahndroid.myapp;

..。

public class PlayVideoActivity extends Activity {

    VideoView videoView;
    Intent intent;
    MediaPlayer mp;


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

            mp.stop();
            mp.release();
            mp=null;
        }


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

        mp.stop();
        mp.release();
        mp=null;
    }  

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_play_video);


        VideoView videoView = (VideoView) findViewById(R.id.myvideoview); 
        Uri pathToVideo = Uri.parse("android.resource://com.hahndroid.myapp/" + R.raw.mp4_file`enter code here`);  
        videoView.setVideoURI(pathToVideo);
        videoView.requestFocus(); 
        videoView.start();


        videoView.setOnCompletionListener(new OnCompletionListener() {
            @Override
            public void onCompletion(MediaPlayer mp) {

                Intent intent = new Intent();
                setResult(RESULT_OK, intent);
                finish();

        }
        });

    }

}

以下はLogcatログです。

03-12 16:47:54.809:D / AndroidRuntime(4418):VMをシャットダウンします03-12 16:47:54.809:W / dalvikvm(4418):threadid = 1:スレッドがキャッチされない例外で終了します(group = 0x2b542210)03 -12 16:47:54.819:E / AndroidRuntime(4418):致命的な例外:メイン03-12 16:47:54.819:E / AndroidRuntime(4418):java.lang.RuntimeException:アクティビティを一時停止できません{com.hahndroid。クリーピーガード/com.hahndroid.myapp.PlayVideoActivity}:java.lang.NullPointerException 03-12 16:47:54.819:E / AndroidRuntime(4418):android.app.ActivityThread.performPauseActivity(ActivityThread.java:2726)03-12 16:47:54.819:E / AndroidRuntime(4418):android.app.ActivityThread.performPauseActivity(ActivityThread.java:2682)03-12 16:47:54.819:E / AndroidRuntime(4418):android.app.ActivityThread .handlePauseActivity(ActivityThread.java:2660)

2番目のアクティビティ(PlayVideoActivity)を次のように編集しようとしました:

パッケージcom.hahndroid.myapp;

public class PlayVideoActivity extends Activity {
private MediaPlayer mp;
VideoView videoView;
Intent intent;



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

        mp.stop();
        mp.release();
        mp=null;
    }


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

    mp.stop();
    mp.release();
    mp=null;
}  

@Override
protected void onCreate(Bundle savedInstanceState) {
    requestWindowFeature(Window.FEATURE_NO_TITLE);
    getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_play_video);


    VideoView videoView = (VideoView) findViewById(R.id.myvideoview); 
    Uri pathToVideo = Uri.parse("android.resource://com.hahndroid.myapp/" + R.raw.mp4_file`enter code here`);  
    videoView.setVideoURI(pathToVideo);
    videoView.requestFocus(); 
    videoView.start();


    videoView.setOnCompletionListener(new OnCompletionListener() {
        @Override
        public void onCompletion(MediaPlayer mp) {

            Intent intent = new Intent();
            setResult(RESULT_OK, intent);
            finish();

    }
    });

}

}

しかし、logcatでも同じエラーが発生し、Eclipseはアクティビティの一時停止に問題があります...

そこで、onPause()とonDestroyを削除してみましたが、2番目のアクティビティでビデオを再生した後、1番目のアクティビティ(センサーアクティビティ)に戻りましたが、スタックしているように見えましたが、もう感知しませんでした。 logcatのエラーがなくなりました...しかし、私はそれがまだ間違っていることを知っています...

アプリのアクティビティは4回実行する必要があります(最初のアクティビティは特定のしきい値を検出してからビデオを再生し、ビデオを再生した後、最初のアクティビティに戻って再度検出する必要があります)。

正しいコードを生成するのを手伝ってください。よろしくお願いします。

ハーン

4

1 に答える 1

0

完全なスタック トレースを提供していません。スタック トレースは引き続き根本的な原因を明らかにmponPause()ます。変数に値を割り当てたことがない。( にも参照されていることに注意してくださいonDestroy()。)

(正しく) を指定mpした場合private、Eclipse はこれについて警告します。また、コードをデバッグ モードで実行すると、デバッガーがキャッチされていない例外のある行で停止するため、それが明らかになります。

于 2013-03-12T09:12:57.327 に答える