我只是 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 中的错误消失了……但我知道它仍然是错误的……
我的应用程序活动应该来回运行(第一个活动应该感应到某个阈值然后播放视频,然后在播放视频后,它应该回到第一个活动并再次感应)。
请帮我生成正确的代码。再次提前感谢。
哈恩