- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我在 prepareAsync 方法中遇到错误 (1,-4)。文档指定这是“文件格式不正确”(对吗?),但文件是 mp3 格式。此外,当在另一个 Activity 中调用媒体播放器时,相同的文件会在旧版本的软件中重现。我不知道如何解决这个问题,所以我在这里。
应用程序代码如下所示:
SingletonMediaPlayer 将管理在应用程序中用作单例的媒体播放器对象
public class SingletonMediaPlayer {
private static SingletonMediaPlayer instance;
private MediaPlayer mp;
private int buffer_state;
private SingletonMediaPlayer() {
Log.d("SMP","Creating new media player");
this.mp = new MediaPlayer();
this.buffer_state = 0;
}
public static SingletonMediaPlayer getInstance() {
if (instance == null) {
instance = new SingletonMediaPlayer();
}
return instance;
}
public void play(String path, final TextView tv_messaging){
if(this.mp.isPlaying()){
Log.d("SMP","Player is playing, now I'll stop and reset it");
this.mp.stop();
this.mp.reset();
this.mp.release();
}
Log.d("SMP","Set audio stream type");
this.mp.setAudioStreamType(AudioManager.STREAM_MUSIC);
try {
Log.d("SMP","Set data source");
this.mp.setDataSource(path);
Log.d("SMP","Prepare async");
this.mp.prepareAsync();
Log.d("SMP","Done!");
tv_messaging.setText("Connecting to the server...please wait");
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
tv_messaging.setText(e.toString());
Log.e("SMP","IllegalArgumentException");
} catch (SecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
tv_messaging.setText(e.toString());
Log.e("SMP","SecurityException");
} catch (IllegalStateException e) {
// TODO Auto-generated catch block
e.printStackTrace();
tv_messaging.setText(e.toString());
Log.e("SMP","IllegalStateException");
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
tv_messaging.setText(e.toString());
Log.e("SMP","IOException");
}catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
tv_messaging.setText(e.toString());
Log.e("SMP","Generic Exception");
}
}
public void checkBufferState(final TextView tv_buffer_message){
final SingletonMediaPlayer self = this;
Log.d("SMP"," Set on prepared listener");
this.mp.setOnErrorListener(new OnErrorListener(){
@Override
public boolean onError(MediaPlayer mp, int arg1, int arg2) {
// TODO Auto-generated method stub
return false;
}
});
this.mp.setOnPreparedListener(new OnPreparedListener() {
public void onPrepared(MediaPlayer mPlayer) {
OnBufferingUpdateListener lis = new OnBufferingUpdateListener(){
public void onBufferingUpdate(MediaPlayer mPlayer, int percent) {
Log.d("SMP"," Mediaplayer ready (preparation done). Inside buffer listener");
self.buffer_state = percent;
if(tv_buffer_message != null){
tv_buffer_message.setText(percent+"%");
}
}
};
Log.d("SMP"," Mediaplayer ready (preparation done). Installing buffer listener");
mPlayer.setOnBufferingUpdateListener(lis);
Log.d("SMP"," Mediaplayer ready (preparation done). Starting reproduction");
mPlayer.start();
Log.d("SMP"," Mediaplayer ready (preparation done). Done!");
}
});
}
public int getBufferState(){
return this.buffer_state;
}
}
我正在动态创建按钮,单击按钮时应该播放 mp3。所以,就在用于创建按钮的循环之前,我有
final SingletonMediaPlayer mediaPlayer = SingletonMediaPlayer.getInstance();
mediaPlayer.checkBufferState(tv_sel_ep);
然后,对于每个按钮,我都有
button.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
mediaPlayer.play(link, Text_view_used_to_show_error);
}
});
日志
02-15 14:35:24.165: D/dalvikvm(1415): GC_EXTERNAL_ALLOC freed 58K, 52% free 2633K/5379K, external 391K/517K, paused 87ms
02-15 14:35:25.705: D/NetworkActivity(1415): Starting SelectEpisodeActivity
02-15 14:35:25.995: D/SMP(1415): Creating new media player
02-15 14:35:26.005: D/SMP(1415): Set on prepared listener
02-15 14:35:28.745: W/KeyCharacterMap(1415): No keyboard for id 0
02-15 14:35:28.745: W/KeyCharacterMap(1415): Using default keymap: /system/usr/keychars/qwerty.kcm.bin
02-15 14:35:28.745: I/qqqqqqqqqqqqq(1415): qqqqqqqqqqqqqqqqqqqq
02-15 14:35:29.235: D/dalvikvm(1415): GC_CONCURRENT freed 307K, 53% free 2669K/5639K, external 477K/989K, paused 8ms+12ms
02-15 14:35:30.275: D/NetworkActivity(1415): Starting SelectEpisodeActivity
02-15 14:35:30.415: D/SMP(1415): Set on prepared listener
02-15 14:35:32.485: D/SMP(1415): Set audio stream type
02-15 14:35:32.485: D/SMP(1415): Set data source
02-15 14:35:32.785: D/SMP(1415): Prepare async
02-15 14:35:32.785: D/SMP(1415): Done!
02-15 14:35:32.885: W/MediaPlayer(1415): info/warning (1, 26)
02-15 14:35:32.885: I/MediaPlayer(1415): Info (1,26)
02-15 14:35:32.885: E/MediaPlayer(1415): error (1, -4)
02-15 14:35:32.885: E/MediaPlayer(1415): Error (1,-4)
编辑:Dave 回答后的新日志
02-16 14:35:11.265: D/dalvikvm(12723): GC_EXTERNAL_ALLOC freed 59K, 52% free 2633K/5379K, external 391K/517K, paused 133ms
02-16 14:35:13.265: D/NetworkActivity(12723): Starting SelectEpisodeActivity
02-16 14:35:13.405: D/SMP(12723): Creating new media player
02-16 14:35:13.415: D/SMP(12723): Set on prepared listener
02-16 14:35:17.365: D/SMP(12723): Set audio stream type
02-16 14:35:17.365: D/SMP(12723): Set data source
02-16 14:35:17.435: D/SMP(12723): Prepare async
02-16 14:35:17.435: D/SMP(12723): Done!
02-16 14:35:17.445: W/MediaPlayer(12723): info/warning (1, 26)
02-16 14:35:17.445: E/MediaPlayer(12723): error (1, -4)
02-16 14:35:17.465: I/MediaPlayer(12723): Info (1,26)
02-16 14:35:17.465: E/MediaPlayer(12723): Error (1,-4)
感谢帮助
最佳答案
一些事情。
1) 如果您希望 MediaPlayer
之后仍处于可用状态,则不应调用 release()
。 -4 错误(如果我没记错的话)是无效的状态转换,尝试使用已发布的 MediaPlayer
应该会产生该错误。
2) 您可以在创建MediaPlayer
时设置一次onPrepared
、onError
和onBufferingUpdate
监听器.您现在所做的事情看起来很尴尬且没有必要。
3) 遇到 Android 问题时发布 logcat 输出。
如果您只执行第 1 点,您可能会得到一些可行的结果。不过,在实际使用调用回调的方法之前设置监听器是个好主意。
编辑:
private static SingletonMediaPlayer instance;
private MediaPlayer mp;
private int buffer_state;
// Add a member for the TextView
private TextView tv_buffer_message;
private SingletonMediaPlayer() {
Log.d("SMP","Creating new media player");
mp = new MediaPlayer();
Log.d("SMP","Set audio stream type");
mp.setAudioStreamType(AudioManager.STREAM_MUSIC);
mp.setOnErrorListener(new OnErrorListener(){
@Override
public boolean onError(MediaPlayer mp, int arg1, int arg2) {
// YOU SHOULD REALLY DO SOMETHING HERE!!! IT COULD BE INFORMATIVE!!!
return false;
}
});
Log.d("SMP"," Installing buffer listener");
mp.setOnBufferingUpdateListener(new OnBufferingUpdateListener(){
public void onBufferingUpdate(MediaPlayer mPlayer, int percent) {
Log.d("SMP"," Mediaplayer ready (preparation done). Inside buffer listener");
buffer_state = percent;
if(tv_buffer_message != null){
tv_buffer_message.setText(percent+"%");
}
}
};
Log.d("SMP"," Set on prepared listener");
mp.setOnPreparedListener(new OnPreparedListener() {
public void onPrepared(MediaPlayer mPlayer) {
Log.d("SMP"," Mediaplayer ready (preparation done). Starting reproduction");
mPlayer.start();
Log.d("SMP"," Mediaplayer ready (preparation done). Done!");
}
});
buffer_state = 0;
}
// Remove the checkBufferState method and call the following in its place:
public setBufferMessageView(TextView tv) {
tv_buffer_message = tv;
}
// getInstance, play, and getBufferState can stay the same, except remove the call to release
关于AndroidId MediaPlayer 报错(1,-4) prepareAsync 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21795795/
我在 logcat 中收到一条警告消息 W/MediaPlayer-JNI(16795): MediaPlayer finalized without being released 请告诉我我错在哪里
我有以下代码。 例如: if(player1 != null){ if(player1.isPlaying()){ //check if it playing //other
我在安卓系统工作。我正在创建一个正在运行音频文件的 mediaPlayer。我有 10 个按钮。我为每个按钮分配了不同的 url。因此,当我按下按钮 1 时,将播放与按钮 1 相关的 url 歌曲。然
我正在使用 MediaPlayer。我想制作在线流媒体广播。现在我有这个 mediaPlayer 对象(MediaPlayer 的),在 fragment 1 中说,当我在 fragment 1 上时
我使用了以下代码: mp = MediaPlayer.create(this, Uri.parse("file://"+filePath)); mp.start(); 这很好用。然后我想播放文件夹中的
我通过下载新文件来启动我的应用程序,如果有任何文件开始播放循环。然后我每 x 秒触发一个任务来寻找新媒体。调用任务后,视频将停止播放,并显示错误 MediaPlayer finalized witho
我的应用程序允许用户从多个音频流中进行选择,当用户点击其中一个播放按钮时,将调用以下代码: @Override public void onClick(View view) { mMediaP
我正在尝试在我的 ViewController 中播放视频。 Mediaplayer.framework 和所有 Headers 都在我的 Frameworks 文件夹中,包括 MediaPlayer
我正在使用 MediaPlayer 和 SurfaceView 播放本地视频文件。 SurfaceView 是 Activity 中的唯一控件,而我的视频文件是 QVGA 或其他。问题是视频被拉伸(s
我正在使用 JavaFX 的 MediaPlayer 播放 mp3 文件,getCurrentTime() 工作正常,但是当我在某个时候使用 seek() 方法时, getCurrentTime()
我将音量设置为 0.0,然后在 while 循环中一点一点地改变音量。然而,音量从 0.0 跳到 1.0?如何顺利改变音量?我试过了 public class EngineSound extends
我为“播放”和“暂停”按钮创建了两个 onClick 方法,但如果先点击“暂停”,然后点击“播放”按钮,则音乐不会播放。下面是代码 package com.example.myaudio; impor
我用 MediaPlayer 控件创建了一个绑定(bind)服务,它可以加载和播放音频。但碰巧的是,有时 mediaPlayer.prepare(); 速度不够快,并不总是准备好播放。 那么我怎样才能
我正在我的应用程序中播放从网络流式传输的 mp3 文件,一些 mp3 文件有奇怪的行为:mediaPlayer.getCurrentPosition() 大于 mediaPlayer.getDurat
我想制作广播播放器示例,但我有一些错误。我无法修复它。 我的源代码 String url = ""; //Shoutcast Radio URL mp = new MediaPlayer();
我知道有一些类似的问题,但没有一个回答我的问题。当我点击一个按钮时,媒体播放器被调用,并且它出现在日志中。 06-02 00:20:38.980 26035-26035/myapp.com.facad
我正在尝试从 URL 流式传输音频。该代码适用于其他 URL,但其中一个 URL 在 OnPrepared 方法中失败,返回此错误代码:(1, -2147483648)。我看过一些人说这是因为权限,但
我在我的 Android 应用程序中使用 MediaPlayer 来播放视频。当通过 mediaPlayer.pause() 方法暂停播放并调用 mediaPlayer.seekTo(msec) 时,
我的应用程序在 MediaPlayer 流媒体方面存在问题,特别是在 Nexus 5 上。我不确定这是 Nexus 5 还是 API 级别 19 导致的问题。基本上我的 MediaPlayer 准备好
不过,我正在使用 RingtoneManager 来获取 Ringtone。 此信息已包含在 this question and answer 中,但 Google 员工不太可能找到它,除非他们已经知
我是一名优秀的程序员,十分优秀!