3

バックグラウンドサービスで実行されているメディアプレーヤーがあります。MP3ファイルは、デスクトップ上のサーバーからTCPに設定されます。アプリをデバッグするとき、曲は送受信されます。曲のセレクションは、3つのアクティビティで構成されています。アルバムリスト(リストビュー)アクティビティでは、曲リスト(リストビュー)アクティビティに移動します。チェックボックスを選択し、選択時に再生ボタンをクリックして曲を選択します。再生ボタンはサービスにバインドされ、曲はtcpを介して要求されます。すべての曲は電話のストレージに追加されます。これは、tcpを介して設定されたbyte []を受け取るメソッドです(これはmyMediaPlayerクラス内の形式です:

public void AddSong(byte[] toParse, String songName)
        {
            File cacheDir = new File(android.os.Environment.getExternalStorageDirectory(),"MusicStreamCache");
            if(!cacheDir.exists())
                cacheDir.mkdirs();

            File temp = new File(cacheDir, songName);
            FileOutputStream fos;
            try {
                fos = new FileOutputStream(temp);
                fos.write(toParse);
                fos.close();
            } catch (FileNotFoundException e) {

                e.printStackTrace();
            } catch (IOException e) {

                e.printStackTrace();
            }
            songs.add(temp);
            if(!mediaPlayer.isPlaying() && !isPaused)
            {
                MediaPlay();
            }

        }

        public void AddSong(File filein)
        {
            filein.deleteOnExit();
            songs.add(filein);
            if(!mediaPlayer.isPlaying() && !isPaused && CurrentSong == 0)
            {
                MediaPlay();
            }
        }

        public void MediaPlay()
        {
            if(!mediaPlayer.isPlaying() && CurrentSong <= songs.size())
            {
                mediaPlayer.reset();
                try{
                      @SuppressWarnings("resource")
                    FileInputStream fis = new FileInputStream(songs.get(CurrentSong));
                      mediaPlayer.setDataSource(fis.getFD());

                      mediaPlayer.prepare();
                      int length = mediaPlayer.getDuration();
                      mediaPlayer.start();
                      if(CurrentSong <= songs.size())
                      {
                           CurrentSong ++;   
                      }

                    }
                catch(Exception err)
                {
                    @SuppressWarnings("unused")
                    String error = err.getMessage();
                }

                mediaPlayer.setOnCompletionListener(completionListener);

            }
        }

        OnCompletionListener completionListener = new OnCompletionListener(){

            @Override
            public void onCompletion(MediaPlayer mp) {
                if(CurrentSong <= songs.size())
                {
                    MediaPlay();
                }

            }

         };

電話がデスクトップに接続されていて、アプリをデバッグしているときは、すべてが期待どおりに機能します。アルバムから1曲追加すると、ダウンロードして再生されます。アルバムからいくつかの曲(またはすべての曲)を追加すると、ダウンロードして次々に再生されます。いくつかの異なるアルバムから曲を選択できます。それらはすべて次々にダウンロードされ、順番に再生されます。つまり、完了時のリスナーは期待どおりに機能します。

この問題は、Eclipseから(デバッグなしで)アプリを実行してからデスクトップからデタッチする(WiFi信号が弱いか、家中のさまざまな場所でテストするため)と選択した場合に発生します。曲を選択すると、ダウンロードして正常に再生されます。ただし、複数の曲を選択すると、最初の曲は正常に再生されますが、それ以降の曲は再生されません。ダウンロードした曲のリストで最初の曲の再生が停止し、新しく選択した曲がダウンロードされて再生されないときに、新しい曲を選択したかのようにダウンロードしています。なぜこれが発生するのか理解できないのですか?

デバッグ中はこれらの問題は発生していません。デスクトップに接続されていないときにサービスの焦点が失われるのではないかと思いますか?それとも私は何か明らかなものを見逃していますか?メディアプレーヤーに部分的なウェイクロックを追加しましたが、彼は問題を軽減していないようです?? ヒントをいただければ幸いです:-)

4

1 に答える 1

3

答えが見つかりました:-)

メディアプレーヤーオブジェクトといくつかのカスタムメソッドを含むメディアプレーヤークラスがあると、onCompletionListenerが機能しなくなったようです(デバッグ時を除く)。これを回避するために、私のサービスはOnCompletionListenerを実装し、MediaPlayerオブジェクトがサービスに直接作成されます。OnCompleteメソッドで、現在のメディアプレーヤーを解放し、新しいメディアプレーヤーを作成します。それはすべて期待どおりに機能します。

誰かが私の元のソリューションが機能しなかった理由を明らかにすることができれば、私は最初に私が間違っていたことをよりよく理解したいと思います!!!

于 2013-03-27T01:12:01.243 に答える