0

こんにちは、私はアンドロイドが初めてで、例によって学んでいます。未加工のフォルダー内のすべての曲のリスト ビューがあり、下部にメディア プレーヤー コントロールがあるアクティビティを作成しようとしています。SeekBarこれまでのところすべてが機能していますが、強制終了を止める ことができないようです。

コードは次のとおりです。

public class music extends ListActivity implements Runnable {

    private ArrayList<sound> mSounds = null;

    private soundadapter mAdapter = null;
    private ImageButton playbtn;
    private SeekBar seekbar;
    private int total;
    private MediaPlayer mp = null;
    private TextView selelctedFile = null;

    /** Called when the activity is first created. */

    @Override
    public void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.music);


        selelctedFile = (TextView) findViewById(R.id.selectedfile);

        seekbar = (SeekBar) findViewById(R.id.seekbar);
        seekbar.setProgress(0);

        // create a simple list

        mSounds = new ArrayList<sound>();

        sound s = new sound();

        s.setDescription("Rudolph The Red Nosed Reindeer");

        s.setSoundResourceId(R.raw.rudolphtherednosereindeer);

        mSounds.add(s);

        s = new sound();

        s.setDescription("Battery");

        s.setSoundResourceId(R.raw.battery);

        mSounds.add(s);

        mAdapter = new soundadapter(this, R.layout.listitem, mSounds);

        setListAdapter(mAdapter);

        playbtn = (ImageButton) findViewById(R.id.play);
        playbtn.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                // TODO Auto-generated method stub
                try {
                    if (mp.isPlaying()) {
                        mp.pause();
                        playbtn.setImageResource(android.R.drawable.ic_media_play);

                    } else {
                        mp.start();
                        playbtn.setImageResource(android.R.drawable.ic_media_pause);

                    }
                } catch (Exception e) {

                    e.printStackTrace();
                    // TODO: handle exception
                }

            }
        });

    }

    @Override
    public void onListItemClick(ListView parent, View v, int position, long id) {

        sound s = (sound) mSounds.get(position);
        if (mp != null) {
            mp.reset();
            mp.release();

        }

        mp = MediaPlayer.create(this, s.getSoundResourceId());
        selelctedFile.setText(s.getDescription());
        playbtn.setImageResource(android.R.drawable.ic_media_pause);
        mp.start();
        total = mp.getDuration();
        seekbar.setMax(total);

        seekbar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {

            @Override
            public void onStopTrackingTouch(SeekBar seekbar) {
                // TODO Auto-generated method stub

            }

            @Override
            public void onStartTrackingTouch(SeekBar seekbar) {
                // TODO Auto-generated method stub

            }

            @Override
            public void onProgressChanged(SeekBar seekBar, int progress,
                    boolean fromUser) {
                // TODO Auto-generated method stub
                if (fromUser) {
                    mp.seekTo(progress);
                    seekBar.setProgress(progress);
                }
            }
        });

        Thread currentThread = new Thread(this);
        currentThread.start();

    }

    @Override
    public void run() {
        // TODO Auto-generated method stub

        try {
            while (mp != null) {
                int currentPosition = mp.getCurrentPosition();
                Message msg = new Message();
                msg.what = currentPosition;
                threadHandler.sendMessage(msg);
                Thread.sleep(100);
            }
        }

        catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } finally {

        }
    }

    private Handler threadHandler = new Handler() {
        public void handleMessage(Message msg) {
            // super.handleMessage(msg);
            // txt.setText(Integer.toString(msg.what));
            seekbar.setProgress(msg.what);
        }
    };

    @Override
    protected void onPause() {
        // TODO Auto-generated method stub

        mp.stop();
        mp.release();
        mp = null;
    }

    @Override
    protected void onDestroy() {
        // TODO Auto-generated method stub
        if(mp != null) {
            mp.stop();
            mp.release();
            mp = null;
        }
    }   
}

そして、別の曲を数回クリックすると発生するエラーは次のとおりです。

04-14 02:53:00.452: W/dalvikvm(27452): threadid=19: thread exiting with uncaught    exception (group=0x40018560)    
04-14 02:53:00.466: E/AndroidRuntime(27452): FATAL EXCEPTION: Thread-22
04-14 02:53:00.466: E/AndroidRuntime(27452): java.lang.IllegalStateException
04-14 02:53:00.466: E/AndroidRuntime(27452): at android.media.MediaPlayer.getCurrentPosition(Native Method)
04-14 02:53:00.466: E/AndroidRuntime(27452): at net.cybercore.collapsingfromwithin.music.run(music.java:145)
04-14 02:53:00.466: E/AndroidRuntime(27452): at java.lang.Thread.run(Thread.java:1019)

回線エラー 145 は次のとおりです。
int currentPosition = mp.getCurrentPosition();

私は一生、3〜4回プレイしてアプリを強制終了する理由を理解できません。

どんな助けでも大歓迎です。http://www.androidhive.info/2012/03/android-building-audio-player-tutorial/http://www.androiddevblog.net/android/playing-など、例として他のいくつかのサイトを既に見ましたアンドロイドのオーディオ

**

アップデート

**私はそれを修正したと思います。助けてくれてありがとうAndroid mediaplayer のシークバーに Thread を使用しているのを見つけたので、次のように変更しました

@Override
public void run() {
    // TODO Auto-generated method stub

    try {
        while (mp != null) {
            int currentPosition = mp.getCurrentPosition();
            Message msg = new Message();
            msg.what = currentPosition;
            threadHandler.sendMessage(msg);

            try {
                Thread.sleep(100);
            } catch (InterruptedException e) {
                e.printStackTrace();
                System.out.println("interrupt exeption" + e);
            }
        }
    }

    catch (Exception e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
        System.out.println("My exeption" + e);
    } 
}

それでもエラーが発生しますが、アプリが強制終了されることはありません。これが正しい方法だとは思いませんが、機能しています。

4

1 に答える 1

0

インスタンス化するときは、メディア プレーヤーを準備する必要があります。

MediaPlayer オブジェクトは、再生を開始する前にまず Prepared 状態に入る必要があります。Prepared 状態に到達するには 2 つの方法 (同期と非同期) があります。メソッド呼び出しが返されたときにオブジェクトを Prepared 状態に転送する prepare() への呼び出し (同期)、または prepareAsync() への呼び出し (これは、呼び出しが戻った後 (ほぼ正しい方法で発生します)、最初にオブジェクトを Preparing 状態に転送しますが、内部プレーヤー エンジンは準備作業が完了するまで残りの準備作業を続けます。準備が完了したとき、または prepare() 呼び出しが返されたときに、setOnPreparedListener(android.media.media.media.

ここで読む

そのため、プレーヤーをインスタンス化した後に mp.prepare() を呼び出す必要があります。

また、再生中のメディア プレーヤーが run メソッドを実行していることを確認する必要があります。while 行に mp.isPlaying() を追加することから始めます。

while (mp != null && mp.isPlaying()) {
           ...

        }

IllegalStateException は、プレーヤーが停止している場合など、そのメソッドを呼び出すことができない状態にあることを意味します。

よくわかりませんが、音楽を一時停止すると、これで run メソッドが停止すると思います。したがって、これを避けるようにしてください。プレーヤーが再生中か一時停止中かを識別するブール値を作成し、その間に使用します。

于 2012-04-14T07:43:06.827 に答える