java - 来自外部存储的 Uri 上的 MediaPlayer 为 null

标签 java android broadcastreceiver uri android-mediaplayer

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

我已在 list 中提供以下权限:

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

BroadcastReciever类中mediaPlayer设置的代码:

 @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 代码,我在其中选择音频文件并使用 Intent 将其 Uri 数据发送到 BroadcastReciever 类:

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());
    ...
    }

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

最佳答案

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

关于java - 来自外部存储的 Uri 上的 MediaPlayer 为 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59712828/

相关文章:

java - Hibernate n+1 select 具有多个表层次结构

Java:库中的库和类路径问题

java - 如何创建绑定(bind)文件以将 complexType 更改为 simpleType

java - Solr 中的 volatile 数据

java - 在Android fragment 中使用键值对填充微调器

android - 为什么 apk 在使用 proguard 构建时不起作用?

java - 不运行BroadcastReceiver代码

Android Intent.ACTION_CALL : phone number with # char

android - service和intentservice之间的通信

android - 以编程方式在广播接收器中调用电话