2

我编写了一个流式传输 rtsp 链接的应用程序。我在我的自定义服务类中流式传输了 url。我想在开始音乐之前显示一个 proggresdialog,换句话说,在加载 url 时。这是我的代码;

public class MyMediaPlayerService extends Service implements OnCompletionListener{

private String path = "rtsp://someURL";
MediaPlayer mediaPlayer;
private ProgressDialog pd;

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

@Override
public void onCreate() {
    super.onCreate();
    mediaPlayer = new MediaPlayer();
    mediaPlayer.setOnCompletionListener(this);
}

public void surfaceChanged(SurfaceHolder surfaceholder, int i, int j, int k) {
}

public void surfaceDestroyed(SurfaceHolder surfaceholder) {
}

public void surfaceCreated(SurfaceHolder holder) {
}

public void onCompletion(MediaPlayer _mediaPlayer) {
    stopSelf();
}

@Override
public int onStartCommand(Intent intent, int flags, int startId) {

    if (!mediaPlayer.isPlaying()) {
        pd = new ProgressDialog(getApplicationContext());
        pd.setMessage("Loading...");
        pd.setCancelable(false);
        pd.show();
        mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
        try {
            mediaPlayer.reset();
            mediaPlayer.setDataSource(path);
            mediaPlayer.prepareAsync();
        } catch (Exception e) {
            e.printStackTrace();
        }

        mediaPlayer
                .setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
                    @Override
                    public void onPrepared(MediaPlayer mp) {
                        pd.dismiss();
                        mp.start();
                    }
                });
    }

    return START_NOT_STICKY;
}



public void onDestroy() {
    if (mediaPlayer.isPlaying()) {
        mediaPlayer.stop();

    }
    mediaPlayer.release();
}

}

我也在日志上收到此错误;

08-15 22:42:15.384: E/AndroidRuntime(1090): FATAL EXCEPTION: main
08-15 22:42:15.384: E/AndroidRuntime(1090): java.lang.RuntimeException: Unable to start     service com.applogist.servis.MyMediaPlayerService@42417340 with Intent { cmp=com.applogist.standartfm/com.applogist.servis.MyMediaPlayerService }:    android.view.WindowManager$BadTokenException: Unable to add window -- 
token null is not for an application

现在如何显示进度对话框?

4

1 回答 1

0

建议使用官方开发人员指南中的通知服务|向用户发送通知来执行此操作。

此外,如果您需要在服务中播放音乐,则需要在另一个线程中进行。

注意:服务在其宿主进程的主线程中运行——该服务不会创建自己的线程,也不会在单独的进程中运行(除非您另外指定)。这意味着,如果您的服务要执行任何 CPU 密集型工作或阻塞操作(例如 MP3 播放或网络),您应该在服务中创建一个新线程来完成这项工作。通过使用单独的线程,您将降低应用程序无响应 (ANR) 错误的风险,并且应用程序的主线程可以保持专用于用户与您的活动的交互。

但是,如果您坚持显示一个对话框,并且您的音乐只有在全部下载后才会播放。我认为您可以使用具有内部 AsyncTask 类的对话框类。您可以在 AsyncTask 的 doInBackground (Params...params) 方法中执行下载任务,并通过 AsyncTask 的 @Override protected void onProgressUpdate (Progress... values) 更新对话框的 UI。

于 2013-08-15T23:19:07.017 回答