How to scan for music files on android in react native using MediaStore

63 Views Asked by At

I am building an mp3 player on android using react native and I want to be able to scan my phone for music files that I can play using react-native-track-player. To do this, I built a module Name MusicScannerModule.java

package com.musicplayer;

import android.content.ContentResolver;
import android.content.ContentUris;
import android.content.Context;
import android.database.Cursor;
import android.net.Uri;
import android.provider.MediaStore;
import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.bridge.ReactContextBaseJavaModule;
import com.facebook.react.bridge.ReactMethod;
import com.facebook.react.bridge.WritableArray;
import com.facebook.react.bridge.WritableMap;
import com.facebook.react.bridge.Arguments;

public class MusicScannerModule extends ReactContextBaseJavaModule {
    private final ReactApplicationContext reactContext;

    public MusicScannerModule(ReactApplicationContext reactContext) {
        super(reactContext);
        this.reactContext = reactContext;
    }

    @Override
    public String getName() {
        return "MusicScanner";
    }

    @ReactMethod
    public WritableArray scanMusic() {
        WritableArray musicList = Arguments.createArray();
        ContentResolver contentResolver = this.reactContext.getContentResolver();
        Uri uri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
        String[] projection = {
                MediaStore.Audio.Media._ID,
                MediaStore.Audio.Media.ARTIST,
                MediaStore.Audio.Media.TITLE,
                MediaStore.Audio.Media.DATA,
                MediaStore.Audio.Media.DURATION,
        };

        Cursor cursor = contentResolver.query(uri, projection, null, null, null);

        if (cursor != null) {
            while (cursor.moveToNext()) {
                WritableMap musicInfo = Arguments.createMap();
                musicInfo.putString("title", cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.TITLE)));
                musicInfo.putString("artist", cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.ARTIST)));
                musicInfo.putString("uri", cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.DATA)));
                musicList.pushMap(musicInfo);
            }
            cursor.close();
        }

        return musicList;
    }
}

and MusicScannerPackage.java

package com.musicplayer;

import java.util.Collections;
import java.util.List;
import java.util.ArrayList;

import com.facebook.react.ReactPackage;
import com.facebook.react.bridge.NativeModule;
import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.uimanager.ViewManager;

public class MyCustomPackage implements ReactPackage {
    @Override
    public List<ViewManager> createViewManagers(ReactApplicationContext reactContext) {
        return Collections.emptyList();
    }

    @Override
    public List<NativeModule> createNativeModules(ReactApplicationContext reactContext) {
        List<NativeModule> modules = new ArrayList<>();
        modules.add(new MusicScannerModule(reactContext));
        return modules;
    }

 }

But the code doesn't seem to work. I want to know if I got anything wrong or if there is any other react native dependency that I can use to achieve the same result

0

There are 0 best solutions below