Android MediaPlayer不会在API 26+上播放音乐

问题描述 投票:5回答:3

我有一个为用户传输音乐的应用程序,这个代码在运行Android到API 25的设备上运行良好,当我在运行API 26或更高版本的设备中测试音乐不会播放并且不会显示错误消息时,附加的是使用API​​ 28设备时的日志。

我尝试过的:

  • MediaPlayer.setAudioStreamType(int streamtype)已弃用,因此我为26以上的API实现了AudioAttributes
  • 不同类型的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
android android-mediaplayer android-8.0-oreo
3个回答
5
投票

您需要为该主机定义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 documentation详细解释了这一点 - 这适用于应用创建的所有网络流量。

应优先考虑升级与HTTPS的连接,而不是降低安全标准。


关于那个被弃用的方法.setAudioStreamType(),使用.setAudioAttributes()代替 - 正如你的代码已经做的那样。它似乎不是这里的“主要问题”;验证了。


0
投票

请使用此代码。

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

                }

            });

0
投票

只需在application Tag中添加一行

<application
        .......
        android:usesCleartextTraffic="true"
        .......>
        .......
    </application>
© www.soinside.com 2019 - 2024. All rights reserved.