0

I'm building a music player application using Ionic, so how can I scan music files from the file storage using the file cordova plugin so users can be able to select songs to play .P.S I'm pretty new to Ionic.

2 Answers2

2

You'll need to both access the music files and play them. There are some Cordova plugins that should help in accessing the native stuff. After adding one or multiple plugins to your project, I have found that they have pretty useful documentation and examples in the github repos. There is a link to these in the npm page.

For accessing files there is

Based on the device type you are targeting, and where you expect users to access media files you might need to use one or all of these.

For playing files:

Jinw
  • 428
  • 5
  • 10
  • Do you know of a plugin which allows media files to be served in a local network, securely? I want to access music files in the computer. – arjun Oct 24 '17 at 06:27
0

This code will list all folders and files:

    import { File } from "@ionic-native/file";
    import { Diagnostic } from "@ionic-native/diagnostic";

    constructor(
        ...
        public file: File,
        public diagnostic: Diagnostic
        ){


  // -------------------------
  listFileSys( which){

    // <which> chooses the file system - see switch below
    this.jcDebug += "\n" + "listFileSysSKOFLO(" + which + ")";

    let fileSysArray = [];
    let basePath = "";

    let tag = "unknown";

    // ************** RECURSE *************
    let jcListDir = (thisDir)=>{

      tag = "jcListDir: [" + thisDir + "]";

      this.file.listDir(basePath, thisDir)
      .then( (data)=>{
        tag = "listDir:" + thisDir;
        this.jcError += "\n" + tag + ":" + JSON.stringify( data);
        for( let ii = 0; ii < data.length; ii += 1){
          this.jcError += "\n" + data[ii].name + (data[ii].isDirectory? " [D]" : " [F]");

          let currentPath = thisDir;
          currentPath += (currentPath.length ? "/" : "");
          currentPath += data[ii].name;
          this.jcError += "\n" + "currentPath:" + currentPath;

          fileSysArray.push( currentPath);

          if( data[ii].isDirectory && ok2recurse){
            jcListDir( currentPath);         // RECURSE !!!
          }
        }
      }, (errData)=>{
        tag = "listDir";
        this.jcError += "\n" + tag + ":ERR:" + JSON.stringify( errData);
      });
    };
    // ************** RECURSE *************

    // ***********************
    let runListDir = ()=>{
        this.jcDebug += "\n" + "basePath:" + basePath;

        // !!! START listing from basePath !!!
        jcListDir( ".");
    }

    // ***********************
    switch( which)
    {
      case 1:
        this.diagnostic.getExternalSdCardDetails()
        .then( (data) => {
          this.jcDebug += "\n" + "sd:" + JSON.stringify( data);
          this.jcDebug += "\n" + "Number of cards: " + data.length;
          for( let ii = 0; ii < data.length; ii += 1){
            let thisElem = data[ii];
            if( thisElem.type.toLowerCase() === "application" && thisElem.canWrite){
              basePath = thisElem.filePath;
              break;
            }
          }
          if( !basePath){
            this.jcDebug += "\n" + "no SD card found";
            return;
          }
          runListDir();
        }, (errData)=>{
          tag = "getExternalSdCardDetails";
          this.jcError += "\n" + tag + ":ERR:" + JSON.stringify( errData);
        });
      break;
      case 2:
        basePath = this.file.externalDataDirectory;
        this.jcError += "\n" + "externalDataDirectory:" + basePath;
        runListDir();
        break;
      case 3:
        basePath = this.file.dataDirectory;
        this.jcError += "\n" + "dataDirectory:";
        runListDir();
        break;
      default:
        alert( "which???:" + which);
        return;
    }

    // wait for all to comnplete, then show
    // assume 1000 ms is adequate delay per promise
    let lastFileSysLen = -1
    let checkCount = 30; // max 30 * 1000 ms = 30 seconds

    // ************** RECURSE *************
      let checkComplete = () => {
      this.jcDebug += "\n" + "checkComplete " + checkCount + " [" + fileSysArray.length + "]";
      setTimeout( ()=>{

        // fileSysArr length stable?
        if( fileSysArray.length === lastFileSysLen){
          checkCount = 0;
        }
        lastFileSysLen = fileSysArray.length;

        checkCount -= 1;
        if( checkCount > 0){
          checkComplete();    // recurse
        } else {

          // STOP !!! and show FileSysArray
          this.jcInfo += "\n" + "show FileSysArray";
          this.jcInfo += "\n" + "fileSysArray.length = " + " [" + fileSysArray.length + "]";

          fileSysArray.sort();

          for( let elem of fileSysArray){
            this.jcInfo += "\n" + elem;
          }
        }
      }, 1000);
    };
    // ************** RECURSE *************
    checkComplete();
  }
jcsubmit
  • 146
  • 2
  • 9