Sounds from the phone card in the emulator are not played accordingly, and for some reason on some models. Here is the error that initializes each sound when the application starts:

04-10 12:21:44.802: WARN/MediaPlayer(3651): info/warning (1, 26) 04-10 12:21:44.832: ERROR/PlayerDriver(31): Command PLAYER_PREPARE completed with an error or info PVMFErrResource 04-10 12:21:44.832: ERROR/MediaPlayer(3651): error (1, -17) 04-10 12:21:44.842: WARN/System.err(3651): java.io.IOException: Prepare failed.: status=0x1 04-10 12:21:44.852: WARN/System.err(3651): at android.media.MediaPlayer.prepare(Native Method) 04-10 12:21:44.852: WARN/PlayerDriver(31): PVMFInfoErrorHandlingComplete 04-10 12:21:44.852: WARN/System.err(3651): at com.example.util.AudioClass.<init>(AudioClass.java:28) 04-10 12:21:44.852: WARN/System.err(3651): at com.example.SoundClass.getAudioClip(SoundClassjava:747) 04-10 12:21:44.862: WARN/System.err(3651): at com.example.SoundClass.onCreate(SoundClass.java:113) 04-10 12:21:44.862: WARN/System.err(3651): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047) 04-10 12:21:44.862: WARN/System.err(3651): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2459) 04-10 12:21:44.862: WARN/System.err(3651): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2512) 04-10 12:21:44.872: WARN/System.err(3651): at android.app.ActivityThread.access$2200(ActivityThread.java:119) 04-10 12:21:44.872: WARN/System.err(3651): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1863) 04-10 12:21:44.872: WARN/System.err(3651): at android.os.Handler.dispatchMessage(Handler.java:99) 04-10 12:21:44.872: WARN/System.err(3651): at android.os.Looper.loop(Looper.java:123) 04-10 12:21:44.872: WARN/System.err(3651): at android.app.ActivityThread.main(ActivityThread.java:4363) 04-10 12:21:44.882: WARN/System.err(3651): at java.lang.reflect.Method.invokeNative(Native Method) 04-10 12:21:44.882: WARN/System.err(3651): at java.lang.reflect.Method.invoke(Method.java:521) 04-10 12:21:44.882: WARN/System.err(3651): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860) 04-10 12:21:44.882: WARN/System.err(3651): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618) 04-10 12:21:44.882: WARN/System.err(3651): at dalvik.system.NativeStart.main(Native Method) 04-10 12:21:44.902: DEBUG/Addon(3651): /sdcard/Directory/Pack/sound.mp3 

Here at the end I log in and show that the file is there.
04-10 12: 21: 44.902: DEBUG / Addon (3651): /sdcard/Directory/Pack/sound.mp3

Everything works on my Desire HD

I connect the files in the program as follows:

 sound1 = getAudioClip("sound1.mp3"); sound2 = getAudioClip("sound2.mp3"); 

Here is the geth code:

 protected AudioClass getAudioClip(String FileName) { return new AudioClass(FileName, "Name"); } 

Here is the class itself:

 public class AudioClass { private MediaPlayer mPlayer; private String name; private boolean mPlaying = false; private boolean mLoop = false; private String SDCardPath = Environment.getExternalStorageDirectory().getAbsolutePath() + "/Directory/"; public AudioClass(String FileName, String DirName) { mPlayer = new MediaPlayer(); try { mPlayer.setDataSource(SDCardPath + AddonName + "/" + FileName); mPlayer.prepare(); } catch (IOException e) { e.printStackTrace(); Log.d("Addon",SDCardPath + AddonName + "/" + FileName); } } public synchronized void start () { mPlaying = true; mPlayer.start(); mPlayer.setLooping(true); } public synchronized void stop() { try { mLoop = false; if ( mPlaying ) { mPlaying = false; mPlayer.pause(); } } catch (Exception e) { System.err.println("AduioClip::stop " + name + " " + e.toString()); } } public synchronized void loop () { mLoop = true; mPlaying = true; mPlayer.start(); } public void release () { if (mPlayer != null) { mPlayer.release(); mPlayer = null; } } } 

    1 answer 1

    And at what point is an instance of the AudioClass being created? Maybe it is created when creating an application at some "bad" moment when the application is not ready yet? Also, performing I / O in the constructor is a damn bad idea.

    I was also alarmed by the text from the documentation :

    After setting the datasource, you need to either call prepare () or prepareAsync ()