首页 > 解决方案 > 媒体播放器是一个空对象,当由从广播接收器启动的活动制作时

问题描述

我正在尝试从广播接收器打开的活动中播放 MediaPlayer。如果我从 R.raw 文件夹播放内部文件,这很好用。但是,如果我尝试通过 URI 访问 Mp3 文件,它就不再起作用了。

public class AlarmScreen extends AppCompatActivity {
MediaPlayer mediaPlayer;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_alarm_screen);
    mediaPlayer = new MediaPlayer();
    startMusic();
    }

private void startMusic() {
    String stringUri = element.getUri();

    if (!(stringUri.equals(""))){
        Uri uri = Uri.parse(stringUri);
        mediaPlayer = MediaPlayer.create(this, uri);
        Handler handler = new Handler();
        handler.postDelayed(new Runnable() {
            @Override
            public void run() {
                mediaPlayer.start();
            }
        }, 1000);
    }
}

我得到的错误如下所示:

java.lang.NullPointerException: Attempt to invoke virtual method 'void android.media.MediaPlayer.start()' on a null object reference

我还尝试按以下方式制作媒体播放器,但结果相同:

Uri uri = Uri.parse(stringUri);
        try {
            mediaPlayer.setDataSource(this, uri);
        } catch (IOException e) {
            e.printStackTrace();
        }
        mediaPlayer.prepareAsync();
        Handler handler = new Handler();
        handler.postDelayed(new Runnable() {
            @Override
            public void run() {
                    mediaPlayer.start();
            }
        }, 300);

我想问题出在权限内,因为据我所知,BroadCastReceivers 没有与普通应用程序相同的权限。如果您需要更多代码,请告诉我。

编辑:

我通过制作以下测试项目缩小了问题范围:这里创建了 2 个 Uris。对于 Uri1,我使用来自选择器的数据。对于 Uri2,我使用上一轮的 Uri-String。然后这些 Uris 在 start() 中播放。如果我玩 Uri1,它总是有效。但是如果我玩 Uri2,它只有在 Uri1 等于 Uri2 时才有效。只有在选择器中再次选择相同的音乐文件时才会出现这种情况,就像我最初复制 Uri2 的那轮一样。

我真的不明白我做错了什么。还有其他方法可以从您的设备访问音乐文件吗?

private void play(){
    mediaPlayer = new MediaPlayer();
    try {
        mediaPlayer.setDataSource(this, uri2);
    } catch (IOException e) {
        e.printStackTrace();
    }
    mediaPlayer.prepareAsync();
    mediaPlayer.start();
}




@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
    super.onActivityResult(requestCode, resultCode, data);

    uri2 = Uri.parse("content://com.android.providers.media.documents/document/audio%3A17207");
    uri1 = data.getData();

    String str = uri.toString();

}

private void start(){
    Intent intent = new Intent();
    intent.setAction(Intent.ACTION_GET_CONTENT);
    intent.setType("audio/*");
    startActivityForResult(Intent.createChooser(intent, "choose:"), 1);
}

标签: javaandroidandroid-studiobroadcastreceiverandroid-mediaplayer

解决方案


我认为你的问题是因为权限。

尝试将 READ_EXTERNAL_STORAGE 添加到清单中。

像这样的东西:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
          package="com.example.snazzyapp">
     ...
     <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
     ...
    <application ...>
        ...
    </application>
</manifest>

推荐阅读