MediaPlayer无法在Samsung设备上播放选定的音乐

问题描述 投票:0回答:1

我有一个闹钟应用。允许用户从以下设备中选择铃声:设备铃声,应用闹钟铃声,自己的音乐。用户选择的任何声音,MediaPlayer都会播放默认声音,而不是所选声音。仅在Samsung设备上会出现此问题。

[当用户想要更改警报音时,我要求许可:

 alarmToneLayout.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

                int currentAPIVersion = Build.VERSION.SDK_INT;
                if (currentAPIVersion >= android.os.Build.VERSION_CODES.M) {
                    if (ContextCompat.checkSelfPermission(AlarmEditActivity.this,
                            Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
                            ActivityCompat.requestPermissions(AlarmEditActivity.this, new String[]{
                                    Manifest.permission.READ_EXTERNAL_STORAGE}, 31);

                    } else {
                        showAlarmToneDialog();
                    }
                } else {
                    showAlarmToneDialog();
                }
            }
        });

 @Override
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
        switch (requestCode) {
            case 31:
                    showAlarmToneDialog();
                break;
            default:
                super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        }
    }

而且我有清单。

这是我在用户设备上获取所有音乐的方式。我将其显示为单选按钮列表。当用户选择其中之一时,将保存字符串uriForTheSong。

  private TreeMap<String,String> getAllMusic(){
        ContentResolver cr = this.getActivity().getContentResolver();
        TreeMap<String, String> listOfAllSongsWithUri = new TreeMap<>();

        String[] projection = {
                MediaStore.Audio.Media.DATA,
                MediaStore.Audio.Media.DISPLAY_NAME,
                MediaStore.Audio.Media.ALBUM
        };

        Uri uri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
        String selection = MediaStore.Audio.Media.IS_MUSIC + "!= 0";
        String sortOrder = MediaStore.Audio.Media.TITLE + " ASC";

        Cursor cursor = cr.query(uri, projection, selection, null, sortOrder);

        int count = 0;

        if(cursor != null)
        {
            count = cursor.getCount();

            if(count > 0)
            {
                while(cursor.moveToNext())
                {
                    String uriOfTheSong = cursor.getString(0);
                    String nameOfTheSong = cursor.getString(1);
                    listOfAllSongsWithUri.put(nameOfTheSong, uriOfTheSong);
                }

            }
        }

        cursor.close();
        return listOfAllSongsWithUri;
    }

当警报响起时,AlarmToneActivity启动并播放声音。如果发生异常,MediaPlayer将使用默认的uri(AMAZING_GRACE_URI)

      void playSound(Context context, String alarmToneUriString) throws IllegalArgumentException,
            SecurityException,
            IllegalStateException,
            IOException {

        Uri alarmToneUri = Uri.parse(alarmToneUriString);
        try {
            mPlayer.setDataSource(context, alarmToneUri);
        } catch (Exception e){
            alarmToneUri = Uri.parse(AMAZING_GRACE_URI);
            mPlayer.setDataSource(context, alarmToneUri);
        }
        AudioManager audioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);

        if (audioManager.getStreamVolume(AudioManager.STREAM_ALARM) != 0) {
            if(SharedPref.getGradualVolumeSetting()){
                audioManager.setStreamVolume(AudioManager.STREAM_ALARM, audioManager.getStreamMaxVolume(AudioManager.STREAM_ALARM), 0);
            }
            playerStart();
        }
    }


    void playerStart(){
        try {
            mPlayer.setAudioStreamType(AudioManager.STREAM_ALARM);
            mPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
                @Override
                public void onPrepared(MediaPlayer mPlayer) {
                    mPlayer.start();
                }
            });
            mPlayer.prepareAsync();
            mPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
                @Override
                public void onCompletion(MediaPlayer mediaPlayer) {
                    mPlayer.start(); 
                }
            });
        } catch (IllegalStateException e) {
        }
    }

我没有三星手机,所以我无法检查发生了什么异常。

android android-mediaplayer android-permissions android-cursor mediastore
1个回答
0
投票

我在您的代码中看不到。您是否检查了媒体播放器(here)的生命周期?在setDatasource之前重置Mediaplayer。

© www.soinside.com 2019 - 2024. All rights reserved.