2014-01-23 2 views
1

В documentation он говорит:Загрузка Soundpool с аудио из файла расширения APK

Если вы используете файлы расширение для хранения мультимедийных файлов, ZIP файл по-прежнему позволяет использовать Android вызовов воспроизведения СМИ, укажите элементы управления смещением и длиной (например, MediaPlayer.setDataSource() и SoundPool.load()).

У меня есть 10 небольших файлов .ogg, и я хочу использовать SoundPool.load (FileDescriptor fd, long offset, long length, int priority) для загрузки этих аудиофайлов. Я написал код, но когда я запускаю его я получаю сообщение об ошибке:

«Невозможно загрузить образец: (нулевой)»

, и, очевидно, звук не воспроизводится. Вот что я пытался:

public class MainActivity extends Activity { 

    SoundPool sounds; 
    boolean loaded = false; 
    int streamID; 
    int theId; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     System.gc(); 
     setContentView(R.layout.activity_main); 
     sounds = new SoundPool(10, AudioManager.STREAM_MUSIC,0); 
     sounds.setOnLoadCompleteListener(new SoundPool.OnLoadCompleteListener() { 
      @Override 
      public void onLoadComplete(SoundPool sp, int sid, int status) { 
       loaded = true; 
     }}); 
     loadSounds(); 
     playSound(theID); 
    } 

    private void loadSounds() { 
     AssetFileDescriptor descriptor = null; 
     try { 
      descriptor = getFileDescriptor(this, "audio_files/end_credits.ogg"); 
     } catch (Exception e) { 
     } finally { 
      if (descriptor != null) 
       try{descriptor.close();} catch (IOException e) {} 
     } 
    theId = sounds.load(descriptor.getFileDescriptor(), descriptor.getStartOffset(), descriptor.getLength(), 1); 
} 
    public static AssetFileDescriptor getFileDescriptor(Context ctx, String path) { 
     AssetFileDescriptor descriptor = null; 
     try { 
      ZipResourceFile zip = APKExpansionSupport.getAPKExpansionZipFile(ctx, 4, -1); 
      descriptor = zip.getAssetFileDescriptor(path); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
     return descriptor; 
    } 
    private void playSound(int soundID){ 
     if(loaded){ 
      streamID = sounds.play(soundID, 1, 1, 1, 0, 1);} 
    } 
} 

ответ

0

ОК, похоже, причина в том, что звук не загружается достаточно быстро. Я положил playSound (theID); сразу после loadSounds(); в то время как для его загрузки требуется несколько секунд для загрузки. Но код работает до этого момента.