Форум программистов, компьютерный форум, киберфорум
Наши страницы
Программирование Android
Войти
Регистрация
Восстановить пароль
 
Alexvsalex
7 / 7 / 4
Регистрация: 22.04.2015
Сообщений: 84
#1

Использование MediaPlayer - Программирование Android

26.02.2017, 14:43. Просмотров 410. Ответов 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)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.02.2017, 14:43
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Использование MediaPlayer (Программирование Android):

"constructor MediaPlayer in class MediaPlayer cannot be applied to given types"
Проблема в строке &quot;37--final MediaPlayer mp = new...

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

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

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

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

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

6
vxg
Модератор
3231 / 2035 / 319
Регистрация: 13.01.2012
Сообщений: 7,887
26.02.2017, 15:16 #2
Цитата Сообщение от Alexvsalex Посмотреть сообщение
Вопрос о том, как найти файлы только в папке, а не на всей карте остается в силе
не совсем понятно что за сложность
Java
1
2
File dir = new File(dirName);
File[] elems = dir.listFiles();
1
Alexvsalex
7 / 7 / 4
Регистрация: 22.04.2015
Сообщений: 84
26.02.2017, 15:37  [ТС] #3
Спасибо, но меня интересуют именно аудиофайлы.
Сейчас я использую этот метод:
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
ExFau$t
520 / 475 / 101
Регистрация: 08.05.2012
Сообщений: 2,389
26.02.2017, 15:46 #4
Лучший ответ Сообщение было отмечено 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
Alexvsalex
7 / 7 / 4
Регистрация: 22.04.2015
Сообщений: 84
26.02.2017, 15:49  [ТС] #5
Ну да, я поэтому и подписал, что это INTERNAL)
Просто я сейчас немного в замешательстве, судя по всему мне надо использовать External? Чем же тогда является внешняя Sd...
У меня на смарте встроенная на 32 Gb, медиа файлов очень много, но при указании
Java
1
Uri uri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
Не находит ни одного.

UPD:
Эх, то есть стандартными средствами не обойтись? Жаль
Писать MEDIA_PATH = /mnt/sdcard0/Music/?
0
ExFau$t
520 / 475 / 101
Регистрация: 08.05.2012
Сообщений: 2,389
26.02.2017, 15:55 #6
Ещё можно FileFilter использовать. В любом случае начинать постигать сущность силы нужно с сообщения 2 от vxg.

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

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

Не по теме:

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

0
26.02.2017, 16:05
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.02.2017, 16:05
Привет! Вот еще темы с решениями:

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

Остановить мелодию в MediaPlayer
Всем привет ,у меня такой вопрос как остановит MediaPlayer? у меня есть класс и...

MediaPlayer выбор из Raw ?
Можно ли в MediaPlayer предоставить пользователю возможность выбрать треки из...

Вылет приложения с MediaPlayer
Использую один MediaPlayer. Даю ему разный звук при нажатии на каждую из 5...


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

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

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