public class MainActivity extends AppCompatActivity implements View.OnClickListener{
private MediaPlayer mediaPlayer = new MediaPlayer();
public List musicList = new ArrayList<>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button play = (Button)findViewById(R.id.play);
Button stop = (Button)findViewById(R.id.stop);
Button pause = (Button)findViewById(R.id.pause);
ListView listView = (ListView)findViewById(R.id.list_view);
play.setOnClickListener(this);
stop.setOnClickListener(this);
pause.setOnClickListener(this);
if (Environment.getExternalStorageDirectory().listFiles(new MusicFilter()).length > 0){
for (File file : Environment.getExternalStorageDirectory().listFiles(new MusicFilter())) {
musicList.add(file.getAbsolutePath().substring(20));
ArrayAdapter adapter = new ArrayAdapter<>(MainActivity.this,
android.R.layout.simple_list_item_1, musicList);
listView.setAdapter(adapter);
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
String SD = "/storage/emulated/0/";
String path = musicList.get(i).toString();
String SP = SD + path;
Toast.makeText(MainActivity.this,SP,Toast.LENGTH_SHORT).show();
try {
mediaPlayer.setDataSource(SP);
mediaPlayer.prepare();
mediaPlayer.start();
} catch (IOException e) {
e.printStackTrace();
if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE)
!= PackageManager.PERMISSION_GRANTED){
ActivityCompat.requestPermissions(MainActivity.this,
new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE },1);
}else{
initMediaPlayer();
@Override
public void onClick(View view) {
switch (view.getId()){
case R.id.play:
if (!mediaPlayer.isPlaying()){
mediaPlayer.start();
break;
case R.id.stop:
if (mediaPlayer.isPlaying()){
mediaPlayer.reset();
initMediaPlayer();
break;
case R.id.pause:
if (mediaPlayer.isPlaying()){
mediaPlayer.pause();
break;
default:
break;
private void initMediaPlayer(){
try {
File file = new File(Environment.getExternalStorageDirectory(),"m.mp3");
mediaPlayer.setDataSource(file.getPath());
mediaPlayer.prepare();
} catch (Exception e) {
e.printStackTrace();
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions,
@NonNull int[] grantResults) {
switch (requestCode){
case 1:
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED){
initMediaPlayer();
}else{
Toast.makeText(this,"无权限",Toast.LENGTH_SHORT).show();
finish();
break;
default:
@Override
protected void onDestroy() {
super.onDestroy();
if (mediaPlayer != null){
mediaPlayer.stop();
mediaPlayer.release();
try {
mediaPlayer.reset();
mediaPlayer.setDataSource(SP);
mediaPlayer.prepare();
mediaPlayer.start();
} catch (IOException e) {
e.printStackTrace();
}
仔细想想,每次使用MediaPlarer都是要先初始化和释放资源的,也就是要reset()的,之前在设置listview点击事件时没有注意到这点,所以一直有这个异常,而这个异常可以解释为:因为java里面的mediaplayer对象的状态和native的对象状态发生了不一致。也就是说,你在用MediaPlayer之前没有初始化或者没有回复到原来刚创建是的状态,所以只要加上这一句就可以了:
本文实例讲述了Android MediaPlayer基本使用方法。分享给大家供大家参考,具体如下:
使用MediaPlayer播放音频或者视频的最简单例子:
Java代码部分:
public class MediaPlayerStudy extends Activity {
private Button bplay,bpause,bstop;
private MediaPlayer mp = new MediaPlayer();
@Override
public void onCreate(BundlesavedInstanceState) {
super.onCre
1.错误logjava.lang.IllegalStateException
at android.media.MediaPlayer._setDataSource(Native Method)
at android.media.MediaPlayer.setDataSource(MediaPlayer.java:1157)
at android.m...
前两天写项目的时候有一个播放背景音乐的功能,使用 MediaPlayer 的时候,进行 暂停-> 重置-> 播放 流程时总是莫名其妙的抛出异常。这里记录一下解决问题的代码:private var mediaPlayer: MediaPlayer? = null /**
* 开始播放
private fun playMedia() {
if (m
使用Mediaplayer播放视频时,自定义了进度条显示进度,一次需要使用run方法来实时监测视频播放的位置,代码如下:Runnable runnable = new Runnable() {
@Override
public void run() {
if (player != null) {
int pos = player.getCurrentPosition();
if (pos
使用Mediaplayer播放本地音频,在第二次调用mediaplayer.setDataSource()时报错如下:
Caused by: java.lang.IllegalStateException
at android.media.MediaPlayer._setDataSource(Native Method)
at android.media.MediaPlayer.setD...
使用Mediaplayer播放本地音频,在调用mMediaPlayer.setDataSource()时报错如下:
Caused by: java.lang.IllegalStateException
at android.media.MediaPlayer._setDataSource(Native Method)
at android.media.MediaPlayer.setDataSour...
集美们哦不兄弟们,鄙人花了一下午到晚上十点的时间,查了又查,总结得出此原因绝对是MediaPlayer的状态不对,也就是它调用某个方法时候不在应该在的状态里面,比如说它在idel空闲状态,你硬是要对其进行播放或者什么操作,这是不允许的。所以要找出问题所在的地方即可,具体步骤如下:
1.通过try…catch先捕获出来,然后通过查看Log你设定的位置信息看看有什么不对劲的地方,比如鄙人出现的问题如下...
MediaPlayer.setDataSource(“”);调用 MediaPlayer.prepare() 出现 IllegalStateException 异常
现在只需把MediaPlayer设置一个监听事件,
mMediaPlayer.reset();
mMediaPlayer.setDataSource(scenicDetailResult.getSoftyuy
目录错误log:原因:
错误log:
1566550586.419 28478-28478/com.stone.stonemusic W/System.err: java.lang.IllegalStateException
1566550586.420 28478-28478/com.stone.stonemusic W/System.err: at android.media.Medi...
最近接触MediaPlayer的播放,手动设置停止播放,加上可能音乐播放完毕,但是又重新开始播放这样的情况,MediaPlayer总是出现IllegalStateException异常。
if (mMediaPlayer.isPlaying()) {
mMediaPlayer.stop();
mMediaPlayer = null;
当音乐播放完毕自动停止,mMedi
android开发 java.lang.IllegalStateException at android.media.MediaPlayer._prepare(Native Method)
最近遇到一个问题,我在service里面播放一段音乐时遇到了IllegalStateException异常,代码是这样的:protected void play() {
System.out.println("play");
mpMediaPlayer = MediaPlayer.create(this, R.raw.dd);
try {
demo和项目代码的区别是:demo中把SurfaceView.getHolder() 作为数据渲染控件。项目中把一个自定义的 SurfaceView子类 作为渲染控件。
更换渲染控件,问题解决。
使用自定义 SurfaceView子类 作为渲染控件时,调用 MediaPlayer.setDisplay(),并不会触发MediaPlaye