Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

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

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

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

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

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

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

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

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

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

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

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

это если забанен на гугле
0
Valakin
431 / 97 / 15
Регистрация: 21.02.2015
Сообщений: 731
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

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

Не по теме:

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

0
Valakin
431 / 97 / 15
Регистрация: 21.02.2015
Сообщений: 731
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;
                    }
...
1
17.12.2015, 14:35
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.12.2015, 14:35
Привет! Вот еще темы с ответами:

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

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

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

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


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

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

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