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

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

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

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

16.12.2015, 19:26. Просмотров 1389. Ответов 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
Stass48
20 / 20 / 6
Регистрация: 26.05.2011
Сообщений: 234
18.12.2015, 11:44  [ТС] #16
О, ну конечно...
Когда я сам уже вот здесь эти "концы" подхода нашел, то человек и ответил по сути то же самое, что я и нашел...
Вот просто гражданину Паблито, было тяжело написать как правильно if написать, точнее его содержимое...
Valakin, спасибо огромное.

Добавлено через 20 часов 52 минуты
Цитата Сообщение от Valakin Посмотреть сообщение
он может ловить
MEDIA_INFO_NETWORK_BANDWIDTH (703)
Простите, а вот как раз это ловится как-то по-другому, там даже в мануале оно как-то по-другому выделено...
Не подскажите как правильно словить эту ошибку?
0
Valakin
431 / 97 / 15
Регистрация: 21.02.2015
Сообщений: 731
18.12.2015, 11:58 #17
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Я бы попробовал
Java
1
2
3
4
if (what == MEDIA_INFO_NETWORK_BANDWIDTH & extra==703){
                        //поймали инфо BANDWIDTH 
                        return true;
                    }
1
Stass48
20 / 20 / 6
Регистрация: 26.05.2011
Сообщений: 234
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
Valakin
431 / 97 / 15
Регистрация: 21.02.2015
Сообщений: 731
18.12.2015, 13:45 #19
а
MediaPlayer.MEDIA_INFO_NETWORK_BANDWIDTH
подсвечивает?
extra<703 было бы логичнее, или вообще для начала не трогать extra,
похоже ее можно определить только если
what == MediaPlayer.MEDIA_INFO_NETWORK_BANDWIDTH
0
Stass48
20 / 20 / 6
Регистрация: 26.05.2011
Сообщений: 234
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
Valakin
431 / 97 / 15
Регистрация: 21.02.2015
Сообщений: 731
18.12.2015, 14:49 #21
если больше не будешь обрабатывать info то без разницы что возвращать (true or false), можно легко поэкспериментировать
1
Stass48
20 / 20 / 6
Регистрация: 26.05.2011
Сообщений: 234
21.12.2015, 16:26  [ТС] #22
Столкнулся с еще одной ошибкой, точнее проблемой, причем это далеко не только у меня (судя по гуглу). Пути решения не нашел.
Ни с того, ни с сего вырубается воспроизведение, хотя событие OnPrepared в котором делаю старт плеера - выполняется.
Все это типа так:

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
    public void onClick(View view) {
        switch (view.getId()) {
            case R.id.btnStartStream:
                lblStateText.setText("Подключение к серверу...");
                try {
                    mediaPlayer = new MediaPlayer();
                    mediaPlayer.setOnErrorListener(this);
                    mediaPlayer.setOnInfoListener(this);
                    mediaPlayer.setDataSource(DATA_STREAM);
                    mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
                    mediaPlayer.setOnPreparedListener(this);
                    mediaPlayer.setWakeMode(getApplicationContext(), PowerManager.PARTIAL_WAKE_LOCK);
                    mediaPlayer.prepareAsync();
                } catch (IOException e) {
                    e.printStackTrace();
                }
                mediaPlayer.setOnCompletionListener(this);
                btnStartStream.setEnabled(false);
                btnStop.setEnabled(true);
                break;
            case R.id.btnStop:
                mediaPlayer.stop();
                releaseMP();
                lblStateText.setText("Остановлено!");
                btnStartStream.setEnabled(true);
                btnStop.setEnabled(false);
                break;
        }
    }
 
    @Override
    public void onPrepared(MediaPlayer mp) {
        mp.start();
        lblStateText.setText("Воспроизведение :)");
    }
Начал копать проблему, установил CatLog, фильтром отфильтровал нужное и вот проблема проявилась: (см. вложение)
Погуглив код ошибки пришел к выводу, что происходит WakeLock медиаплеера. Решил все же убедиться, установил Wakelock Detector Free, он обнаружил wakelock именно на медиаплеере в нужный момент.
Вопрос: Как бороться?
Как видно у меня по коду, строка:
Java
1
mediaPlayer.setWakeMode(getApplicationContext(), PowerManager.PARTIAL_WAKE_LOCK);
присутствует, но мало чем помогает или я что-то не так делаю?
0
Миниатюры
Потоковый проигрыватель  
Stass48
20 / 20 / 6
Регистрация: 26.05.2011
Сообщений: 234
21.12.2015, 18:23  [ТС] #23
Неужели никто не поможет? Мозги уже пухнут весь день(((
0
Stass48
20 / 20 / 6
Регистрация: 26.05.2011
Сообщений: 234
21.12.2015, 21:35  [ТС] #24
Блин, дело может быть и не в wakelock... Хотя может быть у вас будут другие варианты?
В лог ничего конкретного не пишет, никаких конкретных кодов и ошибок нет...
После сбоя по коду 701 и 703, я перезапускаю полностью плеер и воспроизведение начинает возобновляться, но иногда не возобновляется! То есть после команд:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
lblStateText.setText("Подключение к серверу...");
                try {
                    mediaPlayer = new MediaPlayer();
                    mediaPlayer.setOnErrorListener(this);
                    mediaPlayer.setOnInfoListener(this);
                    mediaPlayer.setDataSource(DATA_STREAM);
                    mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
                    mediaPlayer.setOnPreparedListener(this);
                    mediaPlayer.setWakeMode(getApplicationContext(), PowerManager.PARTIAL_WAKE_LOCK);
                    mediaPlayer.prepareAsync();
                } catch (IOException e) {
                    e.printStackTrace();
                }
                mediaPlayer.setOnCompletionListener(this);
                btnStartStream.setEnabled(false);
                btnStop.setEnabled(true);
и
Java
1
2
mp.start();
        lblStateText.setText("Воспроизведение :)");
оно может не заиграть!
При этом в лог постоянно и циклически пишется одно и то же: (см вложение)
При этом, интернет-трафик совершенно не расходуется! Как отловить такое состояние? Перепробовал уже много чего! Это же определенно какой-то сбой в подключении, но как его отловить, если в логе то толком ничего конкретного, за что лично я бы смог зацепиться...
Очень сильно нужна ваша помощь, помогите разобраться!
Огромное спасибо!
0
Миниатюры
Потоковый проигрыватель  
Stass48
20 / 20 / 6
Регистрация: 26.05.2011
Сообщений: 234
22.12.2015, 11:17  [ТС] #25
Люди добрые, ну хоть кто-нибудь! Что делать? Неужели нет вообще никаких идей как сделать радио-плеер, который бы просто сам переподключался в случае сбоя? Или просто никто помочь не хочет?
0
Pablito
2525 / 2004 / 624
Регистрация: 12.05.2014
Сообщений: 7,030
Завершенные тесты: 1
22.12.2015, 11:41 #26
второе
0
Spelcrawler
527 / 497 / 111
Регистрация: 12.03.2014
Сообщений: 1,654
Завершенные тесты: 1
22.12.2015, 11:48 #27
Stass48, я бы для начала запускал плеер из сервиса и держал всегда уведомление (не помню точно как его зовут, но все плееры его используют - висит всегда вверху, не закрывается и не дает убить приложение, которое его отображает). Ну а дальше остаются ошибки с сетью на них точно колбеки есть.
1
Stass48
20 / 20 / 6
Регистрация: 26.05.2011
Сообщений: 234
22.12.2015, 20:52  [ТС] #28
Паблито, ну, раз так говорите, значит определенно что-то знаете. Ну так озвучьте же! Не я первый, не я последний кому это может понадобиться.
Spelcrawler, пробую сделать сервис, есть в чем разбираться и что изучать, спасибо.

Добавлено через 8 часов 22 минуты
Spelcrawler, сервис не решает проблему.
Ссылка на лог https://www.dropbox.com/s/f6a4li7t7lmjubw/LogCat.txt?dl=0

Программа успешно обрабатывает ошибки 701, 703, -1004 и простую остановку воспроизведения по OnCompletion, но проблема, по всей видимости, не входит в список этих ошибок...
0
Spelcrawler
527 / 497 / 111
Регистрация: 12.03.2014
Сообщений: 1,654
Завершенные тесты: 1
22.12.2015, 20:53 #29
Цитата Сообщение от Spelcrawler Посмотреть сообщение
и держал всегда уведомление
Вот это тоже нужно сделать.
0
Pablito
2525 / 2004 / 624
Регистрация: 12.05.2014
Сообщений: 7,030
Завершенные тесты: 1
22.12.2015, 21:00 #30
это не ошибки, а просто какие-то строки
а реализованы оба интерфейса - onError и onInfo ?
я бы реализовал оба и во всех тамошних методах поставил вывод сообщений в лог
а если что-то выведет - в том методе дальше и копать

и я не создавал никогда плееров, меня aimp устраивает вполне, все что я пишу - просто интуитивные предположения
0
22.12.2015, 21:00
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.12.2015, 21:00
Привет! Вот еще темы с ответами:

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

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

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

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


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

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

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