-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 的第二个活动的 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。 Creepyguard/com.hahndroid.myapp.PlayVideoActivity}: java.lang.NullPointerException 03-12 16:47:54.819: E/AndroidRuntime(4418): at 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)

我试图像这样编辑我的第二个活动(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,发生的事情是:在第二个活动上播放视频后,它返回到第一个活动(传感器活动)但看起来它卡住了,它不再有感觉了,但是, logcat 中的错误消失了……但我知道它仍然是错误的……

我的应用程序活动应该来回运行(第一个活动应该感应到某个阈值然后播放视频,然后在播放视频后,它应该回到第一个活动并再次感应)。

请帮我生成正确的代码。再次提前感谢。

哈恩

4

1 回答 1

0

您没有提供完整的堆栈跟踪。堆栈跟踪继续揭示根本原因,即mpnull in onPause(); 您从未为变量赋值。(请注意,它也在 中引用onDestroy()。)

如果您(正确地)指定mpprivate,Eclipse 会警告您这一点。如果您在调试模式下运行代码,它也会向您显示,因为调试器将停止在未捕获异常的行上。

于 2013-03-12T09:12:57.327 回答