【发布时间】:2015-02-07 17:19:31
【问题描述】:
我正在尝试创建一个 MediaPlayer 应用程序。为了实现同样的功能,我创建了一个在 MediaPlayer 中播放 mp3 文件的服务。 打开 mp3 文件时出现 NullPointerException。
实例化媒体播放器的代码在onStartCommand()中,如下所示:
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
mediaPlayer = new MediaPlayer();
return super.onStartCommand(intent, flags, startId);
}
服务中实现的处理程序在 MediaPlayer 上设置数据源并准备播放歌曲,如下所示:
class MyHandler extends Handler {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case Constants.INT_PLAY_SONG:
try {
mediaPlayer.reset();
mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
File file = new File(msg.getData().getString(Constants.STRING_BUNDLE_KEY_PLAY_SONG));
Uri uri = Uri.fromFile(file);
mediaPlayer.setDataSource(getApplicationContext(), uri);
mediaPlayer.prepareAsync();
} catch (Exception e) {
e.printStackTrace();
}
break;
default:
super.handleMessage(msg);
}
}
}
在上面的代码sn-p中,msg.getData().getString(Constants.STRING_BUNDLE_KEY_PLAY_SONG)代表的是mp3文件的路径。相同的示例: /storage/extSdCard/Songs/yaara re.mp3 这是我手机中歌曲的相同路径。
mp3 文件的路径取自 MediaStore.Audio.Media.DATA
向服务发送消息的代码被添加到 Activity 中。代码如下:
private void sendMessageToService(String stringPath) {
Message message = Message.obtain(null, Constants.INT_PLAY_SONG, 0, 0);
Bundle bundle = new Bundle();
bundle.putString(Constants.STRING_BUNDLE_KEY_PLAY_SONG, stringPath);
message.setData(bundle);
try {
messenger.send(message);
} catch (RemoteException e) {
System.out.println("exception while sending message in messenger");
}
}
新的堆栈跟踪
02-07 23:29:50.019 1399-1399/com.varunk314.mymp3 V/MediaPlayer﹕ isPlaying: 0
02-07 23:29:50.019 1399-1399/com.varunk314.mymp3 V/MediaPlayer﹕ reset
02-07 23:29:50.029 1399-1399/com.varunk314.mymp3 V/MediaPlayer﹕ MediaPlayer::setAudioStreamType
02-07 23:29:50.029 1399-1399/com.varunk314.mymp3 V/MediaPlayer﹕ setDataSource(55, 0, 576460752303423487)
02-07 23:29:50.059 1399-1399/com.varunk314.mymp3 V/MediaPlayer﹕ setVideoSurfaceTexture
02-07 23:29:50.059 1399-1399/com.varunk314.mymp3 V/MediaPlayer﹕ prepareAsync
02-07 23:29:50.069 1399-1411/com.varunk314.mymp3 V/MediaPlayer﹕ message received msg=5, ext1=0, ext2=0
02-07 23:29:50.069 1399-1411/com.varunk314.mymp3 V/MediaPlayer﹕ New video size 0 x 0
02-07 23:29:50.069 1399-1411/com.varunk314.mymp3 V/MediaPlayer﹕ callback application
02-07 23:29:50.069 1399-1411/com.varunk314.mymp3 V/MediaPlayer﹕ back from callback
02-07 23:29:50.069 1399-1399/com.varunk314.mymp3 I/MediaPlayer﹕ Don't send intent. msg.arg1 = 0, msg.arg2 = 0
02-07 23:29:50.069 1399-1412/com.varunk314.mymp3 V/MediaPlayer﹕ message received msg=1, ext1=0, ext2=0
02-07 23:29:50.069 1399-1412/com.varunk314.mymp3 V/MediaPlayer﹕ prepared
02-07 23:29:50.069 1399-1412/com.varunk314.mymp3 V/MediaPlayer﹕ callback application
02-07 23:29:50.069 1399-1412/com.varunk314.mymp3 V/MediaPlayer﹕ back from callback
OnPreparedListener 也是如下实现的:
@Override
public void onPrepared(MediaPlayer mp) {
mediaPlayer.start();
}
谁能帮我找出我的代码中的实际问题。
【问题讨论】:
-
你在哪里使用
MyHandler? -
MyHandler 在我的服务中。
-
显示相关代码你在Message中添加数据的地方?
-
您是否尝试删除文件名中的空格?
-
@ρяσѕρєя K:现在添加了向服务发送消息的代码。
标签: android nullpointerexception android-mediaplayer mediastore