Search code examples
androidaudiomedia-playermp3

Android MediaPlayer Error(1, -2147483648) when playing an mp3 locally


Shortly after Android 4.4 came out my code which has been working correctly since 2.2 suddenly went buggy.

My code will query the music database for a given music file. The path is returned in the query and this path is then passed onto the MediaPlayer.

Code:

String uri = "content://media/internal/audio/media";
String[] columns = [audio_id as _id, title, album, artist, album_id, _data];
String where = "album = 'XX'";
Cursor c = this.getContentResolver().query(uri, columns, where, null, MediaColumns.TITLE);
String musicPath = c.getString(5);
// musicPath is "/storage/emulated/0/Music/The XX/Islands.mp3"

player.reset();
player.setDataSource(musicPath);
player.setAudioStreamType(AudioManager.STREAM_MUSIC);
player.prepareAsync();

I end up with the useless Error(1, -2147483648) message in my LogCat.

I've also tried replacing

player.setDataSource(musicPath);

with

FileInputStream fileInputStream = new FileInputStream(musicPath);
player.setDataSource(fileInputStream.getFD());
fileInputStream.close();

But this produces a FileNotFoundException on the new FileInputStream(...):

java.io.FileNotFoundException: /storage/emulated/0/Music/The XX/Islands.mp3: open failed: EACCES (Permission denied)

This is interesting because the path returned by the query begins with "/storage/emulated/..." but if I look in the DDMS view in Eclipse the actual path is "/mnt/shell/emulated/...". Is this normal?

Despite that, if I change the path prefix manually to what I see in the file explorer, I still get a FileNotFoundException on the new FileInputStream(...):

java.io.FileNotFoundException: /mnt/shell/emulated/0/Music/The XX/Islands.mp3: open failed: EACCES (Permission denied)

Same exception. What is with this Permission denied business? Up until KitKat it was working fine. I've also since added the permission :

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

My app has this line in the manifest:

<uses-sdk android:minSdkVersion="8" android:targetSdkVersion="18" />

Has anybody seem something similar and found a solution to this unknown error? The mp3s that I am trying to play work fine in Play Music and another music player app, thus leading me to believe the problem is not a missing codec.

Thanks Sean

EDIT: I've checked immediately after the content query if the file exists and the path returned does not.

File f = new File(musicPath);
boolean exists = f.exists();  // false

How is this possible? I've tried querying internal media instead but that returns no results (as expected)


Solution

  • I got around this with the (unfortunate) solution of adding a write permission to the app.

    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    

    Apparently this is necessary from 4.4 onward. Can anybody confirm or deny this?

    Sean