有没有办法让像getBufferSizeInFrames()这样的函数可以在较低的API上运行? [Android,AudioTrack]

时间:2017-01-01 19:36:08

标签: java android buffer backwards-compatibility audiotrack

我正在为Android制作一款可以正常运行的应用,但仅适用于Android 6+设备。原因是我在其中使用了一个需要 API 23 的方法,因此当我在我的Android JB手机(Jelly Bean是API 17)上测试它时,它会在到达那段代码时崩溃。 该方法是' getBufferSizeInFrames()', AudioTrack 类的一部分。我正在努力以其他方式做到这一点而我的问题是,没有这个功能有没有办法做到这一点?例如,创建另一个执行相同操作但不需要API 23的函数。

以下是我在MainActivity.java中的代码的一部分,其中有两种方法可供使用。如果你想要完整的代码,这是我在GitHub上的项目存储库:https://github.com/allexks/RandomMelodyAndroid

提前致谢!

public class MainActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    // UNRELATED CODE ...



    switchPlay.setOnCheckedChangeListener(
            new CompoundButton.OnCheckedChangeListener() {

                @Override
                public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                    if (isChecked && track != null) {
                        track.setLoopPoints(0, track.getBufferSizeInFrames(), -1);
                        track.play();
                    }
                    else {
                        if(track != null) track.stop();
                    }
                }
            }

    );
}

private AudioTrack track;

void setTrack(AudioTrack adt) {

    boolean wasPlaying = false;
    if(track != null) {
        wasPlaying = track.getPlayState() == AudioTrack.PLAYSTATE_PLAYING;
        track.stop();
    }
    track = adt;
    if(wasPlaying) {
        track.setLoopPoints(0, track.getBufferSizeInFrames(), -1);
        track.play();
    }
}

}

0 个答案:

没有答案