我知道周围有类似的问题,但所有答案都是针对这些应用程序的。我得到一个nullpointerexception但无法理解这个问题。这是一个非常长的活动课程,所以我无法分享。对不起,如果这不是一个明确的问题,但我需要的是一些提示或想法,我怎样才能找到这个例外的原因。的 logcat的:
12-25 10:54:31.845: E/MediaPlayer(14465): error (1, -2147483648)
12-25 10:54:31.865: E/AndroidRuntime(14465): FATAL EXCEPTION: main
12-25 10:54:31.865: E/AndroidRuntime(14465): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.sametenekeci.vmail/com.st.vmail.MainActivity}: java.lang.NullPointerException
12-25 10:54:31.865: E/AndroidRuntime(14465): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2079)
12-25 10:54:31.865: E/AndroidRuntime(14465): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2104)
12-25 10:54:31.865: E/AndroidRuntime(14465): at android.app.ActivityThread.access$600(ActivityThread.java:132)
12-25 10:54:31.865: E/AndroidRuntime(14465): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1157)
12-25 10:54:31.865: E/AndroidRuntime(14465): at android.os.Handler.dispatchMessage(Handler.java:99)
12-25 10:54:31.865: E/AndroidRuntime(14465): at android.os.Looper.loop(Looper.java:137)
12-25 10:54:31.865: E/AndroidRuntime(14465): at android.app.ActivityThread.main(ActivityThread.java:4575)
12-25 10:54:31.865: E/AndroidRuntime(14465): at java.lang.reflect.Method.invokeNative(Native Method)
12-25 10:54:31.865: E/AndroidRuntime(14465): at java.lang.reflect.Method.invoke(Method.java:511)
12-25 10:54:31.865: E/AndroidRuntime(14465): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:789)
12-25 10:54:31.865: E/AndroidRuntime(14465): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:556)
12-25 10:54:31.865: E/AndroidRuntime(14465): at dalvik.system.NativeStart.main(Native Method)
12-25 10:54:31.865: E/AndroidRuntime(14465): Caused by: java.lang.NullPointerException
12-25 10:54:31.865: E/AndroidRuntime(14465): at com.sametenekeci.vmail.MainActivity.onCreate(MainActivity.java:90)
12-25 10:54:31.865: E/AndroidRuntime(14465): at android.app.Activity.performCreate(Activity.java:4465)
12-25 10:54:31.865: E/AndroidRuntime(14465): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049)
12-25 10:54:31.865: E/AndroidRuntime(14465): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2033)
12-25 10:54:31.865: E/AndroidRuntime(14465): ... 11 more
感谢您的帮助。
答案 0 :(得分:2)
改变它:
mp.setOnCompletionListener(new OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
// TODO Auto-generated method stub
// Rest of Code
}
});
答案 1 :(得分:2)
您的行号90
会导致nullpointer异常,
line number 90: mp.setOnCompletionListener(new OnCompletionListener() {
和nullPointerException
的原因是,你还没有初始化媒体播放器第一:
//首先初始化它
MediaPlayer mp= new MediaPlayer();
然后 按照你的意愿使用它,就像这样:
mp= new MediaPlayer();
mp = MediaPlayer.create(this, R.raw.entermail);
mp.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
答案 2 :(得分:2)
MediaPlayer是一个状态机 - 如果你以错误的顺序调用它的'方法,你会遇到问题。初始化玩家还有两种方法:
使用create()方法 - 在我们的例子中:
mp = MediaPlayer.create(this, R.raw.entermail);
此行将使用作为参数传递的资源声音初始化您的播放器。如果成功,则已经调用prepare(),不得再次调用。
你在这一行收到错误:
mp.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
表示mp为null。在设置listener:
之前检查create()的结果if (mp != null) {
mp.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
// rest of the code
}
else {
Log.d("AUDIO", "MediaPlayer.create() failed. mp is null");
// deal with it accordingly
}
在您的情况下,请检查您在create()中使用的文件,并确保(form the Docs):
在这种情况下,“原始”资源是系统不会尝试以任何特定方式解析的文件。但是,此资源的内容不应该是原始音频。它应该是一种支持格式的正确编码和格式化的媒体文件。
您可以使用构造函数创建MediaPlayer对象:
mp = new MediaPlayer();
然后记得设置数据源并准备:
mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
mediaPlayer.setDataSource(getApplicationContext(), myUri);
mediaPlayer.prepare();
//when ready
mediaPlayer.start();
请记住在setDataSource上捕获异常。还记得在完成后调用MediaPlayer对象上的release()。
顺便说一下,在设置了监听器后,调用setAppState(),然后调用:
mp.reset();
mp.setDataSource();
mp.prepare();
mp.start();
所以你不妨用第二种方法初始化你的播放器,并设置OnErrorListener以检查是否有任何错误。
The guide还建议在单独的线程上调用任何长操作(例如prepare()),以阻止UI线程。请仔细阅读指南,了解状态,它将帮助您了解正在发生的事情。
答案 3 :(得分:1)
我知道为什么(也许:)) 在方法 setAppState()中,你在try catch块中调用 mp.prepare(),然后你在外面调用 mp.start()抓住。 mp.prepare()可能会导致异常。
在try catch块中调用 mp.start(); 以确保mp已成功准备。
try {
mp.prepare();
mp.start();
} catch (IllegalStateException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
答案 4 :(得分:1)
您好,您可以通过添加<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> in your manifest