Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/373.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Kindle Fire HD 8(第10代)平板电脑FireOS 7.3.1.4上的音乐应用程序存在兼容性问题-发生了什么?_Java_Android_Kindle Fire_Fireos - Fatal编程技术网

Java Kindle Fire HD 8(第10代)平板电脑FireOS 7.3.1.4上的音乐应用程序存在兼容性问题-发生了什么?

Java Kindle Fire HD 8(第10代)平板电脑FireOS 7.3.1.4上的音乐应用程序存在兼容性问题-发生了什么?,java,android,kindle-fire,fireos,Java,Android,Kindle Fire,Fireos,我们的应用程序在使用FireOS 5.1.x的旧版本Kindle Fire HD时运行良好。应用程序仅在FireOS 7.3.1.4的Kindle HD 8(第10代)上出现问题。 这个问题是随机的,有时应用程序工作正常,但有时应用程序表现不好 FireOS 7.3.1.4使用android API级别28(android Pie) 我们的音乐应用程序有3个媒体播放器,我们在应用程序中使用的是Androids标准媒体播放器 所有3个媒体播放器同时运行,我们在每个媒体播放器上运行的曲目具有相同的持

我们的应用程序在使用FireOS 5.1.x的旧版本Kindle Fire HD时运行良好。应用程序仅在FireOS 7.3.1.4的Kindle HD 8(第10代)上出现问题。

这个问题是随机的,有时应用程序工作正常,但有时应用程序表现不好

FireOS 7.3.1.4使用android API级别28(android Pie)

我们的音乐应用程序有3个媒体播放器,我们在应用程序中使用的是Androids标准媒体播放器

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

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

问题出现在Kindle HD 8(第10代)上,因为出现了一些故障,第一个媒体播放器上运行的曲目与第二个媒体播放器上的曲目重叠,或者超出了第二个媒体播放器上的曲目

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

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

该问题在随机时间发生。

同样,该应用程序在旧版本的KindleFire平板电脑和三星手机上运行良好,问题只发生在KindleHD8(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);
        }
    }
此方法有一个run方法,用于在start()中指定播放器的start


我会检查控制MinSDK版本和
targetSdkVersion并对其进行了修改。

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

您是否修改了minSdkVersion并使其保持原样?

您是否修改了minSdkVersion并使其保持原样?

我确实将targetSdkVersion从26提高到了API级别28,但问题仍然存在:(.我的minSdkVersion是API级别21,我确实将targetSDKVersion从26提高到了API级别28,但问题依然存在:(.我的minSdkVersion是API级别21,我保持minSdkVersion不变,修改的targetSdkVersionI保持minSdkVersion不变,修改的targetSDKVersion不变
 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();
        }
    }
    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;
            }
        }