播放视频后无法返回上一个(传感器)活动

时间:2013-03-12 08:51:47

标签: android video media-player

我是Android编程的新手。我的应用程序遇到了问题。这个应用程序使用传感器,当它达到一定的阈值。它将打开另一个活动并播放视频。传感器活动实际上正在工作,它会在达到阈值时播放视频。我的问题是:当视频结束时,它会崩溃并且logcat会说

  

< E / AndroidRuntime(4418):java.lang.RuntimeException:无法暂停   activity {...}: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:线程退出   未捕获的异常(组= 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):at   android.app.ActivityThread.performPauseActivity(ActivityThread.java:2682)   03-12 16:47:54.819:E / AndroidRuntime(4418):at   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中的错误消失了......但我知道它仍然是错误的......

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

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

哈恩

1 个答案:

答案 0 :(得分:0)

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

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