5

英語で申し訳ありませんが、私はブラジル出身で、Google 翻訳を使用しました。

さて、ストリーミングをオンライン ラジオにしようとしているこのアプリケーションで苦労しています。バージョン 2.2 では問題なく動作しますが、バージョン 4.0 では動作しません。エラーは発生せず、単に機能しません。以下は私のコードです。

助けていただければ幸いです。

package com.radiomiriam;
import java.io.IOException;
import android.media.AudioManager;
import android.media.MediaPlayer;
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.view.View;
import android.widget.Toast;

public class Main extends Activity {
public String url = "http://69.64.48.96:9880";
public MediaPlayer player = new MediaPlayer();

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    play();
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
}

public void stop(){
    Toast.makeText(getApplicationContext(), "Finalizando...", Toast.LENGTH_SHORT).show();
    if(player.isPlaying()){
        player.stop();
    }
}

public void play(){
    if(player.isPlaying()){
        Toast.makeText(getApplicationContext(), "Já está em execução!", Toast.LENGTH_SHORT).show();
    } else {
        Toast.makeText(getApplicationContext(), "Preparando...", Toast.LENGTH_SHORT).show();
        player.setAudioStreamType(AudioManager.STREAM_MUSIC);
        player.setAudioStreamType(AudioManager.STREAM_NOTIFICATION);
        try {
            player.setDataSource(url);
        } catch (IllegalArgumentException e) {
            e.printStackTrace();
        } catch (SecurityException e) {
            e.printStackTrace();
        } catch (IllegalStateException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        try {
            player.prepare();
        } catch (IllegalStateException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        player.start();
    }
}

public void onClick(View v) {
    final int id = v.getId();
    switch (id) {
    case R.id.btnPlay:
        play();
        break;
    case R.id.btnStop:
        stop();
        break;
    }
}
}

こんにちは、申し訳ありませんが、私はまだ問題の解決策を見つけておらず、解決方法もわかりません。この問題を解決するために、もう一度あなたの助けを求めています.

アプリケーションはバージョン 2.x および 3.x で実行されますが、バージョン 4.x では実行されません。以下は、プロジェクトをダウンロードするためのリンクです。これを見て、私を助けてください。

http://nsi.inf.br/RadioMiriam.rar (削除済み)

4

4 に答える 4

6

i downloaded your project and it actually returns error Code: E/MediaPlayer( 1976): error (-38, 0)

It is caused by starting mediaplayer before it is prepared.

I have made few changes and it started to work. You should :

  1. Set onPrepared listener on MediaPlayer (i.e. in onCreate)

    player.setOnPreparedListener(new OnPreparedListener() {
        @Override
        public void onPrepared(MediaPlayer mp) {
            mp.start();
        }
    });
    
  2. Remove player.start() from your play() method

  3. Set datasource in this way (in your play() method)

    player.setDataSource(this, Uri.parse("http://69.64.48.96:9880/"));
    

It works on my HTC Sensation with Android 4.0.3

If you need any assistance please let me know.

EDIT: i forgot, i also removed

player.setAudioStreamType(AudioManager.STREAM_NOTIFICATION);

It is redundant

于 2013-03-07T09:31:50.257 に答える
2

呼び出しはおそらくUIスレッドをブロックしていprepare()ます(Android 4.0はそれを行うとそれを嫌います)

asynctaskのようなバックグラウンドスレッドでこの作業を行う必要があります。これは、バックグラウンドで実行するAsyncTaskを実装する匿名バージョンですplay()

public void onClick(View v) {
    final int id = v.getId();
    switch (id) {
    case R.id.btnPlay:
        new AsyncTask<Void, Void, Void>(){
            @Override
            protected Void doInBackground(Void... voids) {
                play();
                return null;
            }
        }.execute();
        break;
    case R.id.btnStop:
        stop();
        break;
    }
}

準備を呼び出すとUIスレッドがブロックされる理由を知るには、 MediaPlayerの状態 (再生、準備、停止など)について少し読む必要があります(

AsyncTasksの詳細については

于 2013-02-22T20:32:26.930 に答える
0

.xmlファイルのボタンとコードの間にリンクを設定していません。ボタンを押していても、onClickメソッドが呼び出されることはありません。

onCreateメソッドを次のように置き換えます。

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    Button playButton = (Button) findViewById(R.id.btnPlay);
    playButton.setOnClickListener(this);
    Button stopButton = (Button) findViewById(R.id.btnStop);
    stopButton.setOnClickListener(this);
    play();
}
于 2013-02-22T20:42:30.173 に答える
0

Androidでは、バックグラウンド スレッドでIO作業を行う方が常に優れています。

これには MediaPlayer が含まれます。ただし、MediaPlayer の場合prepareAsync()、バックグラウンドで MediaPlayer を準備する方法が既にあります。

これを行う良い方法は次のとおりです。

package com.radiomiriam;
import java.io.IOException;
import android.media.AudioManager;
import android.media.MediaPlayer;
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.view.View;
import android.widget.Toast;

public class Main extends Activity  implements OnPreparedListener{
public String url = "http://69.64.48.96:9880";
public MediaPlayer player = new MediaPlayer();

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    play();
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
}

public void stop(){
    Toast.makeText(getApplicationContext(), "Finalizando...", Toast.LENGTH_SHORT).show();
    if(player.isPlaying()){
        player.stop();
    }
}

public void play(){
    if(player.isPlaying()){
        Toast.makeText(getApplicationContext(), "J? est? em execuç?o!", Toast.LENGTH_SHORT).show();
    } else {
        Toast.makeText(getApplicationContext(), "Preparando...", Toast.LENGTH_SHORT).show();
        player.setAudioStreamType(AudioManager.STREAM_MUSIC);
        player.setAudioStreamType(AudioManager.STREAM_NOTIFICATION);
        try {
            player.setDataSource(url);
        } catch (IllegalArgumentException e) {
            e.printStackTrace();
        } catch (SecurityException e) {
            e.printStackTrace();
        } catch (IllegalStateException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        try {
            player.setOnPreparedListener(this);
            player.prepareAsync();
        } catch (IllegalStateException e) {
            e.printStackTrace();
        }
    }
}
@Override
public void onPrepared(MediaPlayer mp) {
    // TODO Auto-generated method stub
    mp.start();
}
public void onClick(View v) {
    final int id = v.getId();
    switch (id) {
    case R.id.btnPlay:
        play();
        break;
    case R.id.btnStop:
        stop();
        break;
    }
}
}

また、常にドキュメントを読むことをお勧めします。MediaPlayer API へのリンクは次のとおりです: MediaPlayer

于 2013-02-23T17:58:47.683 に答える