我是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中的错误消失了......但我知道它仍然是错误的......
我的应用程序活动应该反向运行(第一个活动应该检测到某个阈值然后播放视频然后播放视频后,它应该返回到第一个活动并再次感知)。
请帮我生成正确的代码。再次感谢。
哈恩
答案 0 :(得分:0)
您没有提供完整的堆栈跟踪。堆栈跟踪继续揭示根本原因,mp
中onPause()
为空;你从未为变量赋值。 (请注意,它也在onDestroy()
中引用。)
如果您(正确地)指定mp
为private
,Eclipse会向您发出警告。如果您在调试模式下运行代码,也会向您显示,因为调试器会因未捕获的异常而停止运行。