Android Mediaplayer空指针异常(Java)

huangapple 未分类评论48阅读模式
英文:

Android Mediaplayer Null point Exception (Java)

问题

  1. 尝试使用给定的 URI 创建 MediaPlayer 会导致 NullpointerException
  2. Uri uri = Uri.parse(path);
  3. // 使用给定歌曲的 URI 创建 MediaPlayer
  4. if (mediaPlayer != null) {
  5. mediaPlayer.stop();
  6. mediaPlayer.release();
  7. }
  8. mediaPlayer = MediaPlayer.create(this, uri);
  9. try {
  10. // 设置 MediaPlayer 监听器
  11. mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
  12. @Override
  13. public void onPrepared(MediaPlayer mp) {
  14. seekBar.setMax(mp.getDuration());
  15. mediaPlayer.start();
  16. changeSeekbar();
  17. }
  18. });
  19. } catch (Exception e) {
  20. Log.e("ERROR", e.toString());
  21. }
  22. 给定的 Logcat
  23. 2020-04-07 22:21:05.289 12237-12237/com.example.musicappresearch2 E/Path: /storage/emulated/0/Music/Alone - Viren.mp3
  24. 2020-04-07 22:21:05.289 12237-12237/com.example.musicappresearch2 E/ERROR: java.lang.NullPointerException: 尝试调用空对象引用的 'void android.media.MediaPlayer.setOnPreparedListener(android.media.MediaPlayer$OnPreparedListener)' 方法
  25. 您能告诉我我做错了什么吗谢谢
英文:

I am trying to create Mediaplayer session with given uri. but it causes NullpointerException.

  1. Uri uri = Uri.parse(path);
  2. // Creating MediaPlayer with given song's URI
  3. if (mediaPlayer != null) {
  4. mediaPlayer.stop();
  5. mediaPlayer.release();
  6. }
  7. mediaPlayer = MediaPlayer.create(this, uri);
  8. try {
  9. // Setting the MediaPlayer Listener
  10. mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
  11. @Override
  12. public void onPrepared(MediaPlayer mp) {
  13. seekBar.setMax(mp.getDuration());
  14. mediaPlayer.start();
  15. changeSeekbar();
  16. }
  17. });
  18. } catch (Exception e) {
  19. Log.e("ERROR", e.toString());
  20. }

Given Logcat:

  1. 2020-04-07 22:21:05.289 12237-12237/com.example.musicappresearch2 E/Path: /storage/emulated/0/Music/Alone - Viren.mp3
  2. 2020-04-07 22:21:05.289 12237-12237/com.example.musicappresearch2 E/ERROR: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.media.MediaPlayer.setOnPreparedListener(android.media.MediaPlayer$OnPreparedListener)' on a null object reference

Could you Tell me What i am doing wrong ? Thanks.

答案1

得分: 1

有两种方法可以编写这段代码,都在设备上经过测试。

首先,请确保正确处理 android.permission.READ_EXTERNAL_STORAGE 权限,并且确实拥有正确的 Uri。
如果上下文(context)或 Uri 无效,MediaPlayer.create(this, uri); 将会失败。

MediaPlayer.create(this, uri); 本身已经准备好了播放器,因此在这种情况下不需要使用 .prepareAsync()。您的代码可以直接运行。

另一种方法:

  1. mediaPlayer = new MediaPlayer(); // 因此,我们不使用 .create,手动实例化
  2. try {
  3. mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
  4. mediaPlayer.setDataSource(this, uri);
  5. mediaPlayer.setOnPreparedListener(mp -> {
  6. mediaPlayer.start();
  7. });
  8. /* 如果您不想阻塞 UI 线程,可以使用异步方式
  9. 请注意,这应该在设置监听器之后调用
  10. 因为它可能会在监听器设置之前准备好 */
  11. mediaPlayer.prepareAsync();
  12. } catch (Exception e) {
  13. Log.e("ERROR", e.toString());
  14. }
英文:

There are two ways to write this code, both tested on the device

First of all, make sure you handle android.permission.READ_EXTERNAL_STORAGE correctly and you really have correct Uri.
MediaPlayer.create(this, uri); will fail if either context or uri are invalid.

MediaPlayer.create(this, uri); which itself already prepares player so you don't need .prepareAsync() in this situation. and your code is good to go.

another way:

  1. mediaPlayer = new MediaPlayer(); // hence, we don't use .create, manually instantiate
  2. try {
  3. mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
  4. mediaPlayer.setDataSource(this, uri);
  5. mediaPlayer.setOnPreparedListener(mp -> {
  6. mediaPlayer.start();
  7. });
  8. /* use async, if you don't want to block UI thread
  9. keep in mind, this should be called after setting listener
  10. because it might prepare even until the listener has been set */
  11. mediaPlayer.prepareAsync();
  12. } catch (Exception e) {
  13. Log.e("ERROR", e.toString());
  14. }

答案2

得分: 0

请尝试这样做:

  1. Uri uri = Uri.parse(path);
  2. mediaPlayer = new MediaPlayer();
  3. try {
  4. // mediaPlayer.setDataSource(String.valueOf(uri));
  5. mediaPlayer.setDataSource(MainActivity.this, uri);
  6. } catch (IOException e) {
  7. e.printStackTrace();
  8. }
  9. try {
  10. mediaPlayer.prepare();
  11. } catch (IOException e) {
  12. e.printStackTrace();
  13. }
  14. mediaPlayer.start();
英文:

Try this :

  1. Uri uri = Uri.parse(path);
  2. mediaPlayer = new MediaPlayer();
  3. try {
  4. // mediaPlayer.setDataSource(String.valueOf(uri));
  5. mediaPlayer.setDataSource(MainActivity.this,uri);
  6. } catch (IOException e) {
  7. e.printStackTrace();
  8. }
  9. try {
  10. mediaPlayer.prepare();
  11. } catch (IOException e) {
  12. e.printStackTrace();
  13. }
  14. mediaPlayer.start();

huangapple
  • 本文由 发表于 2020年4月8日 02:24:25
  • 转载请务必保留本文链接:https://java.coder-hub.com/61086827.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定