Android MediaPlayer java.io.IOException: подготовка не удалась .: status = 0x1 - PullRequest
1 голос
/ 02 апреля 2019

Я использую Android MediaPlayer для настройки потока URL в моем приложении.Я пробовал несколько разных постов, чтобы разобраться с кодом выхода и ошибкой: (1, -2147483648).

Я попытался несколько разных потоков, но я не могу заставить MediaPlayer работать.Я думал о перемещении по ExoPlayer от Google, но это немного сложнее, и я не хочу прыгать с корабля в случае, если я что-то упустил.

MediaPlayer:

private MediaPlayer player;
String url = "http://199.180.75.118:80/stream";     //temp stream
private void initializeMediaPlayer() {
    player = new MediaPlayer();
    player.setAudioAttributes( new AudioAttributes.Builder()
        .setUsage(AudioAttributes.USAGE_MEDIA)
        .setContentType(AudioAttributes.CONTENT_TYPE_MUSIC)
        .build());

    try { 
        player.setDataSource(url);
        player.prepareAsync();
        player.setOnPreparedListener(new OnPreparedListener() {
            public void onPrepared(MediaPlayer mp) {
                mp.start();
            }
        });
    } catch (IllegalArgumentException e) {
        e.printStackTrace();
    } catch (IllegalStateException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    } 
}

Я также включил разрешение Android:

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

Я попытался использовать исходный тип потока (но выдает устаревшее предупреждение):

player.setAudioStreamType(AudioManager.STREAM_MUSIC);

Поэтому вместо этого я использовал .setAudioAttributes(...) Я попытался просто запустить prepare() вместо prepareAsync(), который дал название проблемы, но я по-прежнему получаю ту же ошибку.Я также посмотрел на фактическое определение ошибки ( Ошибка Android MediaPlayer (1, -2147483648) ).Я не думаю, что это проблема источника, так как я пробовал несколько других потоков.Пожалуйста, дайте мне знать, если я пропускаю что-то важное, что может быть причиной моей ошибки.

Редактировать Если это вообще поможет, я изучал свои звонки и обнаружил, что MediaPlayerникогда не звонит onPrepared(...).Я проверил Content-Types всех медиа, которые я тестировал, и все они были аудио / MPEG заголовками.Поэтому я не понимаю, почему MediaPlay не обращается к onPrepared.

Ответы [ 2 ]

3 голосов
/ 03 апреля 2019
private void initializeMediaPlayer() {
        player = new MediaPlayer();
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            player.setAudioAttributes(new AudioAttributes.Builder()
                    .setUsage(AudioAttributes.USAGE_MEDIA)
                    .setContentType(AudioAttributes.CONTENT_TYPE_MUSIC)
                    .setLegacyStreamType(AudioManager.STREAM_MUSIC)
                    .build());
        } else {
            player.setAudioStreamType(AudioManager.STREAM_MUSIC);
        }
        try {
            player.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
                @Override
                public void onPrepared(MediaPlayer mp) {
                    mp.start();
                }
            });
            player.setDataSource(url);
            player.prepareAsync();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

onПодготовленный звонок в секундах.

В Android 9 отметьте это https://developer.android.com/training/articles/security-config

AndroidManifest.xml добавить атрибуты networkSecurityConfig

...
<application
android:networkSecurityConfig="@xml/network_security_config"
...>
...

в src / res / xml добавить файл network_security_config.xml

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <base-config cleartextTrafficPermitted="true">
        <trust-anchors>
            <certificates src="system" />
            <certificates src="user" />
        </trust-anchors>
    </base-config>
</network-security-config>
2 голосов
/ 04 апреля 2019

попробуй с этим кодом Протестировано с real device Vivo V7+ Android 8.1.0

    private MediaPlayer player;
    String url = "http://199.180.75.118:80/stream";     //temp stream
    @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
    private void initializeMediaPlayer() {
        player = new MediaPlayer();
        player.setAudioAttributes( new AudioAttributes.Builder()
                .setUsage(AudioAttributes.USAGE_MEDIA)
                .setContentType(AudioAttributes.CONTENT_TYPE_MUSIC)
                .build());

        try {
            //change with setDataSource(Context,Uri);
            player.setDataSource(this, Uri.parse(url));
            player.prepareAsync();
            player.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
                public void onPrepared(MediaPlayer mp) {
                    //mp.start();
                    player.start();
                }
            });
        } catch (IllegalArgumentException e) {
            e.printStackTrace();
        } catch (IllegalStateException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

Убедитесь, что вы определили разрешение в файле манифеста

Manifest.xml

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

<Application
  android:usesCleartextTraffic="true"
  ....
  >
  //.....
  </Application>
...