バックグラウンドサービスで実行されているメディアプレーヤーがあります。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信号が弱いか、家中のさまざまな場所でテストするため)と選択した場合に発生します。曲を選択すると、ダウンロードして正常に再生されます。ただし、複数の曲を選択すると、最初の曲は正常に再生されますが、それ以降の曲は再生されません。ダウンロードした曲のリストで最初の曲の再生が停止し、新しく選択した曲がダウンロードされて再生されないときに、新しい曲を選択したかのようにダウンロードしています。なぜこれが発生するのか理解できないのですか?
デバッグ中はこれらの問題は発生していません。デスクトップに接続されていないときにサービスの焦点が失われるのではないかと思いますか?それとも私は何か明らかなものを見逃していますか?メディアプレーヤーに部分的なウェイクロックを追加しましたが、彼は問題を軽減していないようです?? ヒントをいただければ幸いです:-)