Форум программистов, компьютерный форум CyberForum.ru

Программирование Android

Войти
Регистрация
Восстановить пароль
 
 
Stass48
20 / 20 / 6
Регистрация: 26.05.2011
Сообщений: 227
#1

Потоковый проигрыватель - Программирование Android

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

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

Вот мой код:

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();
    }
}
Огромное спасибо!
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.12.2015, 19:26     Потоковый проигрыватель
Посмотрите здесь:

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

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

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

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

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

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

потоковый ввод - C++
всем привет! ситуация такая: при выполнении считываются только R2 и h, не могу понять, в чем дело. dev-c++ просто выдает "step t =...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Pablito
2410 / 1855 / 581
Регистрация: 12.05.2014
Сообщений: 6,591
Завершенные тесты: 1
16.12.2015, 19:34     Потоковый проигрыватель #2
Сообщение было отмечено автором темы, экспертом или модератором как ответ
ну начнем с малого
что бы при повороте не переставало играть (то есть не пересоздавалось активити) надо в манифест дописать строку (между тегами activity)
XML
1
            android:configChanges="orientation|screenSize"
Stass48
20 / 20 / 6
Регистрация: 26.05.2011
Сообщений: 227
16.12.2015, 19:45  [ТС]     Потоковый проигрыватель #3
Спасибо)
Вроде мелочь, а приятно)
А вот как отследить сбой в трансляции?
Когда вот выдергиваю кабель с транслирующего ноута, то в логкате проскакивает варнинг 703, кажется...
Ну это я просто сказал, может есть какие-то другие методы отслеживания сбоев?
dajver
407 / 271 / 18
Регистрация: 18.09.2010
Сообщений: 1,106
17.12.2015, 01:47     Потоковый проигрыватель #4
Повесьте ексепшен на то место где указывает что произошла ошибка, и впишите в кетче старт новоего плеера, и будет по циклу гонять пока не запустится. Правда я не знаю какой у вас ексепшен и где, нужен лог.
Stass48
20 / 20 / 6
Регистрация: 26.05.2011
Сообщений: 227
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
Pablito
2410 / 1855 / 581
Регистрация: 12.05.2014
Сообщений: 6,591
Завершенные тесты: 1
17.12.2015, 12:24     Потоковый проигрыватель #6
очередной "напишите за меня, а то я второй день, до этого работал слесарем"
Stass48
20 / 20 / 6
Регистрация: 26.05.2011
Сообщений: 227
17.12.2015, 12:30  [ТС]     Потоковый проигрыватель #7
Паблито, вполне верное замечание, но в отличии от остальных, я сам нашел инфо о том, что именно требуется сделать... Ну и как бы, конкретно писать я не заставляю, хотя бы скажите и ткните где можно посмотреть как правильно (синтаксис). На Java вообще другая логика, больше схожа с C# и мало чем схожа с C++, VB или Delphi, а прога нужна именно под Андроид, а на нем только Java, жизнь заставила полезть туда, где ни бум-бум... Уж простите(
Pablito
2410 / 1855 / 581
Регистрация: 12.05.2014
Сообщений: 6,591
Завершенные тесты: 1
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 смотрим какие коды выдает на то или иную ситуацию
Stass48
20 / 20 / 6
Регистрация: 26.05.2011
Сообщений: 227
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.
Pablito
2410 / 1855 / 581
Регистрация: 12.05.2014
Сообщений: 6,591
Завершенные тесты: 1
17.12.2015, 13:45     Потоковый проигрыватель #10
конечно не уверен, проверять то не на чем
Stass48
20 / 20 / 6
Регистрация: 26.05.2011
Сообщений: 227
17.12.2015, 14:02  [ТС]     Потоковый проигрыватель #11
Ну хорошо, а как написать так, чтобы при появлении варнинга 703 и/или 701 я мог бы выполнить свое любое действие? То есть сам синтаксис и сам код как написать? Ну, то, что делал для OnErrorListener, переделать под OnInfoListener, а что дальше?

Добавлено через 1 минуту
Я просто не понимаю как написать код для отлова именно 703 и 701. Так бы в этом коде я бы просто переинициализировал плеер и все...
Pablito
2410 / 1855 / 581
Регистрация: 12.05.2014
Сообщений: 6,591
Завершенные тесты: 1
17.12.2015, 14:07     Потоковый проигрыватель #12
можно создать метод который нужно, поставить на него курсор и нажать Ctrl+Q и почитать какие параметры в него прилетают и что он делает, там же можно посмотреть какие коды у сообщений

это если забанен на гугле
Valakin
430 / 96 / 15
Регистрация: 21.02.2015
Сообщений: 729
17.12.2015, 14:29     Потоковый проигрыватель #13
есть еще
onInfo(MediaPlayer mp, int what, int extra)
он может ловить
MEDIA_INFO_NETWORK_BANDWIDTH (703)
http://developer.android.com/intl/ru...0int,%20int%29

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

Не по теме:

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

Valakin
430 / 96 / 15
Регистрация: 21.02.2015
Сообщений: 729
17.12.2015, 14:35     Потоковый проигрыватель #15
Сообщение было отмечено автором темы, экспертом или модератором как ответ
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;
                    }
...
Stass48
20 / 20 / 6
Регистрация: 26.05.2011
Сообщений: 227
18.12.2015, 11:44  [ТС]     Потоковый проигрыватель #16
О, ну конечно...
Когда я сам уже вот здесь эти "концы" подхода нашел, то человек и ответил по сути то же самое, что я и нашел...
Вот просто гражданину Паблито, было тяжело написать как правильно if написать, точнее его содержимое...
Valakin, спасибо огромное.

Добавлено через 20 часов 52 минуты
Цитата Сообщение от Valakin Посмотреть сообщение
он может ловить
MEDIA_INFO_NETWORK_BANDWIDTH (703)
Простите, а вот как раз это ловится как-то по-другому, там даже в мануале оно как-то по-другому выделено...
Не подскажите как правильно словить эту ошибку?
Valakin
430 / 96 / 15
Регистрация: 21.02.2015
Сообщений: 729
18.12.2015, 11:58     Потоковый проигрыватель #17
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Я бы попробовал
Java
1
2
3
4
if (what == MEDIA_INFO_NETWORK_BANDWIDTH & extra==703){
                        //поймали инфо BANDWIDTH 
                        return true;
                    }
Stass48
20 / 20 / 6
Регистрация: 26.05.2011
Сообщений: 227
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;
         }
А если так, то вообще не ловит ничего, хотя в логе проскакивает она.
Valakin
430 / 96 / 15
Регистрация: 21.02.2015
Сообщений: 729
18.12.2015, 13:45     Потоковый проигрыватель #19
а
MediaPlayer.MEDIA_INFO_NETWORK_BANDWIDTH
подсвечивает?
extra<703 было бы логичнее, или вообще для начала не трогать extra,
похоже ее можно определить только если
what == MediaPlayer.MEDIA_INFO_NETWORK_BANDWIDTH
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.12.2015, 14:00     Потоковый проигрыватель
Еще ссылки по теме:

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

Потоковый ввод-вывод - C++
Написать программу, которая будет добавлять в текстовый файл введенную с клавиатуры информацию Следует предусмотреть возможность выбора...

Потоковый тип контейнера - C#
Такой вопрос, мне для курсовой нужно использовать потоковый тип контейнера для хранения данных, что это такое вооьще и как его задать?

Потоковый ввод из файла - C++
Такой вопрос. Считываю данные из текстового файла с помощью потоков и записываю их в двусвязный список. В файле данных для 4 элементов...

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


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

Или воспользуйтесь поиском по форуму:
Stass48
20 / 20 / 6
Регистрация: 26.05.2011
Сообщений: 227
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?
Yandex
Объявления
18.12.2015, 14:00     Потоковый проигрыватель
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru