1

我们的 APP 与具有 FireOS 5.1.x 的旧版本 Kindle Fire HD 配合良好。APP 仅在装有 FireOS 7.3.1.4 的 Kindle HD 8(第 10 代)上存在问题。

这个问题是随机的,有时应用程序运行良好,但有时应用程序表现不佳。

FireOS 7.3.1.4 使用 android API LEVEL 28 (Android Pie)

我们有具有 3 个媒体播放器的音乐 APP,我们在我们的 APP 中使用 Android 标准媒体播放器。

所有 3 个媒体播放器同时运行,我们在每个媒体播放器上运行的曲目具有相同的持续时间。

我们在后台线程中进行所有处理,例如在所有媒体播放器上播放音乐,因此总共有 3 个线程并行运行。

由于某些故障,问题出在 Kindle HD 8(第 10 代)上,在第 1 个媒体播放器上运行的轨道与第 2 个媒体播放器上的轨道重叠或超出第 2 个媒体播放器上的轨道。

总的来说,我的意思是 3 个媒体播放器上的曲目不同步,即使它们具有相同的持续时间并且它们同时开始。

还有一件事歌曲开始时没有问题,它们在开始时是同步的,但在大约 50 秒后它们开始变得不同步。

这个问题发生在随机时间。

再次应用程序在旧版本的 Kindle Fire 平板电脑和三星手机上运行良好,问题只发生在 Kindle HD 8(第 10 代)上。

那么,是否有人可以帮助我们就新 Kindle Fire HD 上发生的情况提供任何解决方案?我将非常感谢您的帮助。

我的猜测是,运行媒体播放器的后台线程会随机出现一些问题,导致媒体播放器不同步。但我不知道如何纠正这种行为

请帮助我们,因为我们被困在这个问题上,因此我们的用户无法在新的 Kindle Fire HD 8 平板电脑上使用我们的应用程序。谢谢

以下是我们拥有的 3 个媒体播放器的一些代码片段

我们创建一个新的媒体播放器并在其中添加一个轨道。代码中的 for 循环执行了 3 次。

protected void initTracks(boolean high) {

        this.mWavPlayers = new ArrayList<>();

        HashMap<TrackType, String> map = null;

        if (high) {
            map = mPathHigh;
        } else {
            map = mPathLow;
        }

        try {
            for (Map.Entry<TrackType, String> entry : map.entrySet()) {
                MediaPlayer player = new MediaPlayer();
                player.setDataSource(entry.getValue());
                player.prepare();
                mWavPlayers.add(new WavPlayerItem(entry.getValue(), entry.getKey(), player));
                if (entry.getKey().equals(TrackType.BACKING_MUSIC)) {
                    mDuration = player.getDuration();
                }
            }
        } catch (IOException e) {
            Log.e(TAG, "Map exception", e);
        }
    }

该方法创建并启动后台线程,在for循环中创建了3个后台线程

 protected void sendState(WavPlayerEvent.State state) {
       
 CyclicBarrier barrier = new CyclicBarrier(mWavPlayers.size() + 1);
  
        for (WavPlayerItem item : mWavPlayers) {
            MediaPlayer player = (MediaPlayer) item.getPlayer();
            new Thread(new SyncedStateRunnable(state, player, barrier, STATE.PLAYER)).start();
        }
    }

此方法有一个 run 方法,在 start() 中启动播放器

    private class SyncedStateRunnable<T> implements Runnable {
        private WavPlayerEvent.State state;
        private MediaPlayer player;
        private NativeSuperpoweredRecorder recorder;
        private CyclicBarrier cyclicBarrier;
        private STATE entityState;

        SyncedStateRunnable(WavPlayerEvent.State state, T entity, CyclicBarrier cyclicBarrier, STATE entityState) {
            this.state = state;
            this.cyclicBarrier = cyclicBarrier;
            this.entityState = entityState;
            switch (entityState) {
                case PLAYER:
                    player = (MediaPlayer) entity;
                    break;
            }
        }

        @Override
        public void run() {
            awaitBarrier();
            switch (state) {
                case PLAYING:
                    start();
                    break;
                case STOP:
                    stop();
                    break;
                case PAUSE:
                    pause();
                    break;
            }
        }
        private void start() {
            switch (entityState) {
                case PLAYER:
                    try {
                        player.start();
                        Log.d(TAG, "player.start();");
                    } catch (IllegalStateException e) {
                        e.printStackTrace();
                    }
                    break;
            }
        }
4

2 回答 2

0

我会检查控制 minSdkVersion 和 targetSdkVersion 的文件或模块并对其进行修改。

于 2020-08-16T15:43:39.103 回答
0

您是否修改了 minSdkVersion 并保持 targetSdkVersion 不变?

于 2020-08-16T16:00:32.037 回答