Search code examples
androidassetsandroid-mediaplayer

Play media files located in assets folder


I currently have a set of media files in the raw folder of the android project that are loaded quickly and played when called using the mediaplayer class. I need to add more variations of these files and categorize them into folders, but apparently the raw folder does not support folders. Would I be able to quickly load these files from the assets folder and play them with mediaplayer? If so, how?


Solution

  • I've this method that returns the all files by extension in a folder inside asset folder:

    public static String[] getAllFilesInAssetByExtension(Context context, String path, String extension){
            Assert.assertNotNull(context);
    
            try {
                String[] files = context.getAssets().list(path);
    
                if(StringHelper.isNullOrEmpty(extension)){
                    return files;
                }
    
                List<String> filesWithExtension = new ArrayList<String>();
    
                for(String file : files){
                    if(file.endsWith(extension)){
                        filesWithExtension.add(file);
                    }
                }
    
                return filesWithExtension.toArray(new String[filesWithExtension.size()]);  
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
    
            return null;
        }
    

    if you call it using:

    getAllFilesInAssetByExtension(yourcontext, "", ".mp3");
    

    this will return all my mp3 files in the root of assets folder.

    if you call it using:

    getAllFilesInAssetByExtension(yourcontext, "somefolder", ".mp3");
    

    this will search in "somefolder" for mp3 files

    Now that you have list all files to open you will need this:

    AssetFileDescriptor descriptor = getAssets().openFd("myfile");
    

    To play the file just do:

    MediaPlayer player = new MediaPlayer();
    
    long start = descriptor.getStartOffset();
    long end = descriptor.getLength();
    
    player.setDataSource(this.descriptor.getFileDescriptor(), start, end);
    player.prepare();
    
    player.setVolume(1.0f, 1.0f);
    player.start();
    

    Hope this helps