Работая над тестовым проектом, моя текущая цель — использовать int, чтобы указать, какой mp3-файл будет воспроизводиться при инициализации приложения, не зная заранее названия саундтреков (проблема масштабируемости, поскольку я хочу иметь возможность добавлять новые mp3-файлы в пул рандомизации, не касаясь кода в будущем). Однако, когда я запускаю следующий код, возникает ошибка со следующим описанием:
ошибка: для метода create(MainActivity,String) не найден подходящий метод MediaPlayer.create(Context,Uri) неприменим (несоответствие аргументов; строка не может быть преобразована в Uri) метод MediaPlayer.create(Context,int) неприменим (аргумент несоответствие; строка не может быть преобразована в int)
import android.content.res.AssetManager;
import android.content.res.Resources;
import android.media.MediaPlayer;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.widget.RecyclerView;
import android.widget.ArrayAdapter;
import java.io.InputStream;
import java.lang.reflect.Field;
import java.util.ArrayList;
public class MainActivity extends AppCompatActivity {
RecyclerView bensonRecycler;
ArrayList<String> arrayList;
ArrayAdapter bensonAdapter;
MediaPlayer bensonPlayer;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
AssetManager assetManager = getAssets();
String[] audios = assetManager.list("sound");
int i = 1;
final MediaPlayer mp = MediaPlayer.create(this, audios[i]);
mp.start();
}
}
Мои активы файлов mp3 имеют следующую структуру:
Итак, мой вопрос: что мне делать, чтобы используйте int i, чтобы указать, какой саундтрек mp3 воспроизводить (не зная заранее названия саундтреков mp3) среди массива mp3-ассетов? (Я должен использовать переменную, чтобы указать саундтрек для воспроизведения в этом тестовом проекте)
Я хотел бы воспроизвести звук в приложении для Android, название отредактировано, большое спасибо.
Папка «активы» на самом деле вовсе не папка, а связанный поток байтов. Вот почему существует Управляющий активами.
AssetManager
Provides access to an application's raw asset files; see Resources for the way most applications will want to retrieve their resource data. This class presents a lower-level API that allows you to open and read raw files that have been bundled with the application as a simple stream of bytes.
Управляющий активами позволяет нам достаточно легко построить строковый массив файлов, и мы можем рассматривать эти файлы как принадлежащие небольшой файловой системе. Хитрость заключается в том, как представить эти файлы (на самом деле поток байтов) в MediaPlayer
, чтобы звук мог воспроизводиться на основе индекса в звуковых ресурсах.
Следующий код будет воспроизводить индексированный звук. Комментарии в коде объясняют, как это работает. Для проверки я только что создал простой макет с тремя кнопками, которые воспроизводят звук с индексами 0, 1 и 2.
Основная деятельность
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
private void playSoundFromAssets(int index) {
try {
AssetManager assetManager = getAssets();
String[] audios = assetManager.list(SOUNDFILE_PATH);
if (audios == null || index >= audios.length) {
return;
}
String soundFilePath = new File(SOUNDFILE_PATH, audios[index]).getPath();
AssetFileDescriptor afd = getAssets().openFd(soundFilePath);
final MediaPlayer mp = new MediaPlayer();
/* For API 24+, we can just use the AssetFileDescriptor to play the sound. However,
for API 23-, we can't use the AssetFileDescriptor directly but can retrieve a
FileDescriptor from it that points to the beginning of our assets. The offset
and length from the AssetFileDescriptor serve for the FileDescriptor as well.
*/
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
mp.setDataSource(afd);
} else {
FileDescriptor fd = afd.getFileDescriptor();
Log.d("MainActivity", String.format("<<<< %s %d %d", soundFilePath, afd.getStartOffset(), afd.getLength()));
mp.setDataSource(fd, afd.getStartOffset(), afd.getLength());
// One might think that mp.setDataSource(fd) would play the sound file we want, but
// it actually plays all sound files one after another. It seems that fd is a
// FileDescriptor that points to the beginning of the assets.
}
afd.close();
mp.prepare();
mp.start();
} catch (IOException e) {
e.printStackTrace();
}
}
public void playSound(View view) {
switch (view.getId()) {
case R.id.play0:
playSoundFromAssets(0);
break;
case R.id.play1:
playSoundFromAssets(1);
break;
case R.id.play2:
playSoundFromAssets(2);
break;
}
}
private static final String SOUNDFILE_PATH = "sound";
}
Вы хотите воспроизвести звук в Android Studio или приложении для Android? Смотрите название