2

サービスとして使用すると、メディアプレーヤーで問題が発生します。

1. アクティビティ内のメディアプレーヤーオブジェクトを静的として初期化し、さらにサービスクラスで使用すると、これが表示され ますerror (-38, 0)、、。Attempt to perform seekTo in wrong state: mPlayer=0x0, mCurrentState=0start called in state 0

2.サービスクラスのメディアプレーヤーオブジェクトとアクティビティのユーザーを初期化して、さらにアクションを実行すると、そのショーは私になりNull Pointerます。

public static MediaPlayer mPlayer = null;

クリックイベントを再生する

    Audio_Player_Play.setOnClickListener(new OnClickListener()
    {

        @Override
        public void onClick(View v)
        {
            // TODO Auto-generated method stub

            if (mPlayer == null)
            {

                Intent Play_Intent = new Intent(RDS_Singel_Audio.this,
                        Audio_Player.class);

                startService(Play_Intent);
                Audio_Player_Play.setVisibility(View.GONE);
                Audio_Player_Pause.setVisibility(View.VISIBLE);

            } else
            {
                // Play_Streaming();
                mPlayer.seekTo(mPlayer.getCurrentPosition());
                mPlayer.start();
                Audio_Player_Play.setVisibility(View.GONE);
                Audio_Player_Pause.setVisibility(View.VISIBLE);
            }
        }
    });

クリックイベントの一時停止

Audio_Player_Pause.setOnClickListener(new OnClickListener()
        {

            @Override
            public void onClick(View v)
            {
                // TODO Auto-generated method stub
                // Play_Streaming();
                // checking is medai player running

                Audio_Player_Play.setVisibility(View.VISIBLE);
                Audio_Player_Pause.setVisibility(View.GONE);

                // checking is audio playing in background
                if (mPlayer != null && mPlayer.isPlaying())
                {
                    mPlayer.pause();
                    /*
                     * Intent Pause_Intent = new Intent(RDS_Singel_Audio.this,
                     * Audio_Player.class); stopService(Pause_Intent);
                     */
                    Audio_Player_Play.setVisibility(View.VISIBLE);
                    Audio_Player_Pause.setVisibility(View.GONE);
                }
            }
        });

OnResume()-OnPause()-OnDistroy()

@Override
    protected void onResume()
    {
        super.onResume();
    }
@Override
    protected void onPause()
    {
        // cleanUp();
        if (mPlayer != null && mPlayer.isPlaying())
        {
            mPlayer.release();
            mPlayer = null;

        }

        super.onPause();
    }
@Override
    protected void onDestroy()
    {
        cleanUp();
        super.onDestroy();
    }

private void cleanUp()
    {
        if (mPlayer != null)
        {
            mVisualizerView.release();
            mPlayer.release();
            mPlayer = null;
        }
    }

Service.Java

public class Audio_Player extends Service
{
    private static final String TAG = "MyService";

    // public static MediaPlayer mPlayer;
    Function f;
    RDS_Singel_Audio sa;
    MediaPlayer mPlayer;

    @Override
    public IBinder onBind(Intent intent)
    {
        return null;
    }

    @Override
    public void onCreate()
    {
        try
        {
            sa = new RDS_Singel_Audio();
            Toast.makeText(this, "My Service Created", Toast.LENGTH_LONG)
                    .show();

            sa.mPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
            sa.mPlayer.setDataSource(sa.Audio_URL);
            sa.mPlayer.prepare();// might take long! (for buffering, etc)
            sa.mVisualizerView.link(sa.mPlayer);
            sa.mPlayer.start();
            sa.addLineRenderer();
            sa.mPlayer.setLooping(false); // Set looping

            // sa.mPlayer.start();

        } catch (Exception e)
        {
            // TODO: handle exception
            Log.d(TAG, "" + e);
        }

    }

    @Override
    public void onDestroy()
    {
        Toast.makeText(this, "My Service Stopped", Toast.LENGTH_LONG).show();
        Log.d(TAG, "onDestroy");
        super.onDestroy();
        if (sa.mPlayer != null)
        {
            sa.mPlayer.stop();
            sa.mPlayer.release();

        }
        sa.mPlayer = null;

    }

    @Override
    public void onStart(Intent intent, int startid)
    {
        Toast.makeText(this, "My Service Started", Toast.LENGTH_LONG).show();
        Log.d(TAG, "onStart");

        // mPlayer.setDataSource("http://clients.ncrypted.net/riddimapp/images/audio/4/df9919ccb2880933c795f43d735cf9bc.mp3");

    }

}

同じ問題に関するリンクをいくつか見つけましたが、それを解決する方法がわかりません。

4

1 に答える 1

0

さて、私はあなたのコードのこの部分を見ますが、あなたが何を達成しようとしているのかは明確ではありません。プレーヤーを現在の位置に移動させようとしていますが、すでにその位置にありますか?その後、その部分を削除できます。

// Play_Streaming();
mPlayer.seekTo(mPlayer.getCurrentPosition());

また、一時停止時にプレーヤーを解放しますが、再開時に再び生成することはありません。提供したリンクのコードを使用して、そこで再作成できます。

@Override
    protected void onResume()
    {
        super.onResume();
    }
@Override
    protected void onPause()
    {
        // cleanUp();
        if (mPlayer != null && mPlayer.isPlaying())
        {
            mPlayer.release();
            mPlayer = null;

        }

        super.onPause();
    }

また、メディアプレーヤーのソースをURLに設定しているように見えるので、次の部分でprepareAsyncの準備を変更して、バッファリングするようにする必要があります。

sa.mPlayer.setDataSource(sa.Audio_URL);
sa.mPlayer.prepare();// might take long! (for buffering, etc)

あなたが提供したリンクには、上記のこれらの問題を克服するための多くの提案がすでにあります。そのリンクのコード、特にprepareAsyncとonpreparedリスナーを提案するコードを試してください。それが機能しない場合は、ここに戻ることができます。

于 2014-05-08T11:09:39.953 に答える