3

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)

sean.net
  • 735
  • 8
  • 25

1 Answers1

0

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

sean.net
  • 735
  • 8
  • 25