Giter VIP home page Giter VIP logo

react-native-get-music-files's Introduction

react-native-get-music-files

React Native package to get music files from local and sd for iOS and Android

What does this package?

This package allow you to get music files from Android & iOS with following properties:

  • Title
  • Author
  • Album
  • Duration
  • FilePath
  • Cover
  • Duration
  • Genre

Getting started

$ yarn add react-native-get-music-files or $ yarn add https://github.com/cinder92/react-native-get-music-files.git

iOS

  1. Add in info.plist following permission
<key>NSAppleMusicUsageDescription</key>
<string>This permission is not needed by the app, but it is required by an underlying API. If you see this dialog, contact us.</string>
  1. Add MediaPlayer.framework under build settings in Xcode
  2. Ensure all your music files are sync from a computer to a real iPhone device (this package does not work in simulators)

Android

  1. Navigate to android/app/src/main/AndroidManifest.xml and ensure to add this permission
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_MEDIA_AUDIO"/> <-- Add this for Android 13 and newer versions

Before usage

As this package needs permissions from the device, please ensure that you asked for permissions before run any of this package functions.

Constants

SortSongFields {
    TITLE, DURATION, ARTIST, GENRE, ALBUM
}

SortSongOrder {
    ASC, DESC
}

Usage

import { getAll, getAlbums, searchSongs, SortSongFields, SortSongOrder } from "react-native-get-music-files";


const songsOrError = await getAll({
    limit: 20,
    offset: 0,
    coverQuality: 50,
    minSongDuration: 1000,
    sortBy: SortSongFields.TITLE,
    sortOrder: SortSongOrder.DESC,
});

// error 
if (typeof songsOrError === 'string') {
    // do something with the error
    return;
}

const albumsOrError = await getAlbums({
    limit: 10,
    offset: 0,
    coverQuality: 50,
    artist: 'Rihanna',
    sortBy: SortSongFields.ALBUM,
    sortOrder: SortSongOrder.DESC,
});

// error 
if (typeof albumsOrError === 'string') {
    // do something with the error
    return;
}

const resultsOrError = await searchSongs({
    limit: 10,
    offset: 0,
    coverQuality: 50,
    searchBy: '...',
    sortBy: SortSongFields.DURATION,
    sortOrder: SortSongOrder.DESC,
});

// error 
if (typeof resultsOrError === 'string') {
    // do something with the error
    return;
}

MusicFiles returns an array of objects where you can loop, something like this.

[
  {
    title : "La danza del fuego",
    author : "Mago de Oz",
    album : "Finisterra",
    genre : "Folk",
    duration : 209120,
    cover : "data:image/jpeg;base64, ....",
    url : "/sdcard/0/la-danza-del-fuego.mp3"
  }
]

Return Types

  • Album

    Type: Object

    property type description
    album string album name
    artist string author
    cover string base64 of the artwork
    numberOfSongs number number of songs in this album
  • Song

    property type description
    title string title
    artist string artist
    album string album name
    duration string duration in ms
    genre string genre
    cover string base64 of the artwork
    url string path of the song

Methods

  • getAlbums

    async getAlbums(options) → {Promise<Album[] | string>}

    • options

      Type: Object

      property type description
      artist string required
      limit number optional
      offset number required if limit set
      coverQuality number optional
      sortBy string optional
      sortOrder string optional
    • returns

      Type: Albums Error: string

  • getAll

    async getAll(options) → {Promise<Song[] | string>}

    • options

      Type: Object

      property type description
      limit number optional
      offset number required if limit set
      coverQuality string optional
      minSongDuration number optional
      sortBy string optional
      sortOrder string optional
    • returns

      Type: Song Error: string

  • searchSongs

    async searchSongs(options) → { Promise<Song[] | string> }

    • options

      Type: Object

      property type description
      searchBy string required
      limit number optional
      offset number required if limit set
      coverQuality number optional
      sortBy string optional
      sortOrder string optional
    • returns Type: Song Error: string

Usage:

example app

Version Changes

2.2

  • Android & iOS compatible
  • Retro-compat turbo module
  • Limit & offset to paginate results
  • Compatible with https://github.com/zoontek/react-native-permissions

PR are welcome!

react-native-get-music-files's People

Contributors

anthonytietjen avatar cinder92 avatar dependabot[bot] avatar drazail avatar farshed avatar krishcdbry avatar nguyenkhooi avatar rashidul-hasan avatar shtayeb avatar yajanarao avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar

react-native-get-music-files's Issues

undefined is not an object (evaluating 'SongsCollection.getAll')

I'm trying to use your package, but when I call get() function, I have this :

I'm using react-native 0.43.3 and I'm on an Android 6.0.
Here is my code from the component where I use it:

import React, { Component } from 'react';

//Global component/vars
global = require('connectedClockApp/app/Globals.js');
globalS = require('connectedClockApp/app/GlobalStyles.js');
import CText from "connectedClockApp/app/CText.js";
import MenuButton from "connectedClockApp/app/MenuButton.js";
import ArrowButton from "connectedClockApp/app/ArrowButton.js";

import {
  StyleSheet,
  Text,
  View,
  Picker
} from 'react-native';
import Dimensions from 'Dimensions';

//API to read files
import MusicFilesAPI from 'react-native-get-music-files';

//get screen dimensions
var sWidth = Dimensions.get('window').width;
var sHeight = Dimensions.get('window').height;

export default class MusicFiles extends Component {

  constructor(props) {
    super(props);
    this.state = {
      sortBy: "title",
      songData: [],
      artistList: [],
      albumList: [],
    };
  };

//react-native-get-music-files part--------------------------------------------------------------------

  componentDidMount() {
    MusicFilesAPI.get(                              //seems to crash here
      (success) => {
        this.setState({songData: success});
        var doSaveArtAlb = [true, true];
        var artistList = [];
        var albumList = [];

        for (var i = 0; i < success.length; i++) {
          //doSave Artist
          for (var j = 0; j < this.state.artistList.length; j++) {
            if (this.state.artistList[j] === success[i].author) {
              doSaveArtAlb[0] = false;
            };
          };
          //doSave album
          for (var j = 0; j < this.state.albumList.length; j++) {
            if (this.state.albumList[j] === success[i].album) {
              doSaveArtAlb[1] = false;
            };
          };
          //Save
          if (doSaveArtAlb[0]) {
            artistList.push(success[i].author);
          };
          if (doSaveArtAlb[1]) {
            albumList.push(success[i].album);
          };
        };

        this.setState({artistList: artistList});
        this.setState({albumList: albumList});
        console.log("artistList : " + artistList);
        console.log("albumList : " + albumList);
      },
      (error) => {
        console.log("[Music Files]" + error);
      },
    );
  }

//----------------------------------------------------------------------------------------------------

  render() {
    return(
      <View style={styles.page}>
        <View style={styles.topBar}>
          <ArrowButton
            color={global.darkColor}
            highColor={global.lightColor}
            onPress={() => this.props.navigator.pop()}
            style={{marginTop: -3}}
          />
          <CText text={"Sort by"} style={styles.sortText}/>
          <Picker
            style={styles.sortPicker}
            itemStyle={styles.sortPickerItem}
            selectedValue={this.state.sortBy}
            onValueChange={(type) => this.setState({sortBy: type})}>
            <Picker.Item label="Title" value="title" />
            <Picker.Item label="Album" value="album" />
            <Picker.Item label="Artist" value="artist" />
          </Picker>
        </View>
        <Text>MusicFiles</Text>
      </View>
    );
  };
};

const styles = StyleSheet.create({
  page: {
    backgroundColor: '#e3f9ff',
    flex: 1,
    alignItems: 'center',
    flexDirection: 'column',
  },
  topBar: {
    height: 40,
    width: sWidth,
    backgroundColor: "white",
    flexDirection: "row",
  },
  sortText: {
    height: 40,
    textAlignVertical: "center",
    marginLeft: sWidth/2-45-65,
  },
  sortPicker: {
    height: 40,
    width: 110,
  },
  sortPickerItem: {
    fontFamily: global.mainFont,
  },
});

App crashes.

My app crashes when getAll function is called.
code am using

   MusicFiles.getAll({
            id : true,
            blured : false,
            artist : true,
            duration : true, //default : true
            cover : true, //default : true,
            title : true,
            cover : true,
            date : true,
            lyrics : true,
            batchNumber : 5, //get 5 songs per batch
            minimumSongDuration : 10000, //in miliseconds,
            fields : ['title','artwork','duration','artist','genre','lyrics','albumTitle']
        }).then(value=>{
            console.log(value)
        })

Request to put the cached album art in a separate folder

This is not an issue, just a feature request. The cached album art is stored in the open inside storage. It would be a better UX if it was stored inside a folder with a .nomedia file so it wouldn't show up in the gallery or other apps that scan media.

Attempt to invoke virtual method [Error]

Trying to fetch all music in my local storage(Internal and SD card} in ComponentDidMount but my app is giving this error.
Error

My code here

react-native :0.48.2
wix-react-native-navigation:1.12.2

Manifest merger failed : uses-sdk:minSdkVersion 16 cannot be smaller than version 17 declared in library [[]:react-native-get-music-files:unspecified]

Got this error after installing library:

:app:processDebugManifest FAILED FAILURE: Build failed with an exception. * What went wrong: Execution failed for task ':app:processDebugManifest'. > Manifest merger failed : uses-sdk:minSdkVersion 16 cannot be smaller than version 17 declared in library [[]:react-native-get-music-files:unspecified] C:\Users\[]\Desktop\[]\[]\[]\[]\MusicPlayer\android\app\build\intermediates\exploded-aar\MusicPlayer\react-native-get-music-files\unspecified\AndroidManifest.xml Suggestion: use tools:overrideLibrary="com.cinder92.musicfiles" to force usage * Try: Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. BUILD FAILED

App Crashes on devices with versions below Marshmallow

Hi @cinder92 . We experienced an app crash on Android Kitkat (API 19) inside the method: getAll().

We couldn't get the specific line on the stacktrace but we noticed that the error happens inside the new Thread() block. We have managed to bypass the issue by removing the block of code inside the new Thread() block and just let the ContentResolver be executed in the Main Thread.

When we did that, the App crash ceased to exist. Do you know why this happens? Also, I'm not sure about this, but is it safe to execute a ContentResolver inside a background thread? I think this causes the app crash. Note: We couldn't get the specific line (stacktrace) because the block was inside a thread. We noticed this error showing up though:

E/MediaPlayer-JNI: QCMediaPlayer mediaplayer NOT present

What do you think about this issue?

Document files

Hello, instead of music files, I need to find pdf, doc etc files in entire storage , I am using RNFetchBlob's FS e.g. RNFetchBlob.fs.stat but I have need to use loop over and over again , because it brings only one level files list and then if there is any directory , you loop again to go in and so on, so I am just wondering if somehow using this dependancy there is anything I can update to bring out other files list as well ?

App crashes with SecurityException: Permission Denial

Hi!
I just installed this package, launched my app and it crashed with the following adb logcat output:

java.lang.SecurityException: Permission Denial: reading com.android.providers.media.MediaProvider uri content://media/external/audio/media from pid=12207, uid=10095 requires android.permission.READ_EXTERNAL_STORAGE, or grantUriPermission()
        at android.os.Parcel.readException(Parcel.java:1959)
        at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:183)
        at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:135)
        at android.content.ContentProviderProxy.query(ContentProviderNative.java:418)
        at android.content.ContentResolver.query(ContentResolver.java:760)
        at android.content.ContentResolver.query(ContentResolver.java:710)
        at android.content.ContentResolver.query(ContentResolver.java:668)
        at com.reactlibrary.RNReactNativeGetMusicFilesModule$1.run(RNReactNativeGetMusicFilesModule.java:133)
        at java.lang.Thread.run(Thread.java:764)

I added both android.permission.READ_EXTERNAL_STORAGE & android.permission.WRITE_EXTERNAL_STORAGE to my react-native project's AndroidManifest and the code inside componentDidMount is the same as the example in this repo.

Can anyone help ?

How can i make MusicFiles.get() Asynchronous?

The library is awesome but it has been really a pain when you execute MusicFiles.get() function as the UI thread hangs up due to processing. To overcome this i did tried using progressbar but its not working out. How can i make it Async??

Path and SongID

Hello,

How can I get path and songId of music?

Aditional Info

  • RN: 0.54.2
  • OS: MacOS High Sierra
  • Simulator and Physical Device (iPhone 6)

Thanks

GetAll returns all the music even though batchNumber specified

I am Using ReactNative - 0.58
It's happening on Android

I am trying to get music on a batch of 5 but android returns all the Music

public getMusicFiles = async () => {
    try {
      await MusicFiles.getAll({
        id: true,
        blured: false,
        artist: true,
        duration: true, //default : true
        cover: true, //default : true,
        title: true,
        batchNumber: 5, //get 5 songs per batch
        minimumSongDuration: 100000, //in miliseconds,
        fields: [
          'title',
          'artwork',
          'duration',
          'artist',
          'genre',
          'lyrics',
          'albumTitle',
        ],
      });
    } catch (err) {
      //eslint-disable-next-line
      console.warn(err, 'error on getting music fie');
    }
  };

I am Listening using DeviceEventEmitter('onBatchReceived') it returns all the music files

Am I Missing Something?

getAll() returns data that no longer exists

I'm using react-native-fs's moveFile method to rename files in my app. The package works correctly (confirmed with file explorer and other music players).

But when I scan after the rename operation,

  • RNAndroidAudioStore.getAll() returns a strange object for the renamed file.
    Note that the path property is the old url which no longer exists. Also there's no cover property.

Screenshot (144)

  • MusicFiles.getAll() on the other hand, entirely ignores the renamed file and doesn't include it in the returned data

Failed at RN 5.1

We upgraded our project to RN 5.1, your lib was failed when running. Can you do something to support us?
Here the log

screen shot 2018-01-24 at 4 40 31 pm

Error with running the application with react-native-get-music-files

When I run react-native run-android I am getting error as

* What went wrong:
Execution failed for task ':app:processDebugManifest'.
> Manifest merger failed : uses-sdk:minSdkVersion 16 cannot be smaller than version 17 declared in
library [:react-native-get-music-files] C:\Users\Yajana\Documents\React-Native\RN\Serenity\node_modules\react-native-get-music-files\android\build\intermediates\library_manifest\debug\AndroidManifest.xml as the library might be using APIs not available in 16
        Suggestion: use a compatible library with a minSdk of at most 16,
                or increase this project's minSdk version to at least 17,
                or use tools:overrideLibrary="com.cinder92.musicfiles" to force usage (may lead to
runtime failures)

JS Thread and UI Thread FPS drops to negative after the native module is called

I have thoroughly checked and debugged my code. The same code works perfectly on iOS with another native module to retrieve music files. But on android as soon as i call this native module my app starts to lag and the FPS drops to 2-10 and some times even negative.

I don't know why is this happening? Are there many jumps across the RN bridge? cause i am sure module is rendering my app to slow down making it unusable.

Code Error in Version 2.0.1

Error in index.js

Code:

const MusicFiles = {
    getAll(options){

        return new Promise((resolve, reject) => {

            if(Platform.OS === "android"){
                RNReactNativeGetMusicFiles.getAll(options,(response) => {
                    resolve(response);
                },(error) => {
                    reject(error);
                });
            }else{
                RNReactNativeGetMusicFiles.getAll(options, (tracks) => {
                    if(tracks.length > 0){
                        resolve(tracks);
                    }else{
                        reject(false);
                    }
                });
            }

        });

    }
}

You should swap the last two param of function RNReactNativeGetMusicFiles.getAll.

The definition of RNReactNativeGetMusicFiles.getAll is

public void getAll(ReadableMap options, final Callback errorCallback, final Callback successCallback)

But the master branch of the repo is right....

Does this package work for iOS, for real?

I was trying to use this package to get all the music files on my device, so following the demo code in the Readme, I used the MusicFiles.getAll() function in componentDidMount, which is working well for Android, but doesn't show me any results for iOS. When I am listing out the tracks like this

.then(tracks => { console.log(tracks) })

, its giving me an Error, Error, you don't have any tracks, while I definitely do have many tracks on my device. Its showing all the tracks on Android, but doesn't work on iOS.

I have my permissions and all set up with NSAppleMusicUsageDescription, but still it doesn't do anything.
Was anybody able to get this working, would really be helpful, if you could guide

I'm on iOS 12.1, react-native 0.57.0 and 2.1.0 of this package

Get all return TypeError: Cannot read property 'getAll' of undefined

this mys script

import {
PermissionsAndroid
} from "react-native";
import MusicFiles from "react-native-get-music-files";

async componentDidMount() {
try {
const granted = await PermissionsAndroid.request(
PermissionsAndroid.PERMISSIONS.READ_EXTERNAL_STORAGE,
{
title: "Listen Music App Storage Permission",
message:
"Listen Music App needs access to your storage " +
"so you can listen music.",
buttonNeutral: "Ask Me Later",
buttonNegative: "Cancel",
buttonPositive: "OK"
}
);
if (granted === PermissionsAndroid.RESULTS.GRANTED) {
console.log("You can use the camera");
} else {
console.log("Camera permission denied");
}
} catch (err) {
console.warn(err);
}
}

_getSongs = () => {
MusicFiles.getAll({
blured: true, // works only when 'cover' is set to true
artist: true,
duration: true, //default : true
cover: false, //default : true,
genre: true,
title: true,
cover: true,
minimumSongDuration: 10000, // get songs bigger than 10000 miliseconds duration,
fields: ["title", "albumTitle", "genre", "lyrics", "artwork", "duration"] // for iOs Version
})
.then(tracks => {
console.log(tracks);
})
.catch(error => {
console.log(error);
});
};

can someone help me ?

onLastBatchReceived event isn't triggered

I'm using RNAndroidAudioStore's getAll method with pagination. The onBatchReceived event is triggered correctly but the onLastBatchReceived callback is never executed. I haven't tested this with MusicFiles yet.

I'm using the master version with react-native 0.59.9 and testing on Android Pie.

Cover folder

Cover images extracted directly to internal storage. I need to change output folder. I don't know can we set because of poor readme... (I can't set it directly in java, i need to set programmatically)

can only read music file from Audio folder

My project info
"react-native": "0.49.3",
"react-native-get-music-files": "^2.1.0",
platform : Android

i wand to read all call recording file from the device and i am also getting some files(.amr) from Audio folder of android
but not all the files

like i have installed two call recording apps in my android phones say (App1 and App2)
and records come calls from both the apps
app1 recorded files are showing in Audio folder and i am able to read those file and other audio players as well
but App2 files are present only in their own created folders so nor i or any other audio player showing the files

does this library scan only Audio folder ???

error: cannot find symbol new RNReactNativeGetMusicFilesPackage(),

My project info
"react-native": "0.49.3",
"react-native-get-music-files": "^2.1.0",
platform : Android

after follow all step i am not able to build the project in android saying bellow error

error: cannot find symbol new RNReactNativeGetMusicFilesPackage(),

can somebody please help me

MusicFiles.getAll does not return anything

Hi, I simply can't get anything out of MusicFiles.getAll...
I tried putting some logs in the module:

if(Platform.OS === "android"){
    console.log('android');
    RNReactNativeGetMusicFiles.getAll(options,(tracks) => {
        console.log('tracks', tracks);
        resolve(tracks);
    },(error) => {
        console.log('error', error);
        resolve(error);
    });
}

this will log 'android' but not 'tracks' or 'error'. I call it this way:

componentDidMount() {
    const test = MusicFiles.getAll({
        id: true,
        blured: false,
        artist: true,
        duration: true, //default : true
        cover: true, //default : true,
        title: true,
        // date: false,
        // lyrics: false,
        batchNumber: 5, //get 1 songs per batch
        minimumSongDuration: 10000, //in miliseconds,
        fields: ['title', 'artist', 'duration']
    });
    console.log('test', test);
}

and it logs this:
conemu64_2018-12-03_20-37-48

Any help is welcome!

Ony mp3 files supported

I have tested this library, I found that this lib is only able to scan for mp3 files on Android MediaStore. Can you do something in the future to support all other kinds of sound files?

Change 'null' values to <unknown> as previous version

Hey Dante,
To keep things same like previous version i suggest for all the fields that return null eg...if metadata of song has no author i think we should return instead of returning null. Its a small change. Can you do the edit?

In real world scenario while making a music player lets say if the library returns string instead of null it would be more easier to design the application without writing a handler for such condition.

P.S : Update is great but it actually broken my app as i made it to work with library returning as String and not null.

Infinite loop getting all musics

Hello,

I'm trying applying on my project to retrieve audio files but when I get it return to me a loop. I'm following docs but doesn't work as expected.

Aditional Info:

RN: 0.54.2
OS: MacOS High Sierra
Device: Simulator and Physical

Gernerting signed apk build error

Execution failed for task ':react-native-get-music-files:verifyReleaseResources'.
> java.util.concurrent.ExecutionException: com.android.builder.internal.aapt.v2.Aapt2Exception: Android resource linking failed
  C:\Users\HD\Documents\ReactNative\Nuuruliman\node_modules\react-native-get-music-files\android\build\intermediates\res\merged\release\values-v26\values-v26.xml:7: error: resource android:attr/colorError not found.
  C:\Users\HD\Documents\ReactNative\Nuuruliman\node_modules\react-native-get-music-files\android\build\intermediates\res\merged\release\values-v26\values-v26.xml:11: error: resource android:attr/colorError not found.
  C:\Users\HD\Documents\ReactNative\Nuuruliman\node_modules\react-native-get-music-files\android\build\intermediates\res\merged\release\values-v26\values-v26.xml:15: error: style attribute 'android:attr/keyboardNavigationCluster' not found.
  C:\Users\HD\Documents\ReactNative\Nuuruliman\node_modules\react-native-get-music-files\android\build\intermediates\res\merged\release\values-v28\values-v28.xml:7: error: resource android:attr/dialogCornerRadius not found.
  C:\Users\HD\Documents\ReactNative\Nuuruliman\node_modules\react-native-get-music-files\android\build\intermediates\res\merged\release\values-v28\values-v28.xml:11: error: resource android:attr/dialogCornerRadius not found.
  C:\Users\HD\Documents\ReactNative\Nuuruliman\node_modules\react-native-get-music-files\android\build\intermediates\res\merged\release\values\values.xml:2711: error: resource android:attr/fontStyle not found.
  C:\Users\HD\Documents\ReactNative\Nuuruliman\node_modules\react-native-get-music-files\android\build\intermediates\res\merged\release\values\values.xml:2712: error: resource android:attr/font not found.
  C:\Users\HD\Documents\ReactNative\Nuuruliman\node_modules\react-native-get-music-files\android\build\intermediates\res\merged\release\values\values.xml:2713: error: resource android:attr/fontWeight not found.
  C:\Users\HD\Documents\ReactNative\Nuuruliman\node_modules\react-native-get-music-files\android\build\intermediates\res\merged\release\values\values.xml:2714: error: resource android:attr/fontVariationSettings not found.
  C:\Users\HD\Documents\ReactNative\Nuuruliman\node_modules\react-native-get-music-files\android\build\intermediates\res\merged\release\values\values.xml:2715: error: resource android:attr/ttcIndex not found.
  error: failed linking references.

[iOS] No callback response, Possible Unhandled Promise Rejection (id: 0)

Hello,

I set up the library on the app I'm currently working on, but get this warning message : Possible Unhandled Promise Rejection (id: 0). I don't get any callback nor error...

Any clue?

I set in my info.plist the following key :

<key>NSAppleMusicUsageDescription</key>
	<string>Select and play using with your remote</string>

I well receive the permission ask, then nothing. Do I miss something to do ?

READ FROM SD CARD

I have successfully retrieved songs from my phone's internal storage . why can't I retrieve songs from my sd card? I am using Android v6.0.1

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.