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

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

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

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

16.12.2015, 19:26. Просмотров 1161. Ответов 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 =...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Valakin
430 / 96 / 15
Регистрация: 21.02.2015
Сообщений: 729
18.12.2015, 14:49     Потоковый проигрыватель #21
если больше не будешь обрабатывать info то без разницы что возвращать (true or false), можно легко поэкспериментировать
Stass48
20 / 20 / 6
Регистрация: 26.05.2011
Сообщений: 227
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);
присутствует, но мало чем помогает или я что-то не так делаю?
Миниатюры
Потоковый проигрыватель  
Stass48
20 / 20 / 6
Регистрация: 26.05.2011
Сообщений: 227
21.12.2015, 18:23  [ТС]     Потоковый проигрыватель #23
Неужели никто не поможет? Мозги уже пухнут весь день(((
Stass48
20 / 20 / 6
Регистрация: 26.05.2011
Сообщений: 227
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("Воспроизведение :)");
оно может не заиграть!
При этом в лог постоянно и циклически пишется одно и то же: (см вложение)
При этом, интернет-трафик совершенно не расходуется! Как отловить такое состояние? Перепробовал уже много чего! Это же определенно какой-то сбой в подключении, но как его отловить, если в логе то толком ничего конкретного, за что лично я бы смог зацепиться...
Очень сильно нужна ваша помощь, помогите разобраться!
Огромное спасибо!
Миниатюры
Потоковый проигрыватель  
Stass48
20 / 20 / 6
Регистрация: 26.05.2011
Сообщений: 227
22.12.2015, 11:17  [ТС]     Потоковый проигрыватель #25
Люди добрые, ну хоть кто-нибудь! Что делать? Неужели нет вообще никаких идей как сделать радио-плеер, который бы просто сам переподключался в случае сбоя? Или просто никто помочь не хочет?
Pablito
2419 / 1864 / 583
Регистрация: 12.05.2014
Сообщений: 6,604
Завершенные тесты: 1
22.12.2015, 11:41     Потоковый проигрыватель #26
второе
Spelcrawler
526 / 496 / 111
Регистрация: 12.03.2014
Сообщений: 1,648
Завершенные тесты: 1
22.12.2015, 11:48     Потоковый проигрыватель #27
Stass48, я бы для начала запускал плеер из сервиса и держал всегда уведомление (не помню точно как его зовут, но все плееры его используют - висит всегда вверху, не закрывается и не дает убить приложение, которое его отображает). Ну а дальше остаются ошибки с сетью на них точно колбеки есть.
Stass48
20 / 20 / 6
Регистрация: 26.05.2011
Сообщений: 227
22.12.2015, 20:52  [ТС]     Потоковый проигрыватель #28
Паблито, ну, раз так говорите, значит определенно что-то знаете. Ну так озвучьте же! Не я первый, не я последний кому это может понадобиться.
Spelcrawler, пробую сделать сервис, есть в чем разбираться и что изучать, спасибо.

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

Программа успешно обрабатывает ошибки 701, 703, -1004 и простую остановку воспроизведения по OnCompletion, но проблема, по всей видимости, не входит в список этих ошибок...
Spelcrawler
526 / 496 / 111
Регистрация: 12.03.2014
Сообщений: 1,648
Завершенные тесты: 1
22.12.2015, 20:53     Потоковый проигрыватель #29
Цитата Сообщение от Spelcrawler Посмотреть сообщение
и держал всегда уведомление
Вот это тоже нужно сделать.
Pablito
2419 / 1864 / 583
Регистрация: 12.05.2014
Сообщений: 6,604
Завершенные тесты: 1
22.12.2015, 21:00     Потоковый проигрыватель #30
это не ошибки, а просто какие-то строки
а реализованы оба интерфейса - onError и onInfo ?
я бы реализовал оба и во всех тамошних методах поставил вывод сообщений в лог
а если что-то выведет - в том методе дальше и копать

и я не создавал никогда плееров, меня aimp устраивает вполне, все что я пишу - просто интуитивные предположения
Stass48
20 / 20 / 6
Регистрация: 26.05.2011
Сообщений: 227
22.12.2015, 23:35  [ТС]     Потоковый проигрыватель #31
Spelcrawler, это называется Foreground Service и тоже реализовано.
Вот код MyService.java:

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
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
import android.app.Notification;
import android.app.PendingIntent;
import android.app.Service;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.IBinder;
import android.support.v7.app.NotificationCompat;
 
import android.os.PowerManager;
import android.media.AudioManager;
import android.media.MediaPlayer;
import android.media.MediaPlayer.OnCompletionListener;
import android.media.MediaPlayer.OnPreparedListener;
import android.media.MediaPlayer.OnErrorListener;
import android.media.MediaPlayer.OnInfoListener;
import android.widget.Toast;
 
import java.io.IOException;
 
public class MyService extends Service implements OnPreparedListener,
        OnCompletionListener, OnErrorListener, OnInfoListener {
 
    final String DATA_STREAM = "http://some.server.com/radio_mount";
    public static final int MEDIA_INFO_NETWORK_BANDWIDTH = 703;
 
    MediaPlayer mediaPlayer;
    AudioManager am;
    PowerManager pm;
 
    @Override
    public void onCreate() {
        super.onCreate();
        am = (AudioManager) getSystemService(AUDIO_SERVICE);
    }
 
    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        if (intent.getAction().equals(Constants.ACTION.STARTFOREGROUND_ACTION)) {
            Intent notificationIntent = new Intent(this, MainActivity.class);
            notificationIntent.setAction(Constants.ACTION.MAIN_ACTION);
            notificationIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK
                    | Intent.FLAG_ACTIVITY_CLEAR_TASK);
            PendingIntent pendingIntent = PendingIntent.getActivity(this, 0,
                    notificationIntent, 0);
 
            Intent previousIntent = new Intent(this, MyService.class);
            previousIntent.setAction(Constants.ACTION.PREV_ACTION);
            PendingIntent ppreviousIntent = PendingIntent.getService(this, 0,
                    previousIntent, 0);
 
            Intent playIntent = new Intent(this, MyService.class);
            playIntent.setAction(Constants.ACTION.PLAY_ACTION);
            PendingIntent pplayIntent = PendingIntent.getService(this, 0,
                    playIntent, 0);
 
            Intent nextIntent = new Intent(this, MyService.class);
            nextIntent.setAction(Constants.ACTION.NEXT_ACTION);
            PendingIntent pnextIntent = PendingIntent.getService(this, 0,
                    nextIntent, 0);
 
            Bitmap icon = BitmapFactory.decodeResource(getResources(),
                    R.mipmap.ic_launcher);
 
            Notification notification = new NotificationCompat.Builder(this)
                    .setContentTitle("Stream Player")
                    .setTicker("Stream Player")
                    .setContentText("Radio")
                    .setSmallIcon(R.mipmap.ic_launcher)
                    .setLargeIcon(
                            Bitmap.createScaledBitmap(icon, 128, 128, false))
                    .setContentIntent(pendingIntent)
                    .setOngoing(true)
                    .addAction(android.R.drawable.ic_media_previous,
                            "Previous", ppreviousIntent)
                    .addAction(android.R.drawable.ic_media_play, "Play",
                            pplayIntent)
                    .addAction(android.R.drawable.ic_media_next, "Next",
                            pnextIntent).build();
            startForeground(Constants.NOTIFICATION_ID.FOREGROUND_SERVICE,
                    notification);
            releaseMP();
            try {
                mediaPlayer = new MediaPlayer();
                mediaPlayer.setOnErrorListener(this);
                mediaPlayer.setOnInfoListener(this);
                mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
                mediaPlayer.setDataSource(DATA_STREAM);
                mediaPlayer.setOnPreparedListener(this);
                mediaPlayer.setWakeMode(getApplicationContext(), PowerManager.PARTIAL_WAKE_LOCK);
                mediaPlayer.prepareAsync();
                Toast.makeText(this, "Подключаемся...",
                        Toast.LENGTH_SHORT).show();
            } catch (IOException e) {
                e.printStackTrace();
            }
            mediaPlayer.setOnCompletionListener(this);
 
        } else if (intent.getAction().equals(Constants.ACTION.PREV_ACTION)) {
 
        } else if (intent.getAction().equals(Constants.ACTION.PLAY_ACTION)) {
 
        } else if (intent.getAction().equals(Constants.ACTION.NEXT_ACTION)) {
 
        } else if (intent.getAction().equals(
                Constants.ACTION.STOPFOREGROUND_ACTION)) {
 
            stopForeground(true);
            stopSelf();
        }
        return START_STICKY;
    }
 
    @Override
    public void onDestroy() {
        super.onDestroy();
        releaseMP();
    }
 
    @Override
    public IBinder onBind(Intent intent) {
        // Used only in case of bound services.
        return null;
    }
 
    @Override
    public void onCompletion(MediaPlayer mp) {
 
        Toast.makeText(this, "Поток был закрыт! Переподключение...",
                Toast.LENGTH_SHORT).show();
        restartMediaPlayer();
    }
 
    @Override
    public boolean onError(MediaPlayer mp, int what, int extra) {
        switch (extra) {
            case MediaPlayer.MEDIA_ERROR_IO:
                Toast.makeText(this, "Ошибка: -1004. Сервер недоступен! Переподключение...",
                        Toast.LENGTH_SHORT).show();
                restartMediaPlayer();
                break;
        }
        return true;
    }
 
    @Override
    public boolean onInfo(MediaPlayer mp, int what, int extra) {
        switch (what) {
            case MEDIA_INFO_NETWORK_BANDWIDTH:
                Toast.makeText(this, "Ошибка 701",
                        Toast.LENGTH_SHORT).show();
                restartMediaPlayer();
                break;
            case MediaPlayer.MEDIA_INFO_BUFFERING_START:
                Toast.makeText(this, "Ошибка 703",
                        Toast.LENGTH_SHORT).show();
                restartMediaPlayer();
                break;
        }
        return true;
    }
 
    @Override
    public void onPrepared(MediaPlayer mp) {
        mp.start();
        Toast.makeText(this, "Приятного прослушивания :)",
                Toast.LENGTH_SHORT).show();
    }
 
    private void restartMediaPlayer() {
        mediaPlayer.stop();
        releaseMP();
        try {
            mediaPlayer = new MediaPlayer();
            mediaPlayer.setOnErrorListener(this);
            mediaPlayer.setOnInfoListener(this);
            mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
            mediaPlayer.setDataSource(DATA_STREAM);
            mediaPlayer.setOnPreparedListener(this);
            mediaPlayer.setWakeMode(getApplicationContext(), PowerManager.PARTIAL_WAKE_LOCK);
            mediaPlayer.prepareAsync();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
 
    private void releaseMP() {
        if (mediaPlayer != null) {
            try {
                mediaPlayer.reset();
                mediaPlayer.release();
                mediaPlayer = null;
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
}
Подскажите как правильно WiFi-lock поставить, примеры я нашел, но куда их пихать? Как правильно это сделать?

Добавлено через 4 минуты
Цитата Сообщение от Паблито Посмотреть сообщение
а реализованы оба интерфейса - onError и onInfo ?
Реализовано оба... Никаких ошибок лишних нету...

Добавлено через 2 часа 29 минут
Ребята, а может быть ну его вообще нахрен? Не проще ли как-то отловить тишину на выходе? Как-то такое можно сделать?
Valakin
430 / 96 / 15
Регистрация: 21.02.2015
Сообщений: 729
23.12.2015, 08:13     Потоковый проигрыватель #32
Цитата Сообщение от Stass48 Посмотреть сообщение
При этом, интернет-трафик совершенно не расходуется
или пробовать замерять программно трафик, на чем тестишь? может телефон глючит, больше одного пробовал?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.12.2015, 13:11     Потоковый проигрыватель
Еще ссылки по теме:

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
Stass48
20 / 20 / 6
Регистрация: 26.05.2011
Сообщений: 227
23.12.2015, 13:11  [ТС]     Потоковый проигрыватель #33
Valakin, и на телефоне и на планшете с совершенно разными системами ведет себя одинаково.
Yandex
Объявления
23.12.2015, 13:11     Потоковый проигрыватель
Ответ Создать тему
Опции темы

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