java - 搜索手机和 SD 卡的整个存储空间以查找音乐播放器

标签 java android eclipse

当我开始制作这个音乐播放器时,只需在SD卡中搜索即可工作并显示音乐,播放器即可正常工作。几周前,我买了一部新手机并决定在上面安装该应用程序,但是当我加载该应用程序时,它找不到任何音乐,所以我需要一种方法来更改当前代码,以便它能够搜索每个手机的文件夹和 micro SD 卡 ,用于任何以“.mp3”结尾的文件。

主 Activity.java

class Mp3Filter implements FilenameFilter {
public boolean accept(File dir, String name) {
    return (name.endsWith(".mp3"));
    }
}

public class MainActivity extends ListActivity implements OnCompletionListener {
private static final String SD_PATH = new String(Environment.getExternalStorageDirectory().getPath() + "/");
private static final String PHONE_STORAGE = new String(Environment.getRootDirectory().getPath() + "/");
private List<String> songs = new ArrayList<String>();
private MediaPlayer mp = new MediaPlayer();
private View play;
private View pause;
private View stop;
private View next;
private View prev;
private View replay;
private View shuffle;
private boolean isRepeat = false;
private boolean isShuffle = false;
public static int SONG_NUMBER = 0;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    updatePlaylist();
    play = (ImageButton) findViewById(R.id.imageButton1);
    pause = (ImageButton) findViewById(R.id.imageButton2);
    stop = (ImageButton) findViewById(R.id.imageButton3);
    next = (ImageButton) findViewById(R.id.imageButton4);
    prev = (ImageButton) findViewById(R.id.imageButton5);
    replay = (ImageButton) findViewById(R.id.imageButton6);
    shuffle = (ImageButton) findViewById(R.id.imageButton7);
    mp.setOnCompletionListener(this);
    play.setEnabled(false);
    pause.setEnabled(false);
    stop.setEnabled(false);
    next.setEnabled(false);
    prev.setEnabled(false);
    replay.setEnabled(false);
    shuffle.setEnabled(false);

}

@Override
protected void onListItemClick(ListView list, View view, int position,
        long id) {
    try {
        SONG_NUMBER = position;
        mp.reset();
        mp.setDataSource(SD_PATH + PHONE_STORAGE + songs.get(position));
        mp.prepare();
        mp.start();
        play.setEnabled(false);
        pause.setEnabled(true);
        stop.setEnabled(true);
        next.setEnabled(true);
        prev.setEnabled(true);
        replay.setEnabled(true);
        shuffle.setEnabled(true);
    } catch (IOException e) {
        Log.v(getString(R.string.app_name), e.getMessage());
    }
}

private void updatePlaylist() {
    File home = new File(SD_PATH);
    if (home.listFiles(new Mp3Filter()).length > 0) {
        for (File file : home.listFiles(new Mp3Filter())) {
            songs.add(file.getName());
        }
        ArrayAdapter<String> songList = new ArrayAdapter<String>(this,
                R.layout.song_item, songs);
        setListAdapter(songList);
    }
    File secondDirectory = new File(PHONE_STORAGE);
    if (secondDirectory.listFiles(new Mp3Filter()).length > 0) {
        for (File file : home.listFiles(new Mp3Filter())) {
            songs.add(file.getName());
        }
        ArrayAdapter<String> songList = new ArrayAdapter<String>(this,
                R.layout.song_item, songs);
        setListAdapter(songList);
    }
}

public void play(View view) {
    Toast.makeText(getApplicationContext(), "Playing song",
            Toast.LENGTH_SHORT).show();
    mp.start();
    play.setEnabled(false);
    pause.setEnabled(true);
    stop.setEnabled(true);
    next.setEnabled(true);
    prev.setEnabled(true);
    replay.setEnabled(true);
    shuffle.setEnabled(true);
}

public void pause(View view) {
    Toast.makeText(getApplicationContext(), "Pausing song",
            Toast.LENGTH_SHORT).show();
    mp.pause();
    play.setEnabled(true);
    pause.setEnabled(false);
    stop.setEnabled(true);
    next.setEnabled(true);
    prev.setEnabled(true);
    replay.setEnabled(false);
    shuffle.setEnabled(false);
}

public void stop(View view) {
    Toast.makeText(getApplicationContext(), "Stopping song",
            Toast.LENGTH_SHORT).show();
    mp.stop();
    play.setEnabled(false);
    pause.setEnabled(false);
    stop.setEnabled(false);
    next.setEnabled(false);
    prev.setEnabled(false);
    replay.setEnabled(false);
    shuffle.setEnabled(false);
    isRepeat = false;
    isShuffle = false;
}

public void next(View view) {
    isRepeat = false;
    try {
        if (isShuffle) {
            mp.reset();
            Random rand = new Random();
            SONG_NUMBER = rand.nextInt((songs.size() - 1) - 0 + 1) + 0;
            mp.setDataSource(SD_PATH + PHONE_STORAGE + songs.get(SONG_NUMBER));
            mp.prepare();
            mp.start();
        }
        else {
        if (SONG_NUMBER < songs.size() - 1) {
            Toast.makeText(getApplicationContext(), "Next song",
                    Toast.LENGTH_SHORT).show();
            mp.reset();
            mp.setDataSource(SD_PATH + PHONE_STORAGE + songs.get(SONG_NUMBER));

        } else {
            Toast.makeText(getApplicationContext(), "Please try again",
                    Toast.LENGTH_SHORT).show();
            SONG_NUMBER = -1;
        }
        mp.start();
        }
    } catch (IOException e) {
        Log.v(getString(R.string.app_name), e.getMessage());
    }
}

public void prev(View view) {
    isRepeat = false;
    isShuffle = false;
    try {
        if (SONG_NUMBER == 0) {
            Toast.makeText(getApplicationContext(),
                    "Cannot play previous song", Toast.LENGTH_SHORT).show();
            prev.setEnabled(false);
        } else {
            Toast.makeText(getApplicationContext(), "Previous song",
                    Toast.LENGTH_SHORT).show();
            mp.reset();
            mp.setDataSource(SD_PATH + PHONE_STORAGE + songs.get(SONG_NUMBER));
            SONG_NUMBER -= 2;
        }
        mp.start();
    } catch (IOException e) {
        Log.v(getString(R.string.app_name), e.getMessage());
    } catch (NullPointerException e) {
        Log.v(getString(R.string.prevButton), e.getMessage());
    }
}

public void replay(View view) {

    if (isRepeat) {
        Toast.makeText(getApplicationContext(), "Replaying All Songs",
                Toast.LENGTH_SHORT).show();
        isRepeat = false;
    } else {
        Toast.makeText(getApplicationContext(), "Replaying Current Song",
                Toast.LENGTH_SHORT).show();
        isRepeat = true;
        isShuffle = false;
    }

}

public void shuffle(View view) {
    if (isShuffle) {
        Toast.makeText(getApplicationContext(), "Playing Songs Normally",
                Toast.LENGTH_SHORT).show();
        isShuffle = false;
    } else {
        Toast.makeText(getApplicationContext(), "Shuffling Songs",
                Toast.LENGTH_SHORT).show();
        isShuffle = true;
        isRepeat = false;
    }
}

@Override
public void onCompletion(MediaPlayer mp1) {
    try {
        if (isRepeat) {
            mp.start();
        } else if (isShuffle) {
            mp.reset();
            Random rand = new Random();
            SONG_NUMBER = rand.nextInt((songs.size() - 1) - 0 + 1) + 0;
            mp.setDataSource(SD_PATH + songs.get(SONG_NUMBER));
            mp.prepare();
            mp.start();
        } else {
            mp.reset();
            SONG_NUMBER += 1;
            mp.setDataSource(SD_PATH + songs.get(SONG_NUMBER));
            mp.prepare();
            mp.start();
        }
        play.setEnabled(false);
        pause.setEnabled(true);
        stop.setEnabled(true);
        next.setEnabled(true);
        prev.setEnabled(true);
        replay.setEnabled(true);
        shuffle.setEnabled(true);
    } catch (IOException e) {
        Log.v(getString(R.string.app_name), e.getMessage());
    }

}

public void onDestroy() {
    super.onDestroy();
    mp.release();
}
}

最佳答案

您无需搜索存储中的单个文件。 MediaStore 会为您完成此操作。每个音频文件都会在此处列出

已更新

String selection = MediaStore.Audio.Media.IS_MUSIC + " != 0";

            String[] projection = {
                    MediaStore.Audio.Media.DATA,
                    };

            Cursor cursor = getActivity().managedQuery(
                    MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,
                    projection,
                    selection,
                    null,
                    null);

            while(cursor.moveToNext()){
            //do something with the path
            File f=new File(cursor.getString(0));
            System.out.println(cursor.getString(0));
            }

关于java - 搜索手机和 SD 卡的整个存储空间以查找音乐播放器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31230595/

相关文章:

java - 在 JFrame 中重新加载 GUI 出现问题

java - Neodatis 对象 DB/DataNucleus - 如何定义索引?

java - 用私钥文件解密 : invalid stream header

java - 在 Android 中映射 XML 属性和代码方法

android - Intellij Idea 和 Eclipse 以及 JDK 7 和 Android

java - 为什么我会收到 NoSuchElementException?

android - 为什么 Gallery 如此缓慢/访问 GoogleLoginService?

java - Eclipse 中的 jUnit 抛出空指针异常

java - eclipse kepler 中的冗余空检查

java - Eclipse 未将 'Web Content' 部署到根文件夹