Android MediaPlayer не будет воспроизводить музыку на API 26+ - PullRequest
5 голосов
/ 05 апреля 2019

У меня есть приложение, которое воспроизводит музыку для пользователя, этот код работает нормально на устройствах с Android до API 25, когда я тестирую на устройстве с API 26 или выше, Music не воспроизводится и не отображает сообщение об ошибке. Прилагается, мой журнал при использовании API 28 устройства.

Что я пробовал:

  • MediaPlayer.setAudioStreamType (int streamtype) устарел, поэтому я реализовал AudioAttributes для API выше 26
  • Различные типы mp3-файлов, но все они воспроизводятся одинаково в API 25 и ниже, когда я пробую на устройстве или эмуляторе с API 26 ничего не происходит
  • Поиск в документах и ​​примерах, но все они выглядят одинаково, я не вижу разницы в моем коде

    private void playMusic() {
    try {
        mMediaPlayer.reset();
    
        // For Android API 26 (Android 8 Oreo) and newer, specify AudioAttributes.
        if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) {
            Log.d("Record", "setAudioAttributes()");
            AudioAttributes.Builder builder = new AudioAttributes.Builder();
            builder.setUsage(AudioAttributes.USAGE_MEDIA);
            builder.setContentType(AudioAttributes.CONTENT_TYPE_MUSIC);
            AudioAttributes attributes = builder.build();
            mMediaPlayer.setAudioAttributes(attributes);
    
        } else {
            Log.d("Record", "setAudioStreamType()");
            mMediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
        }
    
        mMediaPlayer.setDataSource(String.format("http://www.server.com/mp3/%s.mp3", mp3File));
        mMediaPlayer.prepareAsync();
        mMediaPlayer.start();
    
    } catch (IOException e) {
        Log.d("Record", "error playing mp3");
        e.printStackTrace();
    }
    }
    

Вход

2019-04-04 17:51:38.911 2947-24864/com.roneskinder.karaoke 
V/MediaPlayer: resetDrmState:  mDrmInfo=null mDrmProvisioningThread=null mPrepareDrmInProgress=false mActiveDrmScheme=false
2019-04-04 17:51:38.911 2947-24864/com.roneskinder.karaoke V/MediaPlayer: cleanDrmObj: mDrmObj=null mDrmSessionId=null
2019-04-04 17:51:38.913 2947-3054/com.roneskinder.karaoke D/EGL_emulation: eglMakeCurrent: 0xe830ce20: ver 3 0 (tinfo 0xe8315bd0)
2019-04-04 17:51:38.915 2947-24864/com.roneskinder.karaoke V/MediaHTTPService: MediaHTTPService(android.media.MediaHTTPService@aa03fa3): Cookies: null
2019-04-04 17:51:38.920 2947-4147/com.roneskinder.karaoke V/MediaHTTPService: makeHTTPConnection: CookieHandler (java.net.CookieManager@ead45b3) exists.
2019-04-04 17:51:38.920 2947-4147/com.roneskinder.karaoke V/MediaHTTPService: makeHTTPConnection(android.media.MediaHTTPService@aa03fa3): cookieHandler: java.net.CookieManager@ead45b3 Cookies: null

Ответы [ 3 ]

5 голосов
/ 08 апреля 2019

Вам необходимо определить res/xml/network_security_config.xml и разрешить HTTP для этого хоста:

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <domain-config cleartextTrafficPermitted="true">
        <domain includeSubdomains="true">server.com</domain>
    </domain-config>
</network-security-config>

На network_security_config.xml также необходимо ссылаться в Manifest.xml:

<?xml version="1.0" encoding="utf-8"?>
<manifest
    ...>
    <application
        android:networkSecurityConfig="@xml/network_security_config"
        ...>
            ...
    </application>
</manifest>

Документация SDK объясняет все это подробно - и это относится ко всему сетевому трафику, создаваемому приложением.

Вместо понижения стандартов безопасности обновление соединения до HTTPS должнобыть предпочтительным.


А в отношении этого одного устаревшего метода .setAudioStreamType() используйте взамен .setAudioAttributes () - как уже делает ваш код.Это, похоже, не является «главной проблемой» здесь;проверил это.

0 голосов
/ 15 апреля 2019

Просто добавьте одну строку в application Тег

<application
        .......
        android:usesCleartextTraffic="true"
        .......>
        .......
    </application>
0 голосов
/ 08 апреля 2019

Пожалуйста, используйте этот код.

MediaPlayer player = new MediaPlayer();

player.setDataSource("http://www.server.com/mp3/%s.mp3");
player.setLooping(false);
player.setAudioStreamType(AudioManager.STREAM_MUSIC);
player.prepareAsync();

player.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {

                @Override
                public void onPrepared(MediaPlayer player) {
                    player.start();

                }

            });
...