Android Asset Manager не может загрузить активы файла wav из каталога ресурсов - PullRequest
0 голосов
/ 26 мая 2019

У меня есть несколько файлов wav, которые я хочу загрузить с помощью менеджера ресурсов Android. К сожалению, каждый раз, когда я пытаюсь это сделать, я получаю следующую ошибку

java.io.FileNotFoundException: аудио-файл.wav не найден

Я хотел бы добавить следующие ресурсы в пул звуков Android.

Это изображение моего приложения.

Настройка IDE приложения

Мой код

public class MyActivity extends AppCompatActivity {

  protected abstract Fragment createFragment();

  @LayoutRes
  protected int getLayoutRes() {
    return R.layout.activity_fragment;
  }

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(getLayoutRes());

    FragmentManager fm = getSupportFragmentManager();
    Fragment fragment = fm.findFragmentById(R.id.fragment_container);
    if (fragment == null) {
      fragment = new MyActivityFragment();
      fm.beginTransaction().add(R.id.fragment_container, fragment).commit();
    }
  }

}

Фрагмент

    public class MyActivityFragment extends Fragment {

       private static final String TAG = "MyFragment";
       private static final String SOUNDS_FOLDER = "sample_sounds";
       private static final int MAX_SOUNDS = 5;


    private final AssetManager mAssetManager;

      private final List<Integer> sounds = new ArrayList<>();
      private SoundPool mSoundPool; 

      @Override
      public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setRetainInstance(true);
        this.mAssetManager = getActivity().getAssets();
        this.loadAssets();
        mSoundPool = this.buildSoundPool();
      }

      @Override
      public void onDestroy() {
        super.onDestroy();
        mSoundPool.release();
      }


  private SoundPool buildSoundPool() {
    SoundPool.Builder builder = new SoundPool.Builder();
    builder.setMaxStreams(MAX_SOUNDS);
    builder.setAudioAttributes(new AudioAttributes.Builder()
        .setUsage(AudioAttributes.USAGE_MEDIA)
        .setContentType(AudioAttributes.CONTENT_TYPE_MUSIC)
        .build());
    return builder.build();
  }

  private void loadAssets() {
    try {
      String[] soundNames = mAssetManager.list(SOUNDS_FOLDER);
      for (String soundName : soundNames) {
        sounds.add(load(soundName));
      }
    } catch (IOException ioe) {
      Log.e(TAG, "Could not list assets");
    }
  }

   private int load(String soundName) throws IOException {
      AssetFileDescriptor afd = mAssetManager.openFd(soundName);
      int soundId = mSoundPool.load(afd, 1);
      return soundId;
   }
}

Этот метод вызывает FileNotFoundException.

private int load(String soundName) throws IOException {
    AssetFileDescriptor afd = mAssetManager.openFd(soundName);
    int soundId = mSoundPool.load(afd, 1);
    return soundId;
  }

Эта строка точно

AssetFileDescriptor afd = mAssetManager.openFd(soundName);

Я просмотрел другие посты, связанные с этой проблемой, но самой последней записи не менее 3 лет. Я не знаю, что я делаю не так. Буду признателен за любую помощь.

1 Ответ

0 голосов
/ 26 мая 2019

IIRC, list() возвращает имена элементов в каталоге ресурсов. Он не возвращает путей этих элементов.

Попробуйте заменить:

AssetFileDescriptor afd = mAssetManager.openFd(soundName);

с:

AssetFileDescriptor afd = mAssetManager.openFd(SOUND_FOLDER+"/"+soundName);
...