22 / 22 / 7
Регистрация: 26.05.2011
Сообщений: 256
1

Потоковый проигрыватель

16.12.2015, 19:26. Показов 3278. Ответов 32
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Добрый вечер!
Пишу потоковый проигрыватель, который воспроизводит интернет-радио. Но суть в том, чтобы при каком-то сбое воспроизведение автоматически возобновлялось.
Каким образом это можно сделать?
Так же, хотелось бы сделать приложение неуязвимым (ну, чтобы не выгрузилось там или еще что-то), и есть еще одна странная проблема, при перевороте экрана перестает играть. Тоже хочется это исправить.

Вот мой код:

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
import java.io.IOException;
 
import android.app.Activity;
import android.media.AudioManager;
import android.media.MediaPlayer;
import android.media.MediaPlayer.OnCompletionListener;
import android.media.MediaPlayer.OnPreparedListener;
import android.os.Bundle;
import android.view.View;
 
 
public class MainActivity extends Activity implements OnPreparedListener,
        OnCompletionListener {
 
 
    final String DATA_STREAM = "http://server:port/radio_mount";
 
    MediaPlayer mediaPlayer;
    AudioManager am;
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        am = (AudioManager) getSystemService(AUDIO_SERVICE);
    }
 
    public void onClickStart(View view) {
        releaseMP();
 
        try {
            switch (view.getId()) {
                case R.id.btnStartStream:
                    mediaPlayer = new MediaPlayer();
                    mediaPlayer.setDataSource(DATA_STREAM);
                    mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
                    mediaPlayer.setOnPreparedListener(this);
                    mediaPlayer.prepareAsync();
                    break;
            }
 
        } catch (IOException e) {
            e.printStackTrace();
        }
        if (mediaPlayer == null)
            return;
 
        mediaPlayer.setOnCompletionListener(this);
    }
 
    private void releaseMP() {
        if (mediaPlayer != null) {
            try {
                mediaPlayer.release();
                mediaPlayer = null;
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
 
    public void onClick(View view) {
        if (mediaPlayer == null)
            return;
        switch (view.getId()) {
            case R.id.btnStop:
                mediaPlayer.stop();
                releaseMP();
                break;
        }
    }
 
    @Override
    public void onPrepared(MediaPlayer mp) {
        mp.start();
    }
 
    @Override
    public void onCompletion(MediaPlayer mp) {
    }
 
    @Override
    protected void onDestroy() {
        super.onDestroy();
        releaseMP();
    }
}
Огромное спасибо!
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
16.12.2015, 19:26
Ответы с готовыми решениями:

При нажатии на первую кнопку открывать проигрыватель музыки, а на вторую - проигрыватель видео
Как сделать что бы при нажатии на первую кнопку открывался проигрыватель музыки а на вторую...

потоковый ввод
всем привет! ситуация такая: при выполнении считываются только R2 и h, не могу понять, в чем...

потоковый звук
есть вопрос,надеюсь на вашу помощ! хочу написать прогу(проигрователь),которая подсоединяется к...

Потоковый итератор
Добрый день. Читаю книгу Объектно-ориентированное программирование в С++ Лафоре, там приводится...

32
2883 / 2295 / 769
Регистрация: 12.05.2014
Сообщений: 7,978
16.12.2015, 19:34 2
Лучший ответ Сообщение было отмечено Stass48 как решение

Решение

ну начнем с малого
что бы при повороте не переставало играть (то есть не пересоздавалось активити) надо в манифест дописать строку (между тегами activity)
XML
1
            android:configChanges="orientation|screenSize"
1
22 / 22 / 7
Регистрация: 26.05.2011
Сообщений: 256
16.12.2015, 19:45  [ТС] 3
Спасибо)
Вроде мелочь, а приятно)
А вот как отследить сбой в трансляции?
Когда вот выдергиваю кабель с транслирующего ноута, то в логкате проскакивает варнинг 703, кажется...
Ну это я просто сказал, может есть какие-то другие методы отслеживания сбоев?
0
411 / 275 / 22
Регистрация: 18.09.2010
Сообщений: 1,114
17.12.2015, 01:47 4
Повесьте ексепшен на то место где указывает что произошла ошибка, и впишите в кетче старт новоего плеера, и будет по циклу гонять пока не запустится. Правда я не знаю какой у вас ексепшен и где, нужен лог.
0
22 / 22 / 7
Регистрация: 26.05.2011
Сообщений: 256
17.12.2015, 12:21  [ТС] 5
Вот у человека тоже проблема была, только на 4PDA и вот что ему посоветовали:
Но, как происходит у меня, я отрубаю инет, приложение через несколько секунд перестает играть, показывается четыре строчки в логах
12-25 05:53:02.614: W/MediaPlayer(945): info/warning (703, 0)
12-25 05:53:02.614: W/MediaPlayer(945): info/warning (701, 0)
если mediaplayer шлет вам сообщения в лог , то , очевидно , их можно перехватить каким то методом mediaplayer и обработать .
предупреждение "info/warning (701, 0)" - MEDIA_INFO_BUFFERING_START , 702 - MEDIA_INFO_BUFFERING_END ,703 -MEDIA_INFO_NETWORK_BANDWIDTH , так что отлавливать его надо в MediaPlayer.OnInfoListener

то есть при появлении кода 703 (701) вам надо тормозить свое радио ( желательно сказав пользователю , что поток прекратился) до лучших времен (появления кода 702 - буфер заполнился , можно запускать пластинку). А крашиться оно потом у вас уже от того , что данные не поступают , а он их пытается обработать - то есть остановив по 703 воспроизведение , крашиться у вас не должно , хотя на null все же лучше проверять , во избежании недоразумений , как и советовали ранее
Подскажите мне, как это все грамотно реализовать в коде? С Java второй день только дело имею, до этого, только vb.net
0
2883 / 2295 / 769
Регистрация: 12.05.2014
Сообщений: 7,978
17.12.2015, 12:24 6
очередной "напишите за меня, а то я второй день, до этого работал слесарем"
0
22 / 22 / 7
Регистрация: 26.05.2011
Сообщений: 256
17.12.2015, 12:30  [ТС] 7
Паблито, вполне верное замечание, но в отличии от остальных, я сам нашел инфо о том, что именно требуется сделать... Ну и как бы, конкретно писать я не заставляю, хотя бы скажите и ткните где можно посмотреть как правильно (синтаксис). На Java вообще другая логика, больше схожа с C# и мало чем схожа с C++, VB или Delphi, а прога нужна именно под Андроид, а на нем только Java, жизнь заставила полезть туда, где ни бум-бум... Уж простите(
0
2883 / 2295 / 769
Регистрация: 12.05.2014
Сообщений: 7,978
17.12.2015, 12:42 8
Цитата Сообщение от Stass48 Посмотреть сообщение
Подскажите мне, как это все грамотно реализовать в коде?
как один из вариантов - у медиа плеера есть слушатель ошибок, надо решить для себя кто будет обрабатывать ошибки? Предположим кода не много и это можно реализовать в активити, тогда
Java
1
public class MainActivity extends AppCompatActivity implements MediaPlayer.OnErrorListener
и IDE предложит реализовать метод
Java
1
2
3
4
@Override
    public boolean onError(MediaPlayer mp, int what, int extra) {
        return false;
    }
что бы это все заработало надо намекнуть плееру кто будет ловить его ошибки, где-то там в активити где создается MediaPlayer пишем
Java
1
        player.setOnErrorListener(this);
ну и в методе onError смотрим какие коды выдает на то или иную ситуацию
1
22 / 22 / 7
Регистрация: 26.05.2011
Сообщений: 256
17.12.2015, 13:41  [ТС] 9
в методе onError смотрим какие коды выдает на то или иную ситуацию
Прошу прощения за нубский вопрос, но где это посмотреть?
Конкретно в логкат никаких error нету, зато есть warnings:

Цитата Сообщение от Stass48 Посмотреть сообщение
12-25 05:53:02.614: W/MediaPlayer(945): info/warning (703, 0)
12-25 05:53:02.614: W/MediaPlayer(945): info/warning (701, 0)
Вот их мне и нужно обработать. А я не умею(

Добавлено через 7 минут
Да и Вы уверены, что нужно именно OnErrorListener? Судя по информации отсюда, то мне нужно поймать варнинги именно из OnInfoListener. Хотя, конечно, Ваш вариант логичнее... да и судя по описалову там слова более подходящие.. Но вот в лог то не эти коды сыпятся, а именно 701 и 703.
0
2883 / 2295 / 769
Регистрация: 12.05.2014
Сообщений: 7,978
17.12.2015, 13:45 10
конечно не уверен, проверять то не на чем
0
22 / 22 / 7
Регистрация: 26.05.2011
Сообщений: 256
17.12.2015, 14:02  [ТС] 11
Ну хорошо, а как написать так, чтобы при появлении варнинга 703 и/или 701 я мог бы выполнить свое любое действие? То есть сам синтаксис и сам код как написать? Ну, то, что делал для OnErrorListener, переделать под OnInfoListener, а что дальше?

Добавлено через 1 минуту
Я просто не понимаю как написать код для отлова именно 703 и 701. Так бы в этом коде я бы просто переинициализировал плеер и все...
0
2883 / 2295 / 769
Регистрация: 12.05.2014
Сообщений: 7,978
17.12.2015, 14:07 12
можно создать метод который нужно, поставить на него курсор и нажать Ctrl+Q и почитать какие параметры в него прилетают и что он делает, там же можно посмотреть какие коды у сообщений

это если забанен на гугле
0
435 / 101 / 15
Регистрация: 21.02.2015
Сообщений: 845
17.12.2015, 14:29 13
есть еще
onInfo(MediaPlayer mp, int what, int extra)
он может ловить
MEDIA_INFO_NETWORK_BANDWIDTH (703)
http://developer.android.com/i... ,%20int%29

и другие две инфо
0
Pablito
17.12.2015, 14:31
  #14

Не по теме:

так он про него и говорит

0
435 / 101 / 15
Регистрация: 21.02.2015
Сообщений: 845
17.12.2015, 14:35 15
Лучший ответ Сообщение было отмечено Stass48 как решение

Решение

Java
1
2
3
4
5
public boolean onInfo(MediaPlayer mp, int what, int extra) {
                    if (what == MediaPlayer.MEDIA_INFO_BUFFERING_END){
                        //поймали инфо end
                        return true;
                    }
...
1
22 / 22 / 7
Регистрация: 26.05.2011
Сообщений: 256
18.12.2015, 11:44  [ТС] 16
О, ну конечно...
Когда я сам уже вот здесь эти "концы" подхода нашел, то человек и ответил по сути то же самое, что я и нашел...
Вот просто гражданину Паблито, было тяжело написать как правильно if написать, точнее его содержимое...
Valakin, спасибо огромное.

Добавлено через 20 часов 52 минуты
Цитата Сообщение от Valakin Посмотреть сообщение
он может ловить
MEDIA_INFO_NETWORK_BANDWIDTH (703)
Простите, а вот как раз это ловится как-то по-другому, там даже в мануале оно как-то по-другому выделено...
Не подскажите как правильно словить эту ошибку?
0
435 / 101 / 15
Регистрация: 21.02.2015
Сообщений: 845
18.12.2015, 11:58 17
Лучший ответ Сообщение было отмечено Stass48 как решение

Решение

Я бы попробовал
Java
1
2
3
4
if (what == MEDIA_INFO_NETWORK_BANDWIDTH & extra==703){
                        //поймали инфо BANDWIDTH 
                        return true;
                    }
1
22 / 22 / 7
Регистрация: 26.05.2011
Сообщений: 256
18.12.2015, 13:34  [ТС] 18
И еще мелкий вопросик такой. Вы возвращаете true, а вот среда по умолчанию когда создает код, то возвращает false. На что это влияет?

Цитата Сообщение от Valakin Посмотреть сообщение
return true;
Добавлено через 6 минут
MEDIA_INFO_NETWORK_BANDWIDTH
подсвечивает красным

Добавлено через 8 минут
Java
1
2
3
4
if (extra==703){
                        //поймали инфо BANDWIDTH 
                        return true;
         }
А если так, то вообще не ловит ничего, хотя в логе проскакивает она.
0
435 / 101 / 15
Регистрация: 21.02.2015
Сообщений: 845
18.12.2015, 13:45 19
а
MediaPlayer.MEDIA_INFO_NETWORK_BANDWIDTH
подсвечивает?
extra<703 было бы логичнее, или вообще для начала не трогать extra,
похоже ее можно определить только если
what == MediaPlayer.MEDIA_INFO_NETWORK_BANDWIDTH
0
22 / 22 / 7
Регистрация: 26.05.2011
Сообщений: 256
18.12.2015, 14:00  [ТС] 20
Уже все хорошо)
Нашел пример. Надо так:

Вверху объявить:
Java
1
public static final int MEDIA_INFO_NETWORK_BANDWIDTH = 703;
Ну и код такой:
Java
1
2
3
4
5
6
7
8
9
10
11
12
@Override
    public boolean onInfo(MediaPlayer mp, int what, int extra) {
        switch (what) {
            case MEDIA_INFO_NETWORK_BANDWIDTH:
                lblStateText.setText("Ошибка соединения! Переподключение...");
                break;
            case MediaPlayer.MEDIA_INFO_BUFFERING_START:
 
                break;
        }
        return true;
    }
Текст в метку по крайней мере выводится)

Скажите пожалуйста, что за непонятка что среда предлагает возвращать False, а Вы и в примерах тоже возвращаете True?
0
18.12.2015, 14:00
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
18.12.2015, 14:00
Помогаю со студенческими работами здесь

Потоковый сервер на С++
Добрый день. Стала задача написать сервер на плюсах (под линукс). Признаться, данный язык только...

Потоковый вывод
string str; ifstream fin(filename += &quot;.txt&quot;); fin&gt;&gt;str; cout&lt;&lt;str; В чем беда, если в строке...

Потоковый сервер на С++
Добрый день. Стала задача написать сервер на плюсах (под линукс). Признаться, данный язык только...

ПОТОКОВЫЙ ФАЙЛ
Здравствуйте! Скажите пожалуйста.... 1)применяют ли в с++ ПОТОКОВЫЙ ФАЙЛ ? 2) и что это такое...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru