First of all: Sorry if I had misspellings. I'm from Paraguay and I am using Google Translate.
This may seem a little silly, and I'm a perfectionist and like any good developer and designer, do not want bugs in my projects. I am in the process of learning and hope to learn much with you
I have seen media player applications that allow the user to quickly and repeatedly press the play/stop button without killing the application, and that this is still functioning properly, so I read about Services
, AsyncTask
and Thread
. Not only to play the sound in the background but also to not kill my application with UI errors. I have many questions yet.
I wonder if I'm on a good path using the following resource (found online), but I have tried and the application dies when I press for several times the play/stop buttom or sometimes simply not play the song.
package com.myaudioservice.app;
import android.app.Service;
import android.content.Intent;
import android.media.AudioManager;
import android.media.MediaPlayer;
import android.os.AsyncTask;
import android.os.Binder;
import android.os.IBinder;
/**
* Service to serv MediaPlayer in background
*
* @author Eugeny Pozharsky
*/
public class PlayerService extends Service {
private final IBinder mBinder = new LocalBinder();
private MediaPlayer mediaPlayer;
private PlayerCallback callback;
public class LocalBinder extends Binder {
PlayerService getService() {
return PlayerService.this;
}
}
@Override
public IBinder onBind(Intent intent) {
return mBinder;
}
/**
* Kill MediaPlayer to release resources
*/
@Override
public void onDestroy() {
super.onDestroy();
if (mediaPlayer != null) {
stop();
mediaPlayer.release();
}
}
/**
* Starts playing stream.
* Note that we just start media player and do not obtain real URL of the stream.
* So, URL that will be redirected by server will not work. To make such URLs works, adding
* algorithm to obtain the real URL (f.e., create HttpConnection, connect to the server and
* get real URL from connection).
*
* @param url String with URL of a server to connect
*/
public void start(String url) {
if (mediaPlayer == null) {
mediaPlayer = new MediaPlayer();
}
if (isPlaying()) {
mediaPlayer.stop();
mediaPlayer.reset();
}
new Player().execute(url);
Log.e("PlayerService", "start()");
}
/**
* Stops playing of the stream.
*/
public void stop() {
// stopping MediaPlayer in separate thread because it can take a time
new Thread(new Runnable() {
@Override
public void run() {
if (mediaPlayer != null) {
if (mediaPlayer.isPlaying()) {
mediaPlayer.stop();
}
//mediaPlayer.release();
//mediaPlayer = null;
}
}
}).start();
if (callback != null) {
callback.onStopped();
}
Log.e("PlayerService", "stop()");
}
/**
* Is stream playing?
*
* @return true or false
*/
public Boolean isPlaying() {
return mediaPlayer != null && mediaPlayer.isPlaying();
}
public void setCallback(PlayerCallback callback) {
this.callback = callback;
}
/**
* Background task to start MediaPlayer. It is used because starting playing of remote stream may
* take long time and we must not block UI thread.
* Also, this approach allows to cancel starting process (not implemented in current version)
*/
private class Player extends AsyncTask<String, Void, Void> {
/**
* This function called in UI thread and we callback to activity to update UI elements
*/
@Override
protected void onPreExecute() {
super.onPreExecute();
if (callback != null) {
callback.onPreStart();
}
}
/**
* This function called in UI thread and we callback to activity to update UI elements
*/
@Override
protected void onPostExecute(Void aVoid) {
super.onPostExecute(aVoid);
if (mediaPlayer == null || !mediaPlayer.isPlaying()) {
// Start MediaPlayer fail.
if (callback != null) {
callback.onStartFailed();
}
} else {
if (callback != null) {
callback.onStarted();
}
}
}
/**
* This function called from separate thread and we do long-time operation in it
*
* @param strings params
* @return null
*/
@Override
protected Void doInBackground(String... strings) {
//mediaPlayer = new MediaPlayer();
try {
mediaPlayer.setDataSource(strings[0]);
mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
mediaPlayer.prepare();
mediaPlayer.start();
} catch (Exception e) {
if (mediaPlayer != null) {
mediaPlayer.release();
}
mediaPlayer = null;
}
return null;
}
}
}
I wonder if I should cancel my AsyncTask
process at any time or if I should add/modify something that my application will not die. How should I do?
Someone can guide me?
I usually get the error (if it appears) in my logcast it is as follows:
java.lang.IllegalStateException: Cannot execute task: the task has already been executed (a task can be executed only once)
For the Play/Stop button:
btn_control.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
control((!ON_PLAY) ? 1 : 0);
}
});
private void control(int est) {
if(est==1){
if (!hayConexion()) {
Toast.makeText(Principal.this, getString(R.string.error_conexion_txt), Toast.LENGTH_SHORT).show();
} else {
if (mBound) {
mService.start();
ON_PLAY = true;
}
}
}else if(est==0) {
if (mBound) {
mService.stop();
ON_PLAY = false;
}
}
}
EDIT:
Logcat:
09-08 03:13:08.333 32438-32474/com.myaudioservice.app V/MediaPlayer-JNI﹕ native_setup
09-08 03:13:08.333 32438-32474/com.myaudioservice.app V/MediaPlayer﹕ constructor
09-08 03:13:08.343 32438-32474/com.myaudioservice.app V/MediaPlayer﹕ setListener
09-08 03:13:08.343 32438-32474/com.myaudioservice.app I/MediaPlayer﹕ path is null
09-08 03:13:08.343 32438-32474/com.myaudioservice.app D/MediaPlayer﹕ setDataSource IOException happend :
java.io.FileNotFoundException: No content provider: rtsp://ip/folder/file.stream
at android.content.ContentResolver.openTypedAssetFileDescriptor(ContentResolver.java:1053)
at android.content.ContentResolver.openAssetFileDescriptor(ContentResolver.java:907)
at android.content.ContentResolver.openAssetFileDescriptor(ContentResolver.java:834)
at android.media.MediaPlayer.setDataSource(MediaPlayer.java:988)
at android.media.MediaPlayer.setDataSource(MediaPlayer.java:942)
at com.myaudioservice.app.PlayerService$Player.doInBackground(PlayerService.java:156)
at com.myaudioservice.app.PlayerService$Player.doInBackground(PlayerService.java:130)
at android.os.AsyncTask$2.call(AsyncTask.java:288)
at java.util.concurrent.FutureTask.run(FutureTask.java:237)
at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
at java.lang.Thread.run(Thread.java:841)
09-08 03:13:08.343 32438-32474/com.myaudioservice.app D/MediaPlayer﹕ Couldn't open file on client side, trying server side
09-08 03:13:08.353 32438-32474/com.myaudioservice.app V/MediaPlayer-JNI﹕ setAudioStreamType: 3
09-08 03:13:08.353 32438-32474/com.myaudioservice.app V/MediaPlayer﹕ MediaPlayer::setAudioStreamType
09-08 03:13:08.353 32438-32474/com.myaudioservice.app D/com.myaudioservice.app.PlayerService﹕ Preparing: rtsp://ip/folder/file.stream
09-08 03:13:08.353 32438-32474/com.myaudioservice.app V/MediaPlayer﹕ setVideoSurfaceTexture
09-08 03:13:08.353 32438-32474/com.myaudioservice.app V/MediaPlayer﹕ prepare
09-08 03:13:09.384 32438-32438/com.myaudioservice.app E/PlayerService﹕ stop()
09-08 03:13:09.394 32438-32495/com.myaudioservice.app V/MediaPlayer-JNI﹕ isPlaying: 0
09-08 03:13:09.394 32438-32495/com.myaudioservice.app V/MediaPlayer-JNI﹕ release
09-08 03:13:09.394 32438-32495/com.myaudioservice.app V/MediaPlayer﹕ setListener
09-08 03:13:09.394 32438-32495/com.myaudioservice.app V/MediaPlayer﹕ disconnect
09-08 03:13:09.544 32438-32438/com.myaudioservice.app D/AndroidRuntime﹕ Shutting down VM
09-08 03:13:09.544 32438-32438/com.myaudioservice.app W/dalvikvm﹕ threadid=1: thread exiting with uncaught exception (group=0x4193eda0)
09-08 03:13:09.544 32438-32438/com.myaudioservice.app E/AndroidRuntime﹕ FATAL EXCEPTION: main
Process: com.myaudioservice.app, PID: 32438
java.lang.IllegalStateException
at android.media.MediaPlayer.isPlaying(Native Method)
at com.myaudioservice.app.PlayerService.reproduciendo(PlayerService.java:118)
at com.myaudioservice.app.PlayerService.start(PlayerService.java:84)
at com.myaudioservice.app.MainActivity.control(MainActivity.java:298)
at com.myaudioservice.app.MainActivity.access$100(MainActivity.java:38)
at com.myaudioservice.app.MainActivity$1.onClick(MainActivity.java:173)
at android.view.View.performClick(View.java:4640)
at android.view.View$PerformClick.run(View.java:19425)
at android.os.Handler.handleCallback(Handler.java:733)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:146)
at android.app.ActivityThread.main(ActivityThread.java:5593)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1283)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1099)
at dalvik.system.NativeStart.main(Native Method)
NEW LOGCAT:
09-08 14:49:24.360 9651-9651/com.myaudioservice.app V/MediaPlayer﹕ isPlaying: no active player
09-08 14:49:24.360 9651-9651/com.myaudioservice.app V/MediaPlayer-JNI﹕ isPlaying: 0
09-08 14:49:24.390 9651-9651/com.myaudioservice.app E/PlayerService﹕ start()
09-08 14:49:24.480 9651-10534/com.myaudioservice.app V/MediaPlayer﹕ isPlaying: no active player
09-08 14:49:24.480 9651-10534/com.myaudioservice.app V/MediaPlayer-JNI﹕ isPlaying: 0
09-08 14:49:24.480 9651-10534/com.myaudioservice.app V/MediaPlayer-JNI﹕ reset
09-08 14:49:24.480 9651-10534/com.myaudioservice.app V/MediaPlayer﹕ reset
09-08 14:49:24.490 9651-9651/com.myaudioservice.app E/PlayerService﹕ stop()
09-08 14:49:24.620 9651-9651/com.myaudioservice.app V/MediaPlayer﹕ isPlaying: no active player
09-08 14:49:24.620 9651-9651/com.myaudioservice.app V/MediaPlayer-JNI﹕ isPlaying: 0
09-08 14:49:24.650 9651-9651/com.myaudioservice.app E/PlayerService﹕ start()
09-08 14:49:24.770 9651-10535/com.myaudioservice.app V/MediaPlayer﹕ isPlaying: no active player
09-08 14:49:24.770 9651-10535/com.myaudioservice.app V/MediaPlayer-JNI﹕ isPlaying: 0
09-08 14:49:24.770 9651-10535/com.myaudioservice.app V/MediaPlayer-JNI﹕ reset
09-08 14:49:24.770 9651-10535/com.myaudioservice.app V/MediaPlayer﹕ reset
09-08 14:49:24.780 9651-9651/com.myaudioservice.app E/PlayerService﹕ stop()
09-08 14:49:24.890 9651-9651/com.myaudioservice.app V/MediaPlayer﹕ isPlaying: no active player
09-08 14:49:24.890 9651-9651/com.myaudioservice.app V/MediaPlayer-JNI﹕ isPlaying: 0
09-08 14:49:24.910 9651-9651/com.myaudioservice.app E/PlayerService﹕ start()
09-08 14:49:25.021 9651-10540/com.myaudioservice.app V/MediaPlayer﹕ isPlaying: no active player
09-08 14:49:25.031 9651-10540/com.myaudioservice.app V/MediaPlayer-JNI﹕ isPlaying: 0
09-08 14:49:25.031 9651-10540/com.myaudioservice.app V/MediaPlayer-JNI﹕ reset
09-08 14:49:25.031 9651-10540/com.myaudioservice.app V/MediaPlayer﹕ reset
09-08 14:49:25.041 9651-9651/com.myaudioservice.app E/PlayerService﹕ stop()
09-08 14:49:25.151 9651-9651/com.myaudioservice.app V/MediaPlayer﹕ isPlaying: no active player
09-08 14:49:25.151 9651-9651/com.myaudioservice.app V/MediaPlayer-JNI﹕ isPlaying: 0
09-08 14:49:25.181 9651-9651/com.myaudioservice.app E/PlayerService﹕ start()
EDIT 2: -----------------------------------------------------------------------
I thought I already had it until I got an bug (just at the end of my service) :(
Edited PlayerService class
package com.myaudioservice.app;
import android.app.Service;
import android.content.Intent;
import android.media.AudioManager;
import android.media.MediaPlayer;
import android.os.Binder;
import android.os.IBinder;
import android.util.Log;
public class PlayerService extends Service implements MediaPlayer.OnPreparedListener, MediaPlayer.OnInfoListener, MediaPlayer.OnCompletionListener {
private static final String LOG_TAG = PlayerService.class.getName();
private String URL_STREAM = "rtsp://domain/folder/file.stream";
private MediaPlayer mMediaPlayer = null;
private PlayerCallback callback;
private final IBinder mBinder = new LocalBinder();
public class LocalBinder extends Binder {
PlayerService getService() {
return PlayerService.this;
}
}
@Override
public IBinder onBind(Intent intent) {
return mBinder;
}
@Override
public void onDestroy(){
if (mMediaPlayer != null) {
stop();
mMediaPlayer.release();
mMediaPlayer = null;
}
}
/**
* Starts playing stream.
* Note that we just start media player and do not obtain real URL of the stream.
* So, URL that will be redirected by server will not work. To make such URLs works, adding
* algorithm to obtain the real URL (f.e., create HttpConnection, connect to the server and
* get real URL from connection).
*
* //@param url String with URL of a server to connect
*/
public void start() {
if (mMediaPlayer == null) mMediaPlayer = new MediaPlayer();
if (isPlaying()) {
mMediaPlayer.stop();
mMediaPlayer.reset();
}
try {
mMediaPlayer.setDataSource(URL_STREAM);
mMediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
if (callback != null) callback.onPreStart();
Log.e(LOG_TAG, "Preparando: " + URL_STREAM);
mMediaPlayer.prepareAsync();
} catch (Exception e) {
if (mMediaPlayer != null) {
mMediaPlayer.reset();
}
Log.e(LOG_TAG, e.toString());
//mMediaPlayer = null;
}
mMediaPlayer.setOnPreparedListener(this);
mMediaPlayer.setOnInfoListener(this);
mMediaPlayer.setOnCompletionListener(this);
}
@Override
public void onPrepared(MediaPlayer mp) {
mp.start();
Log.e(LOG_TAG, "start()");
}
@Override
public boolean onInfo(MediaPlayer mp, int what, int extra) {
switch (what) {
case MediaPlayer.MEDIA_ERROR_IO:
case MediaPlayer.MEDIA_ERROR_MALFORMED:
case MediaPlayer.MEDIA_ERROR_NOT_VALID_FOR_PROGRESSIVE_PLAYBACK:
case MediaPlayer.MEDIA_ERROR_SERVER_DIED:
case MediaPlayer.MEDIA_ERROR_TIMED_OUT:
case MediaPlayer.MEDIA_ERROR_UNSUPPORTED:
if (mMediaPlayer == null || !mMediaPlayer.isPlaying()) {
// Start MediaPlayer fail.
if (callback != null) callback.onStartFailed();
}
Log.e(LOG_TAG, "Error");
break;
case MediaPlayer.MEDIA_INFO_BUFFERING_START:
if (callback != null) callback.onStarted();
Log.e(LOG_TAG, "Almacenando en búfer");
break;
case MediaPlayer.MEDIA_INFO_BUFFERING_END:
if (callback != null) callback.onPlaying();
Log.e(LOG_TAG, "Reproduciendo");
break;
}
return false;
}
@Override
public void onCompletion(MediaPlayer mp) {
Log.e(LOG_TAG, "Reproducción finalizada");
stop();
}
/**
* Stops playing of the stream.
*/
public void stop() {
// stopping MediaPlayer in separate thread because it can take a time
new Thread(new Runnable() {
@Override
public void run() {
if (mMediaPlayer != null) {
if (mMediaPlayer.isPlaying()) mMediaPlayer.stop(); // I get the error here when I destroy the Service quickly
mMediaPlayer.reset();
}
}
}).start();
if (callback != null) callback.onStopped();
Log.e(LOG_TAG, "stop()");
}
/**
* Is stream playing?
*
* @return true or false
*/
public Boolean isPlaying() {
return mMediaPlayer != null && mMediaPlayer.isPlaying();
}
public void setCallback(PlayerCallback callback) {
this.callback = callback;
}
}
Logcat:
09-08 19:15:39.578 27582-27582/com.myaudioservice.app V/MediaPlayer﹕ isPlaying: no active player
09-08 19:15:39.578 27582-27582/com.myaudioservice.app V/MediaPlayer-JNI﹕ isPlaying: 0
09-08 19:15:39.578 27582-27582/com.myaudioservice.app V/MediaPlayer-JNI﹕ setAudioStreamType: 3
09-08 19:15:39.578 27582-27582/com.myaudioservice.app V/MediaPlayer﹕ MediaPlayer::setAudioStreamType
09-08 19:15:39.578 27582-27582/com.myaudioservice.app E/com.myaudioservice.app.PlayerService﹕ Preparando: rtsp://domain/folder/file.stream
09-08 19:15:39.578 27582-27582/com.myaudioservice.app V/MediaPlayer﹕ setVideoSurfaceTexture
09-08 19:15:39.578 27582-27582/com.myaudioservice.app V/MediaPlayer﹕ prepareAsync
09-08 19:15:39.678 27582-31945/com.myaudioservice.app V/MediaPlayer-JNI﹕ isPlaying: 0
09-08 19:15:39.678 27582-31945/com.myaudioservice.app V/MediaPlayer-JNI﹕ reset
09-08 19:15:39.678 27582-31945/com.myaudioservice.app V/MediaPlayer﹕ reset
09-08 19:15:39.678 27582-27596/com.myaudioservice.app V/MediaPlayer﹕ message received msg=1, ext1=0, ext2=0
09-08 19:15:39.688 27582-27596/com.myaudioservice.app V/MediaPlayer﹕ notify(1, 0, 0) callback on disconnected mediaplayer
09-08 19:15:39.688 27582-27596/com.myaudioservice.app V/MediaPlayer﹕ message received msg=8, ext1=0, ext2=0
09-08 19:15:39.688 27582-27596/com.myaudioservice.app V/MediaPlayer﹕ notify(8, 0, 0) callback on disconnected mediaplayer
09-08 19:15:39.688 27582-27582/com.myaudioservice.app E/com.myaudioservice.app.PlayerService﹕ stop()
09-08 19:15:39.798 27582-27582/com.myaudioservice.app V/MediaPlayer﹕ isPlaying: no active player
09-08 19:15:39.798 27582-27582/com.myaudioservice.app V/MediaPlayer-JNI﹕ isPlaying: 0
09-08 19:15:39.808 27582-27582/com.myaudioservice.app V/MediaPlayer-JNI﹕ setAudioStreamType: 3
09-08 19:15:39.808 27582-27582/com.myaudioservice.app V/MediaPlayer﹕ MediaPlayer::setAudioStreamType
09-08 19:15:39.808 27582-27582/com.myaudioservice.app E/com.myaudioservice.app.PlayerService﹕ Preparando: rtsp://domain/folder/file.stream
09-08 19:15:39.808 27582-27582/com.myaudioservice.app V/MediaPlayer﹕ setVideoSurfaceTexture
09-08 19:15:39.808 27582-27582/com.myaudioservice.app V/MediaPlayer﹕ prepareAsync
09-08 19:15:39.938 27582-31952/com.myaudioservice.app V/MediaPlayer-JNI﹕ isPlaying: 0
09-08 19:15:39.938 27582-31952/com.myaudioservice.app V/MediaPlayer-JNI﹕ reset
09-08 19:15:39.938 27582-31952/com.myaudioservice.app V/MediaPlayer﹕ reset
09-08 19:15:39.938 27582-27596/com.myaudioservice.app V/MediaPlayer﹕ message received msg=1, ext1=0, ext2=0
09-08 19:15:39.938 27582-27596/com.myaudioservice.app V/MediaPlayer﹕ notify(1, 0, 0) callback on disconnected mediaplayer
09-08 19:15:39.938 27582-27596/com.myaudioservice.app V/MediaPlayer﹕ message received msg=8, ext1=0, ext2=0
09-08 19:15:39.938 27582-27596/com.myaudioservice.app V/MediaPlayer﹕ notify(8, 0, 0) callback on disconnected mediaplayer
09-08 19:15:39.948 27582-27582/com.myaudioservice.app E/com.myaudioservice.app.PlayerService﹕ stop()
09-08 19:15:40.069 27582-27582/com.myaudioservice.app V/MediaPlayer﹕ isPlaying: no active player
09-08 19:15:40.069 27582-27582/com.myaudioservice.app V/MediaPlayer-JNI﹕ isPlaying: 0
09-08 19:15:40.079 27582-27582/com.myaudioservice.app V/MediaPlayer-JNI﹕ setAudioStreamType: 3
09-08 19:15:40.079 27582-27582/com.myaudioservice.app V/MediaPlayer﹕ MediaPlayer::setAudioStreamType
09-08 19:15:40.079 27582-27582/com.myaudioservice.app E/com.myaudioservice.app.PlayerService﹕ Preparando: rtsp://domain/folder/file.stream
09-08 19:15:40.079 27582-27582/com.myaudioservice.app V/MediaPlayer﹕ setVideoSurfaceTexture
09-08 19:15:40.079 27582-27582/com.myaudioservice.app V/MediaPlayer﹕ prepareAsync
09-08 19:15:40.179 27582-31957/com.myaudioservice.app V/MediaPlayer-JNI﹕ isPlaying: 0
09-08 19:15:40.179 27582-31957/com.myaudioservice.app V/MediaPlayer-JNI﹕ reset
09-08 19:15:40.179 27582-31957/com.myaudioservice.app V/MediaPlayer﹕ reset
09-08 19:15:40.179 27582-27596/com.myaudioservice.app V/MediaPlayer﹕ message received msg=1, ext1=0, ext2=0
09-08 19:15:40.189 27582-27596/com.myaudioservice.app V/MediaPlayer﹕ notify(1, 0, 0) callback on disconnected mediaplayer
09-08 19:15:40.189 27582-27596/com.myaudioservice.app V/MediaPlayer﹕ message received msg=8, ext1=0, ext2=0
09-08 19:15:40.189 27582-27596/com.myaudioservice.app V/MediaPlayer﹕ notify(8, 0, 0) callback on disconnected mediaplayer
09-08 19:15:40.189 27582-27582/com.myaudioservice.app E/com.myaudioservice.app.PlayerService﹕ stop()
09-08 19:15:40.289 27582-27582/com.myaudioservice.app V/MediaPlayer﹕ isPlaying: no active player
09-08 19:15:40.289 27582-27582/com.myaudioservice.app V/MediaPlayer-JNI﹕ isPlaying: 0
09-08 19:15:40.299 27582-27582/com.myaudioservice.app V/MediaPlayer-JNI﹕ setAudioStreamType: 3
09-08 19:15:40.299 27582-27582/com.myaudioservice.app V/MediaPlayer﹕ MediaPlayer::setAudioStreamType
09-08 19:15:40.299 27582-27582/com.myaudioservice.app E/com.myaudioservice.app.PlayerService﹕ Preparando: rtsp://domain/folder/file.stream
09-08 19:15:40.299 27582-27582/com.myaudioservice.app V/MediaPlayer﹕ setVideoSurfaceTexture
09-08 19:15:40.299 27582-27582/com.myaudioservice.app V/MediaPlayer﹕ prepareAsync
09-08 19:15:40.429 27582-31966/com.myaudioservice.app V/MediaPlayer-JNI﹕ isPlaying: 0
09-08 19:15:40.429 27582-31966/com.myaudioservice.app V/MediaPlayer-JNI﹕ reset
09-08 19:15:40.429 27582-31966/com.myaudioservice.app V/MediaPlayer﹕ reset
09-08 19:15:40.429 27582-27596/com.myaudioservice.app V/MediaPlayer﹕ message received msg=1, ext1=0, ext2=0
09-08 19:15:40.429 27582-27596/com.myaudioservice.app V/MediaPlayer﹕ notify(1, 0, 0) callback on disconnected mediaplayer
09-08 19:15:40.429 27582-27582/com.myaudioservice.app E/com.myaudioservice.app.PlayerService﹕ stop()
09-08 19:15:40.429 27582-27596/com.myaudioservice.app V/MediaPlayer﹕ message received msg=8, ext1=0, ext2=0
09-08 19:15:40.429 27582-27596/com.myaudioservice.app V/MediaPlayer﹕ notify(8, 0, 0) callback on disconnected mediaplayer
09-08 19:15:40.549 27582-27582/com.myaudioservice.app V/MediaPlayer﹕ isPlaying: no active player
09-08 19:15:40.549 27582-27582/com.myaudioservice.app V/MediaPlayer-JNI﹕ isPlaying: 0
09-08 19:15:40.559 27582-27582/com.myaudioservice.app V/MediaPlayer-JNI﹕ setAudioStreamType: 3
09-08 19:15:40.559 27582-27582/com.myaudioservice.app V/MediaPlayer﹕ MediaPlayer::setAudioStreamType
09-08 19:15:40.559 27582-27582/com.myaudioservice.app E/com.myaudioservice.app.PlayerService﹕ Preparando: rtsp://domain/folder/file.stream
09-08 19:15:40.559 27582-27582/com.myaudioservice.app V/MediaPlayer﹕ setVideoSurfaceTexture
09-08 19:15:40.559 27582-27582/com.myaudioservice.app V/MediaPlayer﹕ prepareAsync
09-08 19:15:40.659 27582-31972/com.myaudioservice.app V/MediaPlayer-JNI﹕ isPlaying: 0
09-08 19:15:40.659 27582-31972/com.myaudioservice.app V/MediaPlayer-JNI﹕ reset
09-08 19:15:40.659 27582-31972/com.myaudioservice.app V/MediaPlayer﹕ reset
09-08 19:15:40.659 27582-27596/com.myaudioservice.app V/MediaPlayer﹕ message received msg=1, ext1=0, ext2=0
09-08 19:15:40.659 27582-27596/com.myaudioservice.app V/MediaPlayer﹕ notify(1, 0, 0) callback on disconnected mediaplayer
09-08 19:15:40.659 27582-27596/com.myaudioservice.app V/MediaPlayer﹕ message received msg=8, ext1=0, ext2=0
09-08 19:15:40.659 27582-27596/com.myaudioservice.app V/MediaPlayer﹕ notify(8, 0, 0) callback on disconnected mediaplayer
09-08 19:15:40.669 27582-27582/com.myaudioservice.app E/com.myaudioservice.app.PlayerService﹕ stop()
09-08 19:16:01.281 27582-27582/com.myaudioservice.app D/AbsListView﹕ onDetachedFromWindow
09-08 19:16:01.311 27582-27582/com.myaudioservice.app E/com.myaudioservice.app.PlayerService﹕ stop()
09-08 19:16:01.311 27582-27582/com.myaudioservice.app V/MediaPlayer-JNI﹕ release
09-08 19:16:01.311 27582-27582/com.myaudioservice.app V/MediaPlayer﹕ setListener
09-08 19:16:01.311 27582-27582/com.myaudioservice.app V/MediaPlayer﹕ disconnect
09-08 19:16:01.311 27582-27582/com.myaudioservice.app V/MediaPlayer﹕ destructor
09-08 19:16:01.311 27582-32148/com.myaudioservice.app W/dalvikvm﹕ threadid=14: thread exiting with uncaught exception (group=0x4193eda0)
09-08 19:16:01.311 27582-27582/com.myaudioservice.app V/MediaPlayer﹕ disconnect
09-08 19:16:01.321 27582-32148/com.myaudioservice.app E/AndroidRuntime﹕ FATAL EXCEPTION: Thread-15992
Process: com.myaudioservice.app, PID: 27582
java.lang.IllegalStateException
at android.media.MediaPlayer.isPlaying(Native Method)
at com.myaudioservice.app.PlayerService$1.run(PlayerService.java:129)
at java.lang.Thread.run(Thread.java:841)
In documentation you can read that MediaPlayer.isPlaying()
throws IllegalStateException if the internal player engine has not been initialized or has been released.
This code is not thread safe which is probably the reason of this exception (thread call release()
and before mediaPlayer
is set to null
app invoking isPlaying()
on released mediaPlayer
). You need to add some synchronization to make it work (or use async methods form MediaPlayer
).
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With