Я создаю приложение для фортепиано в Android. Я использовал SoundPool
для загрузки аудиофайла, а затем с помощью onTouchListener
я получаю идентификатор кнопки для воспроизведения соответствующего аудиофайла. Когда я запускаю приложение, оно работает нормально. Но когда я быстро нажимаю кнопку, я получаю эту ошибку ..
E/AudioTrack: AudioFlinger could not create track, status: -12
E/SoundPool: Error creating AudioTrack
Когда я искал здесь решение, я обнаружил, что оно происходит, потому что приложению не хватает памяти. Решением стал вызов метода soundPool.release()
после завершения работы. Но я не уверен, где я должен вызывать функцию релиза в моем коде. Как я должен правильно вызвать функцию релиза в моем коде. Как мне решить эту ошибку?
вот код, который я использую ..
PianoKey. java
public class PianoKey extends AppCompatActivity {
public Activity activity;
private SoundPool myPianoSounds;
private int mySoundId;
private int myStreamId;
private int myViewId;
private Button myButton;
private int soundClip;
private Rect rect;
private View.OnTouchListener myTouchListener;
public PianoKey(){
}
public PianoKey(Activity a, Context context, int soundID, int viewID, SoundPool pianoSounds){
this.activity = a;
mySoundId = soundID;
myViewId = viewID;
myPianoSounds = pianoSounds;
soundClip = myPianoSounds.load(context, mySoundId,1);
myButton = (Button)this.activity.findViewById(viewID);
myTouchListener = new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent e) {
myButton.getParent().requestDisallowInterceptTouchEvent(true);
rect = new Rect(myButton.getLeft(), myButton.getTop(), myButton.getRight(), myButton.getBottom());
if(e.getAction() == MotionEvent.ACTION_DOWN){
myStreamId = myPianoSounds.play(soundClip,1,1,1,0,1);
}
if(e.getAction() == MotionEvent.ACTION_MOVE){
if(!rect.contains(v.getLeft() + (int) e.getX(), v.getTop() + (int) e.getY())){
myPianoSounds.setVolume(myStreamId, 0.1f, 0.1f);
new android.os.Handler().postDelayed(
new Runnable() {
public void run() {
myPianoSounds.stop(myStreamId);
}
},
300);
}
}
if(e.getAction() == MotionEvent.ACTION_UP){
// myPianoSounds.setVolume(myStreamId, 0.1f, 0.1f);
new android.os.Handler().postDelayed(
new Runnable() {
@Override
public void run() {
myPianoSounds.stop(myStreamId);
}
},
500);
}
return true;
}
};
myButton.setOnTouchListener(myTouchListener);
}
}
MainActivity. Java
public class MainActivity extends AppCompatActivity {
private HorizontalScrollView scrollView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
scrollView = findViewById(R.id.scrollView);
int[] soundFiles = {
R.raw.c_3,R.raw.c_black3,R.raw.d_3,R.raw.d_black3,R.raw.e_3,R.raw.f_3,R.raw.f_black3,R.raw.g_3,R.raw.g_black3,R.raw.a_3,R.raw.a_black3,R.raw.b_3,
R.raw.c_4,R.raw.c_black4,R.raw.d_4,R.raw.d_black4,R.raw.e_4,R.raw.f_4,R.raw.f_black4,R.raw.g_4,R.raw.g_black4,R.raw.a_4,R.raw.a_black4,R.raw.b_4,
R.raw.c_5,R.raw.c_black5,R.raw.d_5,R.raw.d_black5,R.raw.e_5,R.raw.f_5,R.raw.f_black5,R.raw.g_5,R.raw.g_black5,R.raw.a_5,R.raw.a_black5,R.raw.b_5,
};
int [] viewId = {
R.id.p1,R.id.b1, R.id.p2, R.id.b2, R.id.p3, R.id.p4,R.id.b3,R.id.p5, R.id.b4,R.id.p6,R.id.b5,R.id.p7,
R.id.p8,R.id.b6, R.id.p9, R.id.b7, R.id.p10, R.id.p11,R.id.b8,R.id.p12, R.id.b9,R.id.p13,R.id.b10,R.id.p14,
R.id.p15,R.id.b11, R.id.p16, R.id.b12, R.id.p17, R.id.p18,R.id.b13,R.id.p19, R.id.b14,R.id.p20,R.id.b15,R.id.p21};
SoundPool octave3Sounds = new SoundPool.Builder().setMaxStreams(20).build();
SoundPool octave4Sounds = new SoundPool.Builder().setMaxStreams(20).build();
SoundPool octave5Sounds = new SoundPool.Builder().setMaxStreams(20).build();
for(int i=0; i<12; i++){
PianoKey key = new PianoKey(this, this, soundFiles[i], viewId[i],octave3Sounds);
}
for(int i=12; i<24; i++){
PianoKey key = new PianoKey(this, this, soundFiles[i], viewId[i],octave4Sounds);
}
for(int i=24; i<36; i++){
PianoKey key = new PianoKey(this, this, soundFiles[i], viewId[i],octave5Sounds);
}
}
}