Форум программистов, компьютерный форум, киберфорум
Наши страницы
Программирование Android
Войти
Регистрация
Восстановить пароль
 
 
kozak95
34 / 34 / 21
Регистрация: 01.11.2013
Сообщений: 319
#1

MediaPlayer: как продолжить работу аудио-плеера в фоновом режиме? - Программирование Android

21.08.2016, 17:31. Просмотров 771. Ответов 22
Метки нет (Все метки)

Как продолжить работу ауди плеера в фоновом режиме? Сервис создал, но что туда надо передать? Весь код выполняется в Activity.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.08.2016, 17:31
Я подобрал для вас темы с готовыми решениями и ответами на вопрос MediaPlayer: как продолжить работу аудио-плеера в фоновом режиме? (Программирование Android):

Скриншот в фоновом режиме
Цель - создание приложения, работающего в фоне и делающего снимок всего экрана с любой текущей активной задачей пользователя, а не моего...

Съёмка в фоновом режиме
Как получить картинку с камеры в фоновом режиме (без Surface)? Неважно, на Java или в native, главное, чтобы это работало на старых...

Съемка камерой в фоновом режиме
Здравствуйте! Я сделал тестовое приложение, которое через определенный интервал (например, полчаса) делает снимок с помощью...

Переходы по ссылка в фоновом режиме?
Здравствуйте. Как можно реализовать автоматический переход по ссылкам в WebView? Т.е. хочу сделать так, что бы в фоновом режиме у меня...

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

Остановка аудио плеера при клике на другой аудио плеер
Всем привет. На сайт добавил такой вот плеерочек. На странице стоит много таких плееров и нужно, чтобы при клике на один из них предыдущий...

22
danek130995
24 / 24 / 1
Регистрация: 25.05.2014
Сообщений: 949
21.08.2016, 18:52 #2
kozak95, выложи код
0
kozak95
34 / 34 / 21
Регистрация: 01.11.2013
Сообщений: 319
21.08.2016, 19:38  [ТС] #3
Та кода много...хочу чтоб подсказали сам алгоритм как это реализовать, ведь все в Activity выполняется.
0
vxg
Модератор
3229 / 2032 / 319
Регистрация: 13.01.2012
Сообщений: 7,884
21.08.2016, 20:05 #4
kozak95, отдай туда ссылку на плеер.
0
kozak95
34 / 34 / 21
Регистрация: 01.11.2013
Сообщений: 319
21.08.2016, 20:34  [ТС] #5
vxg, А c помощью чего отдать ссылку туда? через intent не получается.
Java
1
startService(new Intent(this,AudioService.class).putExtra("player",mediaPlayer));
0
danek130995
24 / 24 / 1
Регистрация: 25.05.2014
Сообщений: 949
21.08.2016, 23:18 #6
kozak95, перенеси код из активити в сервис
0
vxg
Модератор
3229 / 2032 / 319
Регистрация: 13.01.2012
Сообщений: 7,884
22.08.2016, 09:20 #7
kozak95, вот так
Цитата Сообщение от danek130995 Посмотреть сообщение
перенеси код из активити в сервис
0
kozak95
34 / 34 / 21
Регистрация: 01.11.2013
Сообщений: 319
22.08.2016, 09:39  [ТС] #8
А по другому никак нельзя?
0
vxg
Модератор
3229 / 2032 / 319
Регистрация: 13.01.2012
Сообщений: 7,884
22.08.2016, 09:57 #9
kozak95, унаследуйте от Application и храните ссылку на плеер в его статике. при паузе активити не освобождайте плеер. если параллельно работает сервис система не станет выгружать приложение и плеер должен продолжать играть.
0
kozak95
34 / 34 / 21
Регистрация: 01.11.2013
Сообщений: 319
22.08.2016, 10:52  [ТС] #10
vxg, А если я перенесу код в сервис, то в activity должен же выполнятся прогресс: двигаться ползунок в seekBar, идти время композиции и т.д. То есть тогда сервис должен постоянно передавать эту информацию в activity, а activity давать команды сервису что запустить на проигрывание. С помощью чего тогда организовать эту двухстороннюю связь?
0
vxg
Модератор
3229 / 2032 / 319
Регистрация: 13.01.2012
Сообщений: 7,884
22.08.2016, 10:54 #11
kozak95, думаю следует начать с того как вы двигаете ползунок и показываете время. ссылке в Application сам сервис как таковой не нужен - он нужен просто для того что бы приложение не было закрыто системой после сворачивания активити
0
kozak95
34 / 34 / 21
Регистрация: 01.11.2013
Сообщений: 319
22.08.2016, 11:02  [ТС] #12
vxg, через Handler
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
    private Runnable moveSeekBarThread = new Runnable() {
        public void run() {
            if(mediaPlayer.isPlaying()){
 
                int mediaPos_new = mediaPlayer.getCurrentPosition();
                int mediaMax_new = mediaPlayer.getDuration();
                seekbar.setMax(mediaMax_new);
                seekbar.setProgress(mediaPos_new);
                tvDurationCurrent.setText((millsecToSec(String.valueOf(mediaMax_new))));
                tvDurationEnd.setText((millsecToSec(String.valueOf(mediaPos_new))));
                handler.postDelayed(this, 100);
            }
 
        }
    };
0
REALIST07
Автор FAQ
Автор FAQ
181 / 181 / 20
Регистрация: 11.06.2010
Сообщений: 949
22.08.2016, 11:05 #13
Сделайте как в моем посте,я думаю для вас это подойдет, так как у меня также сервис постоянно висит в фоне
1
vxg
Модератор
3229 / 2032 / 319
Регистрация: 13.01.2012
Сообщений: 7,884
22.08.2016, 11:08 #14
kozak95, в onPause убивать хандлер обновляющий прогресс, в OnResume создавать снова.
0
kozak95
34 / 34 / 21
Регистрация: 01.11.2013
Сообщений: 319
22.08.2016, 11:52  [ТС] #15
Цитата Сообщение от REALIST07 Посмотреть сообщение
Сделайте как в моем посте
REALIST07, Пока не сильно еще разобрался как это работает...ну я с могу с помощью той структуры передавать постоянно вот эти значения
Цитата Сообщение от kozak95 Посмотреть сообщение
int mediaPos_new = mediaPlayer.getCurrentPosition();
int mediaMax_new = mediaPlayer.getDuration();
в MainActivity, чтобы там постоянно обновлялось seekBar и время тикало?
0
REALIST07
Автор FAQ
Автор FAQ
181 / 181 / 20
Регистрация: 11.06.2010
Сообщений: 949
22.08.2016, 12:05 #16
kozak95, без проблем,c Handlerom передавай в sendBroadcastReceiver
0
kozak95
34 / 34 / 21
Регистрация: 01.11.2013
Сообщений: 319
22.08.2016, 12:33  [ТС] #17
REALIST07, Подскажите, во такой код создания объекта Handler нужен, чтоб он выполнялся в отдельном потоке, правильно?
Цитата Сообщение от REALIST07 Посмотреть сообщение
HandlerThread mThread = new HandlerThread("ServiceThread",
android.os.Process.THREAD_PRIORITY_URGENT_AUDIO);
mThread.start();
mHandler = new Handler(mThread.getLooper(), this);
0
REALIST07
Автор FAQ
Автор FAQ
181 / 181 / 20
Регистрация: 11.06.2010
Сообщений: 949
22.08.2016, 12:41 #18
Да, такой
0
kozak95
34 / 34 / 21
Регистрация: 01.11.2013
Сообщений: 319
22.08.2016, 15:11  [ТС] #19
REALIST07, Сделал следующим образом:
С активити стартую сервис, соответсвено вызывается OnCommandStart:
Java
1
2
3
4
5
6
7
8
9
10
11
12
    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        int method = 0;
 
        if (intent != null) {
            method = intent.getIntExtra("action", -1);
            path = intent.getStringExtra("path");
        }
        mHandler.sendMessage(mHandler.obtainMessage(method, intent));
 
        return START_STICKY;
    }
В сервис номер действия которое выполнится - это у меня запуск плеера: там я вызываю App.sendLocalBroadcastMessage и передаю текущее время композиции и общее
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
    @Override
    public boolean handleMessage(Message msg) {
        int method = msg.what;
 
            switch (method) {
                case 0:
                    //Intent intent = (Intent) msg.obj;
                    try {
                        mediaPlayer.setDataSource(path);
                        mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
                        mediaPlayer.prepare();
                        mediaPlayer.start();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                    App.sendLocalBroadcastMessage("MyAction", mediaPlayer.getCurrentPosition(),mediaPlayer.getDuration());
                break;
            }
        return false;
    }
sendLocalBroadcastMessage выглядит вот так:
Java
1
2
3
4
5
6
    public static boolean sendLocalBroadcastMessage(String action,int result1, int result2) {
        Intent sendIntent = new Intent();
        sendIntent.putExtra("mediaPos_new",result1);
        sendIntent.putExtra("mediaMax_new",result2);
        return LocalBroadcastManager.getInstance(context).sendBroadcast(sendIntent);
    }
Ну и в активити принимаю:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
        IntentFilter intentfilter= new IntentFilter();
        intentfilter.addAction("MyAction");
        LocalBroadcastManager.getInstance(getApplicationContext()).registerReceiver(new BroadcastReceiver() {
            @Override
            public void onReceive(Context context, Intent intent) {
                int mediaPos_new = intent.getIntExtra("mediaPos_new", -1);
                int mediaMax_new = intent.getIntExtra("mediaMax_new",-1);
                seekbar.setMax(mediaMax_new);
                seekbar.setProgress(mediaPos_new);
                tvDurationCurrent.setText((millsecToSec(String.valueOf(mediaMax_new))));
                tvDurationEnd.setText((millsecToSec(String.valueOf(mediaPos_new))));
            }
        },intentfilter);
Но приложение падает с NullPointer. Что неправильно делаю?

Добавлено через 33 минуты
С NullPointer решил проблему, но как постоянно передавать эти сообщения на активити?
0
Mikalai
262 / 238 / 95
Регистрация: 11.01.2015
Сообщений: 666
22.08.2016, 15:22 #20
kozak95, Привязанные службы.
Цитата от туда - "Этот вариант подходит только в том случае, если клиент и служба выполняются внутри одного приложения и процесса, что является наиболее распространенной ситуацией. Например, расширение класса отлично подойдет для музыкального приложения, в котором необходимо привязать операцию к собственной службе приложения, которая воспроизводит музыку в фоновом режиме."
0
22.08.2016, 15:22
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.08.2016, 15:22
Привет! Вот еще темы с решениями:

как выполнить system() в фоновом режиме
есть system("start .\hl2.exe -game cstrike") проблема в том что когда запускаю программу промелькивает dos окно ну а потом запускается сама...

Как запустить приложение в фоновом режиме?
Как запустить приложение в фоновом режиме? Слышал что-то про сервис, на Java нашел, на FireMonkey гугл перерыл ничего не нашел.

Работа в фоновом режиме, как сделать?
#include <winsock2.h> char sbuf="\0",sbuf2="\0"; STARTUPINFO si; PROCESS_INFORMATION pi; int APIENTRY...

Как сделать приложение в фоновом режиме
Я хочу сделать достаточно объемную программу, но хочу сделать ее в фоновом режиме. То есть работать она будет постоянно, но на панели задач...


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

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

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