Форум программистов, компьютерный форум, киберфорум
Программирование Android
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.54/13: Рейтинг темы: голосов - 13, средняя оценка - 4.54
7 / 7 / 4
Регистрация: 22.04.2015
Сообщений: 86

Использование MediaPlayer

26.02.2017, 14:43. Показов 2503. Ответов 6

Студворк — интернет-сервис помощи студентам
Здравствуйте.
Задача такова: написать свой простейший плеер сугубо для себя.
Почитав, понял, что нужно использовать MediaPlayer. Но в Интернете информации очень мало.
Собственно, вот что я набросал:
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
MediaPlayer mMediaPlayer;
    ArrayList<Song> songs = new ArrayList<>();
@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.player);
 
        mMediaPlayer = new MediaPlayer();
 
        try {
            findMediaFiles();
 
            mMediaPlayer.setDataSource(songs.get(0).path);
            mMediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
 
            mMediaPlayer.prepare();
            mMediaPlayer.setOnPreparedListener(this);
            Toast.makeText(this, songs.get(0).path +"\n"+mMediaPlayer.isPlaying(), Toast.LENGTH_LONG).show();
        } catch (Exception r) {
            Toast.makeText(this, r.toString(), Toast.LENGTH_LONG).show();
        }
 
    }
public class Song {
        long id;
        String title;
        String path;
 
        public Song(long id, String title, String path) {
            this.id = id;
            this.title = title;
            this.path = path;
        }
    }
void findMediaFiles() {
        ContentResolver contentResolver = getContentResolver();
        Uri uri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
        Cursor cursor = contentResolver.query(uri, null, null, null, null);
 
        int titleColumn = cursor.getColumnIndex(MediaStore.Audio.Media.TITLE);
        int idColumn = cursor.getColumnIndex(MediaStore.Audio.Media._ID);
        int path = cursor.getColumnIndex(MediaStore.Audio.Media.DATA);
 
        while (cursor.moveToNext()) {
            long thisId = cursor.getLong(idColumn);
            String thisTitle = cursor.getString(titleColumn);
            String thisPath = cursor.getString(path);
            songs.add(new Song(thisId, thisTitle, thisPath));
        }
 
        cursor.close();
    }
Образовавшиеся вопросы:
1) Как считывать файлы только из директории "Music"(создается по дефолту на внутренней памяти в корне, примерный путь /mnt/sdcard0/Music/)? Пробовал: Uri.parse(Environment.DIRECTORY_MUSIC) - не находит файлы
2) Как воспроизводить трэки последовательно из полученного "плэйлиста". Нашел вариант в котором используется onCompletion:
Java
1
2
3
4
5
6
7
8
9
10
11
mp.setOnCompletionListener(new MediaPlayer.OnCompletionListener(){
           public void onCompletion(MediaPlayer mp){
               if(index < sounds.length-1){
                   index++;
                   mp = MediaPlayer.create(getApplicationContext(), sounds[index]);
                   mp.start();
                   mp.setOnCompletionListener(this);
               }
               else mp.release();
           }
       });
Но как адаптировать под себя так и не понял. В нем используются ресурсы(sounds=new int[]{R.raw.cat, R.raw.supercat, R.raw.megacat}).
Вот это у меня падает на setDataSource:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
mMediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
                public void onCompletion(MediaPlayer mp) {
                    if (++index < songs.size() - 1) {
                        try {
                            mp.setDataSource(songs.get(index).path);
                            mp.start();
                            mp.setOnCompletionListener(this);
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                    } else mp.release();
 
                }
            });
Пожалуйста, подскажите куда копать

Добавлено через 17 часов 39 минут
Эх, попытаюсь апнуть тему

Добавлено через 3 часа 22 минуты
Второй вопрос снимается, сделал так:
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
MediaPlayer mMediaPlayer;
    ArrayList<Song> songs = new ArrayList<>();
@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.player);
 
        //Инициализация
 
        mMediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
 
        if (songs.size() > 0) {
            loadTrack(mMediaPlayer);
            mMediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
                public void onCompletion(MediaPlayer mp) {
                    nextTrack(mp);
                }
            });
        }
    }
public void nextTrack(MediaPlayer mp) {
        if (mp != null) {
            if (++indexOfTrack > songs.size() - 1) indexOfTrack = 0;
            loadTrack(mp);
        }
    }
 
    public void loadTrack(MediaPlayer mp) {
        if (mp != null) {
            try {
                mp.reset();
                mp.setDataSource(songs.get(indexOfTrack).path);
                mp.prepare();
                mp.start();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
Вопрос о том, как найти файлы только в папке, а не на всей карте остается в силе.
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
26.02.2017, 14:43
Ответы с готовыми решениями:

"constructor MediaPlayer in class MediaPlayer cannot be applied to given types"
Проблема в строке &quot;37--final MediaPlayer mp = new MediaPlayer(this,R.raw.sample);&quot; Ошыбка : Error:(39, 41) error: constructor...

Регистрация MediaPlayer
Подскажите как зарегистрировать MediaPlayer, чтоб при открытии файла он появлялся в диалоге предложенных app.

MediaPlayer автореверс
Всем привет,вопрос такое ,можно как нибудь сделать,чтоб в медиаплеере воспроизводить песню ,не слева на право ,а с право налево?

6
Модератор
 Аватар для vxg
3409 / 2180 / 354
Регистрация: 13.01.2012
Сообщений: 8,458
26.02.2017, 15:16
Цитата Сообщение от Alexvsalex Посмотреть сообщение
Вопрос о том, как найти файлы только в папке, а не на всей карте остается в силе
не совсем понятно что за сложность
Java
1
2
File dir = new File(dirName);
File[] elems = dir.listFiles();
1
7 / 7 / 4
Регистрация: 22.04.2015
Сообщений: 86
26.02.2017, 15:37  [ТС]
Спасибо, но меня интересуют именно аудиофайлы.
Сейчас я использую этот метод:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
void findMediaFiles() {
        ContentResolver contentResolver = getContentResolver();
        Uri uri = MediaStore.Audio.Media.INTERNAL_CONTENT_URI;
        Cursor cursor = contentResolver.query(uri, null, null, null, null);
 
        int titleColumn = cursor.getColumnIndex(MediaStore.Audio.Media.TITLE);
        int idColumn = cursor.getColumnIndex(MediaStore.Audio.Media._ID);
        int path = cursor.getColumnIndex(MediaStore.Audio.Media.DATA);
 
        while (cursor.moveToNext()) {
            long thisId = cursor.getLong(idColumn);
            String thisTitle = cursor.getString(titleColumn);
            String thisPath = cursor.getString(path);
            songs.add(new Song(thisId, thisTitle, thisPath));
        }
 
        cursor.close();
    }
И я получаю в результате какие то рингтоны, по видимому это системная память или около того.(INTERNAL)
Мне же требуется находить файлы в конкретной папке /mnt/sdcard0/Music/(встроенная память, Music - стандартная, созданная системой папка при прошивке)
0
1570 / 1168 / 426
Регистрация: 08.05.2012
Сообщений: 5,219
26.02.2017, 15:46
Лучший ответ Сообщение было отмечено Alexvsalex как решение

Решение

Кэп как бы намекает:
Java
1
MediaStore.Audio.Media.INTERNAL_CONTENT_URI;
Добавлено через 3 минуты
Вот код, использующий рекурсивный поиск:
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
public List<Track> createMediaLibrary() {
 
        final File home = new File(MEDIA_PATH);
 
        final List<Track> tracks = new ArrayList<Track>();
        listTrack(home, tracks);
        Collections.sort(
            tracks,
            new Comparator<Track>() {
                @Override
                public int compare(final Track lhs, final Track rhs) {
                    return lhs.toString().compareTo(rhs.toString());
                }
            }
        );
        musicTracks = tracks.toArray(new Track[tracks.size()]);
 
        Log.v(TAG, "Find mp3 files " + musicTracks.length);
 
        return tracks ;
    }
 
    /**
     * Find and add track to list
     * @param folder the current folder for search
     * @param tracks the storage of tracks
     */
    private void listTrack(final File folder, final List<Track> tracks) {
        for (final File file : folder.listFiles()) {
            if (file.isDirectory()) {
                listTrack(file, tracks);
            } else if (file.getName().endsWith(".mp3")) {
                tracks.add(new Track(file));
            }
        }
    }
2
7 / 7 / 4
Регистрация: 22.04.2015
Сообщений: 86
26.02.2017, 15:49  [ТС]
Ну да, я поэтому и подписал, что это INTERNAL)
Просто я сейчас немного в замешательстве, судя по всему мне надо использовать External? Чем же тогда является внешняя Sd...
У меня на смарте встроенная на 32 Gb, медиа файлов очень много, но при указании
Java
1
Uri uri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
Не находит ни одного.

UPD:
Эх, то есть стандартными средствами не обойтись? Жаль
Писать MEDIA_PATH = /mnt/sdcard0/Music/?
0
1570 / 1168 / 426
Регистрация: 08.05.2012
Сообщений: 5,219
26.02.2017, 15:55
Ещё можно FileFilter использовать. В любом случае начинать постигать сущность силы нужно с сообщения 2 от vxg.

Добавлено через 2 минуты
Класс File и есть самое простое и стандартное средство для этой задачи, получить список музыки в директории не займёт больше 5 строк кода.

Добавлено через 1 минуту
А через фильтр можно оторвать файлы только с требуемым расширением.
1
7 / 7 / 4
Регистрация: 22.04.2015
Сообщений: 86
26.02.2017, 16:05  [ТС]
Хорошо, спасибо, вопрос закрыт.

Не по теме:

На телефоне тачскрин накрылся, новый через недельку только будет. Вот и играюсь, выжимая максимум функционала из кирпича с 3 кнопками(питания, громкости) + саморазвитие

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
26.02.2017, 16:05
Помогаю со студенческими работами здесь

Ошибка MediaPlayer'a
Здравствуйте форумчане.Создал кнопочку для проигрывания мелодии, но при проигрывании в консоли постоянно вылезает ошибка...

Static MediaPlayer
Добрый день! Пытался реализовать следующий алгоритм работы своего приложения: Пользователь кликая по изображению открывает новый...

SoundPool vs MediaPlayer
Какой класс лучше использовать для проигрывания музыки? Под музыкой подразумеваю не короткий сигнал, а большое количество песен, с большим...

Простой MediaPlayer
Нужно сделать простую програмку. В главном активити - Баттн, при нажатии на него появляется АлертБилдер из трех кнопок. При нажатии на...

MediaPlayer задать громкость
Как в MediaPlayer задать максимальную громкость? Или системную для уведомлений. AssetFileDescriptor afd =...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru