SoundManager 클래스를 사용하여 SD 카드에서 시스템 벨소리 (TYPE_ALL)와 mp3 파일을 모두 가져옵니다. 결국에는 HashMaps (활동 스 니펫에 있음)를 사용하여 Listview (CheckedTextViews 포함)를 채우고 사용자가 톤 (벨소리 또는 노래)을 선택할 수 있도록합니다. 코드가 작동하고 미디어 플레이어를 사용하여 선택한 톤을 재생할 수 있습니다.
그러나 시간이 많이 걸립니다 . 나는 그것이 SongsManager 파일 때문인지 다른 이유인지 모르겠습니다. 이 프로세스의 속도를 높일 수있는 대안이 있습니까?
SoundManager.java
public class SongsManager {
final String MEDIA_PATH = Environment.getExternalStorageDirectory()
.getPath() + "/";
private ArrayList<HashMap<String, String>> songsList = new ArrayList<HashMap<String, String>>();
private String mp3Pattern = ".mp3";
// Constructor
public SongsManager() {
}
/**
* Function to read all mp3 files and store the details in
* ArrayList
* */
public ArrayList<HashMap<String, Ringtone>> getAllSounds(Context context){
RingtoneManager ringtoneMgr = new RingtoneManager(context);
ringtoneMgr.setType(RingtoneManager.TYPE_ALL);
Cursor alarmsCursor = ringtoneMgr.getCursor();
int alarmsCount = alarmsCursor.getCount();
if (alarmsCount == 0 && !alarmsCursor.moveToFirst()) {
return null;
}
ArrayList<HashMap<String, Ringtone>> alarms = new ArrayList<HashMap<String, Ringtone>>();
while(!alarmsCursor.isAfterLast() && alarmsCursor.moveToNext()) {
int currentPosition = alarmsCursor.getPosition();
HashMap<String, Ringtone> soundMap = new HashMap<String, Ringtone>();
Ringtone ringtone = ringtoneMgr.getRingtone(currentPosition);
soundMap.put("Sound",ringtone);
alarms.add(soundMap);
}
alarmsCursor.close();
return alarms;
}
public ArrayList<HashMap<String, String>> getPlayList() {
System.out.println(MEDIA_PATH);
if (MEDIA_PATH != null) {
File home = new File(MEDIA_PATH);
File[] listFiles = home.listFiles();
if (listFiles != null && listFiles.length > 0) {
for (File file : listFiles) {
System.out.println(file.getAbsolutePath());
if (file.isDirectory()) {
scanDirectory(file);
} else {
addSongToList(file);
}
}
}
}
// return songs list array
return songsList;
}
private void scanDirectory(File directory) {
if (directory != null) {
File[] listFiles = directory.listFiles();
if (listFiles != null && listFiles.length > 0) {
for (File file : listFiles) {
if (file.isDirectory()) {
scanDirectory(file);
} else {
addSongToList(file);
}
}
}
}
}
private void addSongToList(File song) {
if (song.getName().endsWith(mp3Pattern)) {
HashMap<String, String> songMap = new HashMap<String, String>();
songMap.put("songTitle",
song.getName().substring(0, (song.getName().length() - 4)));
songMap.put("songPath", song.getPath());
// Adding each song to SongList
songsList.add(songMap);
}
}
}
MyActivity.java의 스 니펫
SongsManager songsManager = new SongsManager();
ArrayList<HashMap<String, String>> songsMap = songsManager.getPlayList();
ArrayList<HashMap<String, Ringtone>> soundMap = songsManager.getAllSounds(getApplicationContext());
Android Manifest 파일에서 외부 저장소 권한 으로이 기능을 사용하십시오 .
public ArrayList<HashMap<String, String>> getSDCardAudioFiles() {
ArrayList<HashMap<String, String>> audioFilesList = new ArrayList<HashMap<String, String>>();
Cursor mCursor = getContentResolver().query(
MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,
new String[] { MediaStore.Audio.Media.DISPLAY_NAME,
MediaStore.Audio.Media.DATA }, null, null, null);
int count = mCursor.getCount();
HashMap<String, String> audioFileMap;
while (mCursor.moveToNext()) {
audioFileMap = new HashMap<String, String>();
audioFileMap.put("FileName",mCursor.getString(mCursor
.getColumnIndexOrThrow(MediaStore.Audio.Media.DISPLAY_NAME)));
audioFileMap.put("FilePath", mCursor.getString(mCursor
.getColumnIndexOrThrow(MediaStore.Audio.Media.DATA)));
audioFilesList.add(audioFileMap);
}
mCursor.close();
return audioFilesList;
}
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다