Reputation: 6983
I have an audio file in my assets directory. assets/audio/dance.mp3.
If I run context.getAssets().list("audio"); it shows up.
But when I try to use MediaPlayer.create(context,uri) it always fails and returns null.
none of this seems to work
private void tryLoad(String path,Context context)
{
Uri uri = Uri.parse(path);
this.audioPlayer = MediaPlayer.create(context,uri);
if (this.audioPlayer == null)
{
Log.d(TAG, "loadAudio: audioPlayer is null. current assets"+ uri.toString()) ;
}
else
{
Log.d(TAG, "loadAudio: WORKED"+ uri.toString()) ;
}
}
public void loadAudio(Context context)
{
if (this.audioPlayer != null)
return;
if (this.audioFile != null && this.audioFile.length() >0)
{
try
{
tryLoad("/dance.mp3",context);
tryLoad("dance.mp3",context);
tryLoad("audio/dance.mp3",context);
tryLoad("/audio/dance.mp3",context);
tryLoad("assets/audio/dance.mp3",context);
tryLoad("/assets/audio/dance.mp3",context);
tryLoad("\\dance.mp3",context);
tryLoad("dance.mp3",context);
tryLoad("audio\\dance.mp3",context);
tryLoad("\\audio\\dance.mp3",context);
tryLoad("assets\\audio\\dance.mp3",context);
tryLoad("\\assets\\audio\\dance.mp3",context);
}
catch (Exception e)
{
Log.d(TAG, "loadAudio exception: " + e.getMessage());
}
}
}
Upvotes: 5
Views: 8846
Reputation: 11
you cannot call mp.setDataSource(afd.getFileDescriptor()); on an asset file as it will play all the assets. Instead follow the solution in this thread: Play audio file from the assets directory
Upvotes: 1
Reputation: 3585
You need to put the file in the res/raw
folder and then loading it with:
MediaPlayer mp = MediaPlayer.create(context, R.raw.sound_file_1);
From: Android documentation
Upvotes: 0
Reputation: 1327
I have asked something like this question, look at this post MediaPlayer issue between raw folder and sdcard on android. I hope this help you
Upvotes: 1
Reputation: 54725
I think you can do it because the MediaPlayer
expects an URI and it's impossible to create an URI for an assets file. Try creating a MediaPlayer
object and setting a data source to it using the MediaPlayer.setDataSource(FileDescriptor)
method. You can get the FileDescriptor
object using the AssetManager.openFd()
method and then calling the AssetFileDescriptor.getFileDescriptor()
method for the returned object.
I haven't tried this solution, so it's just an idea. But I hope it'll work.
Upvotes: 3