来自外部存储的 Uri 上的 MediaPlayer 为空

MediaPlayer is null on a Uri from external storage

我创建了一个闹钟应用程序。警报响起时,我想在 MediaPlayer 中播放音频。已创建 MediaPlayer 并 运行 成功使用 默认铃声 但如果从外部存储中选择音频文件,则保持 null

我在清单中提供了以下权限:

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>

mediaPlayer设置里面的代码BroadcastReciever class:

 @Override
    public void onReceive(Context context, Intent intent) {

        try {
            alarm_tone = Uri.parse(intent.getStringExtra("alarm_tone"));
             }catch (Exception ex){
                              alarm_tone = Settings.System.DEFAULT_RINGTONE_URI;
                              }
        Log.d("Uri", "Alarm tone recieved: " + (alarm_tone));     //result: OK

        MediaPlayer mediaPlayer=MediaPlayer.create(context, alarm_tone);

        mediaPlayer.setScreenOnWhilePlaying(true); //gives null pointer exception on this line in case of external Uri,, i.e. mediaPlayer is null in this case
        mediaPlayer.setLooping(true);
        mediaPlayer.start();
    }

以下是我的 activity 的代码,我在其中选择音频文件并使用意图将其 Uri 数据 发送到 BroadcastReciever class :

btnRingTone.setOnClickListener(new View.OnClickListener() {
              @Override
              public void onClick(View view) {
                  Intent intent = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Audio.Media.EXTERNAL_CONTENT_URI);

                  startActivityForResult(intent, 10);
              }
          });


  @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {

        if(resultCode == RESULT_OK && requestCode == 10){
            ringTone=data.getData();
        }
    }
    public void setAlarm(){
    Intent i=new Intent(this, AlarmReciver.class);
    i.putExtra("alarm_tone", ringtone.toString());
    ...
    }

音频文件选择成功。 Uri 也在 AlarmReciever class 中成功接收。但是 MediaPlayer 实例不是用它创建的。

android可能不支持您要播放的文件。 尝试使用不同的文件并检查此问题的答案:Android MediaPlayer.Create() returns null