I implemented my video player and seekbar as below and I found when seekTo() function is done the thumb(position) will be reset to 0 just after buffering ends. The thumb only stays on where I dragged to for a second and being reset.
However the video works fine, it starts playing from where I dragged to every time, so my question is why the thumb position is not consistent with player?
public int setVideoProgress(int currentProgress) {
if (mVideoView == null)
return -1;
long time = currentProgress > 0 ? currentProgress : mVideoView.getCurrentPosition();
long length = mVideoView.getDuration();
Log.v(TAG, "setVideoProgress: "+time);
// Update all view elements
mPlayerSeekbar.setMax((int) length);
mPlayerSeekbar.setProgress((int) time);
if (time >= 0) {
String progress = time + "/" + length;
mPlayerPosition.setText(progress);
}
Message msg = new Message();
msg.what = UPDATE_SEEKBAR;
if (mHandler != null)
mHandler.sendMessageDelayed(msg, 1000);
return (int) time;
}
private int mVideoProgress = 0;
private SeekBar.OnSeekBarChangeListener mSeekBarListener = new SeekBar.OnSeekBarChangeListener() {
#Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
if (fromUser) {
mVideoProgress = progress;
mHandler.removeMessages(HIDDEN_SEEKBAR);
Message msg = new Message();
msg.what = HIDDEN_SEEKBAR;
mHandler.sendMessageDelayed(msg, 3000);
}
}
#Override
public void onStartTrackingTouch(SeekBar seekBar) {
}
#Override
public void onStopTrackingTouch(SeekBar seekBar) {
mVideoView.seekTo(mVideoProgress);
setVideoProgress(mVideoProgress);
}
};
private IMediaPlayer.OnPreparedListener mOnPreparedListener = new IMediaPlayer.OnPreparedListener() {
#Override
public void onPrepared(IMediaPlayer mp) {
if (mVideoView != null) {
mVideoView.setVideoScalingMode(KSYMediaPlayer.VIDEO_SCALING_MODE_SCALE_TO_FIT_WITH_CROPPING);
mVideoView.start();
setVideoProgress(0);
}
}
};
mHandler = new Handler() {
#Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
switch (msg.what) {
case UPDATE_SEEKBAR:
setVideoProgress(0);
break;
case HIDDEN_SEEKBAR:
mPlayerControlShow = false;
mPlayerControl.setVisibility(View.GONE);
break;
}
}
};
System logs as below:
08-11 23:06:19.193 20910-20910: setVideoProgress: 212743 (note: onStopTrackingTouch)
08-11 23:06:19.214 20910-20910: Buffering Start.
08-11 23:06:19.567 20910-20910: Buffering End.
08-11 23:06:19.682 20910-20910: setVideoProgress: 14 (reset to start point somehow)
Related
There is an issue with my player activity, which i cant resume play back.
Here is the code.
public class PlayerActivity extends AppCompatActivity implements SeekBar.OnSeekBarChangeListener, ExoPlayer.EventListener {
public static boolean incomingCall;
//object of timer
private Timer mTimer_heartBeat;
//timer task
private TimerTask mTimerTask_heartBeat;
//actions in player
private String mStr_output;
//checking heart beat started
private boolean mBoolean_heartbeatStarted = false;
//exoplayer
public static SimpleExoPlayerView sExoPlayerView;
public static SimpleExoPlayer player;
private static DataSource.Factory mediaDataSourceFactory;
private static EventLogger eventLogger;
BandwidthMeter bandwidthMeter;
static Handler mainHandler;
static MediaSource[] mediaSources;
static String mediaUrl = "";
ListAdapterDrawer listAdapterDrawer;
DrawerLayout mDrawerLayout;
ListView lv_drawer_player;
NavigationView navigation_view;
SeekBar seekbar_player;
static TextView tv_start_player, tv_end_player;
RelativeLayout rl_infopanel_player;
LinearLayout ll_controlpanel_player;
Helper helper;
FrameLayout bg_black;
Handler seekHandler;
ImageView iv_arrow_player;
ProgressBar progressBar;
private final Handler mHandler = new Handler();
// Create a list to contain the PlaylistItems
// protected static List<PlaylistItem> sList_play = new ArrayList<>();
public static ArrayList<MediaList> fullChannelList = new ArrayList<MediaList>();
public static int playerPos;
private String imageLogo;
ImageView bg_image;
boolean isLiveChannel = false;
private boolean isplaying = false;
Intent intent;
public static boolean isInPlayer = false;
private boolean isresume = false;
static Bundle savedInstanceState;
#Override
protected void onCreate(#Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
this.savedInstanceState = savedInstanceState;
Constants.resume = false;
intent = getIntent();
if (intent.getStringExtra("playType") != null) {
if (intent.getStringExtra("playType").equals("CHA")) {
setContentView(R.layout.drawer_player);
isLiveChannel = true;
}
} else {
isLiveChannel = false;
setContentView(R.layout.new_player_layout);
}
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);
sExoPlayerView = (SimpleExoPlayerView) findViewById(R.id.playerView);
progressBar = (ProgressBar) findViewById(R.id.pb_player);
iv_arrow_player = (ImageView) findViewById(R.id.iv_arrow_player);
iv_arrow_player.setOnClickListener(new View.OnClickListener() {
#Override
public void onClick(View v) {
mDrawerLayout.openDrawer(Gravity.RIGHT);
}
});
bg_image = (ImageView) findViewById(R.id.bg_image);
bg_black = (FrameLayout) findViewById(R.id.bg_black);
progressBar.setVisibility(View.GONE);
permissions();
if (intent.getStringExtra("url") != null) {
mediaUrl = intent.getStringExtra("url");
Log.i("mediaUrl+-", mediaUrl);
imageLogo = intent.getStringExtra("logo");
}
helper = new Helper();
MediaController();
fullChannelList = Constants.fullChannelList;
if (intent.getStringExtra("playType") != null) {//for live channel
if (intent.getStringExtra("playType").equals("CHA")) {
if ((imageLogo != null) && (imageLogo.contains("fm"))) {
bg_black.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));
bg_image.setVisibility(View.VISIBLE);
bg_black.setVisibility(View.VISIBLE);
Picasso.with(this).load(FirtTimeParsing.imageUrl + imageLogo).into(bg_image);
} else {
bg_image.setVisibility(View.GONE);
bg_black.setVisibility(View.INVISIBLE);
}
initPlayer();
drawerSetUp();
ll_controlpanel_player.setVisibility(View.GONE);
}
} else {
initPlayer();
bg_image.setVisibility(View.GONE);
bg_black.setVisibility(View.INVISIBLE);
iv_arrow_player.setVisibility(View.GONE);
}
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
Window window = getWindow();
window.setStatusBarColor(Color.TRANSPARENT);
}
}
private void permissions() {
//set run time permissions
if (Build.VERSION.SDK_INT > Build.VERSION_CODES.LOLLIPOP_MR1) {
checkSelfPermission(Manifest.permission.READ_PHONE_STATE);
if (checkSelfPermission(Manifest.permission.READ_PHONE_STATE) != PackageManager.PERMISSION_GRANTED) {
if (!ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.READ_PHONE_STATE)) {
// No explanation needed, we can request the permission.
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_PHONE_STATE}, 0);
}
}
}
}
private void initPlayer() {
// sExoPlayerView.setControllerVisibilityListener((PlaybackControlView.VisibilityListener) sActivity_player);
mediaDataSourceFactory = buildDataSourceFactory(true);
mainHandler = new Handler();
bandwidthMeter = new DefaultBandwidthMeter();
TrackSelection.Factory videoTrackSelectionFactory =
new AdaptiveTrackSelection.Factory(bandwidthMeter);
MappingTrackSelector trackSelector =
new DefaultTrackSelector(videoTrackSelectionFactory);
eventLogger = new EventLogger(trackSelector);
// 2. Create a default LoadControl
LoadControl loadControl = new DefaultLoadControl();
// 3. Create the player
player = ExoPlayerFactory.newSimpleInstance(this, trackSelector, loadControl);
sExoPlayerView.setPlayer(player);
sExoPlayerView.setBackgroundColor(Color.parseColor("#000000"));
seekbar_player = (SeekBar) sExoPlayerView.findViewById(R.id.seekbar_player);
tv_end_player = (TextView) sExoPlayerView.findViewById(R.id.tv_end_player);
tv_start_player = (TextView) sExoPlayerView.findViewById(R.id.tv_start_player);
rl_infopanel_player = (RelativeLayout) sExoPlayerView.findViewById(R.id.rl_infopanel_player);
ll_controlpanel_player = (LinearLayout) sExoPlayerView.findViewById(R.id.ll_controlpanel_player);
seekbar_player.setOnSeekBarChangeListener(this);
player.addListener(this);
loadPlayer();
}
private DataSource.Factory buildDataSourceFactory(boolean useBandwidthMeter) {
return ((BaseApplication) getApplication())
.buildDataSourceFactory(useBandwidthMeter ? (DefaultBandwidthMeter) bandwidthMeter : null);
}
private void loadPlayer() {
if (!isInPlayer) {
isInPlayer = true;
sExoPlayerView.setVisibility(View.VISIBLE);
mediaSources = new MediaSource[1];
Uri myUri = Uri.parse(mediaUrl);
mediaSources[0] = new HlsMediaSource(myUri, mediaDataSourceFactory, mainHandler, eventLogger);
MediaSource mediaSource = mediaSources.length == 1 ? mediaSources[0]
: new ConcatenatingMediaSource(mediaSources);
boolean haveResumePosition = false;
player.prepare(mediaSource, !haveResumePosition, false);
sExoPlayerView.setPlayer(player);
player.setPlayWhenReady(true);
if (!isLiveChannel) {
player.seekTo((long) Constants.seekto);
updateProgressBar();
}
Log.d("Time==", "play time " + new Date());
}
}
private void drawerSetUp() {
listAdapterDrawer = new ListAdapterDrawer(this, fullChannelList);
mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer);
lv_drawer_player = (ListView) findViewById(R.id.lv_drawer_player);
navigation_view = (NavigationView) mDrawerLayout.findViewById(R.id.navigation_view);
lv_drawer_player.setAdapter(listAdapterDrawer);
lv_drawer_player.setOnItemClickListener(new AdapterView.OnItemClickListener() {
#Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
if (!mediaUrl.equals(fullChannelList.get(position).getMediaUrl())) {
playclick(position);
mDrawerLayout.closeDrawer(Gravity.END);
} else {
mDrawerLayout.closeDrawer(Gravity.END);
}
}
});
}
public void playclick(int position) {
isInPlayer = false;
mediaUrl = fullChannelList.get(position).getMediaUrl();
imageLogo = fullChannelList.get(position).getLogo();
playerPos = position;
player.stop();
player.clearVideoSurface();
initPlayer();
}
private Runnable mUpdateTimeTask = new Runnable() {
public void run() {
long totalDuration = 0;
//sometime -ve value getting
if (player.getDuration() > 0) {
totalDuration = player.getDuration();
}
long currentDuration = player.getCurrentPosition();
// Displaying Total Duration time
// Log.d("mUpdateTimeTask==", "totalDuration " + totalDuration);
tv_end_player.setText("" + helper.milliSecondsToTimer(totalDuration));
// Displaying time completed playing
tv_start_player.setText("" + helper.milliSecondsToTimer(currentDuration));
// Updating progress bar
int progress = (int) (helper.getProgressPercentage(currentDuration, totalDuration));
//Log.d("Progress", ""+progress);
seekbar_player.setProgress(progress);
sExoPlayerView.setControllerShowTimeoutMs(5000);
sExoPlayerView.showController();
// Running this thread after 100 milliseconds
mHandler.postDelayed(this, 100);
}
};
public void updateProgressBar() {
seekHandler = new Handler();
seekHandler.postDelayed(mUpdateTimeTask, 100);
}
#Override
public void onConfigurationChanged(Configuration newConfig) {
// Set fullscreen when the device is rotated to landscape
//satatus bar color setting
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
Window window = getWindow();
window.setStatusBarColor(Color.TRANSPARENT);
}
bg_black.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));
// sJwPlayerView.setFullscreen(newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE, true);
super.onConfigurationChanged(newConfig);
}
#Override
protected void onResume() {
//satatus bar color setting
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
Window window = getWindow();
window.setStatusBarColor(Color.TRANSPARENT);
}
// Let JW Player know that the app has returned from the background JWPlayerView.onResume();
// sJwPlayerView.onResume();
// InitialDataFromServer login = new InitialDataFromServer(PlayerActivity.this);
// Constants.playerPosition = 0;
// login.PlayRequest(Constants.mediaId, Constants.start_play);
// loadPlayer();
// isInPlayer = false;
super.onResume();
}
#Override
protected void onPause() {
isresume = true;
// Let JW Player know that the app is going to the background JWPlayerView.onPause();
if (Constants.isPlaying) {
// sJwPlayerView.stop();
Constants.isPlaying = false;
Constants.playerPosition = player.getCurrentPosition();
isplaying = false;
player.stop();
player.release();
}
// stopPlayer();
super.onPause();
}
#Override
protected void onStop() {
try {
player.stop();
player.release();
// stopPlayer();
super.onStop();
} catch (IllegalArgumentException e) {
e.printStackTrace();
}
}
#Override
public void onBackPressed() {
stopPlayer();
super.onBackPressed();
if (isdirect) {
InitialDataFromServer initialDataFromServer = new InitialDataFromServer(PlayerActivity.this);
initialDataFromServer.login();
}
}
#Override
public void onDestroy() {
// stopPlayer();
Constants.isPlayPressed = false;
player.stop();
player.release();
super.onDestroy();
}
#Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
}
#Override
public void onStartTrackingTouch(SeekBar seekBar) {
// remove message Handler from updating progress bar
seekHandler.removeCallbacks(mUpdateTimeTask);
}
#Override
public void onStopTrackingTouch(SeekBar seekBar) {
mHandler.removeCallbacks(mUpdateTimeTask);
long totalDuration = player.getDuration();
int currentPosition = helper.progressToTimer(seekBar.getProgress(), totalDuration);
Log.d("onStopTrackingTouch==", "currentPosition " + currentPosition);
// forward or backward to certain seconds
player.seekTo(currentPosition);
// update timer progress again
updateProgressBar();
}
#Override
public void onTimelineChanged(Timeline timeline, Object manifest) {
}
#Override
public void onTracksChanged(TrackGroupArray trackGroups, TrackSelectionArray trackSelections) {
}
#Override
public void onLoadingChanged(boolean isLoading) {
}
#Override
public void onPlayerStateChanged(boolean playWhenReady, int playbackState) {
if (playbackState == ExoPlayer.STATE_ENDED) {//for close this activity after finish movie
Log.d("onPlayerStateChanged==", "STATE_ENDED==");
Constants.playerPosition = 0;
InitialDataFromServer initialDataFromServer = new InitialDataFromServer(PlayerActivity.this);
initialDataFromServer.PlayRequest(Constants.mediaId, Constants.stop_play);
isplaying = false;
sExoPlayerView.hideController();
progressBar.setVisibility(View.GONE);
}
if (playbackState == ExoPlayer.STATE_BUFFERING) {
Log.d("onPlayerStateChanged==", "STATE_BUFFERING==");
progressBar.setVisibility(View.VISIBLE);
isplaying = false;
sExoPlayerView.setControllerShowTimeoutMs(5000);
sExoPlayerView.showController();
}
if (playbackState == ExoPlayer.STATE_READY) {
Log.d("onPlayerStateChanged==", "STATE_READY==");
progressBar.setVisibility(View.GONE);
isplaying = true;
if ((imageLogo != null) && (imageLogo.contains("fm"))) {
bg_black.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));
bg_image.setVisibility(View.VISIBLE);
bg_black.setVisibility(View.VISIBLE);
Picasso.with(this).load(FirtTimeParsing.imageUrl + imageLogo).into(bg_image);
} else {
bg_image.setVisibility(View.GONE);
bg_black.setVisibility(View.GONE);
}
sExoPlayerView.setControllerShowTimeoutMs(5000);
sExoPlayerView.showController();
Log.i("Video_format++", String.valueOf(player.getRendererType(1)));
if (!isLiveChannel) {
setController();
heartbeat();
}
}
}
private void setController() {
sExoPlayerView.setOnTouchListener(new View.OnTouchListener() {
#Override
public boolean onTouch(View v, MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_DOWN) {
sExoPlayerView.setControllerShowTimeoutMs(3000);
sExoPlayerView.showController();
ll_controlpanel_player.setVisibility(View.VISIBLE);
new Handler().postDelayed(new Runnable() {
#Override
public void run() {
ll_controlpanel_player.setVisibility(View.GONE);
}
}, 3000);
}
return true;
}
});
}
private void stopPlayer() {
if (player.isLoading() || isplaying) {
isplaying = false;
player.stop();
player.release();
Constants.playerPosition = player.getCurrentPosition();
Log.i("currentPosition", Constants.playerPosition + "");
if (!isLiveChannel) {
InitialDataFromServer initialDataFromServer = new InitialDataFromServer(PlayerActivity.this);
initialDataFromServer.PlayRequest(Constants.mediaId, Constants.stop_play);
if (isdirect) {
initialDataFromServer.login();
} else {
finish();
}
} else {
finish();
}
}
Constants.isPlayPressed = false;
isInPlayer = false;
if (mBoolean_heartbeatStarted) {
mTimer_heartBeat.cancel();
mTimerTask_heartBeat.cancel();
}
}
#Override
public void onPlayerError(com.google.android.exoplayer2.ExoPlaybackException error) {
}
#Override
public void onPositionDiscontinuity() {
}
String motion;
Float x1 = Float.valueOf(0), x2 = Float.valueOf(0), y1 = Float.valueOf(0), y2 = Float.valueOf(0), motionX = Float.valueOf(0), motionY = Float.valueOf(0);
String xdirection = "", ydirection = "", operation = null;
int mScrenHeight, mScreenWidth;
public void MediaController() {
DisplayMetrics displayMetrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(displayMetrics);
// heartbeat();
mScrenHeight = displayMetrics.heightPixels;
mScreenWidth = displayMetrics.widthPixels;
Log.i("Display++", "Width: " + mScreenWidth + "\nHeight: " + mScrenHeight);
sExoPlayerView.setOnTouchListener(new View.OnTouchListener()
{
#Override
public boolean onTouch(View v, MotionEvent event) {
// Log.i("event++", event.toString());
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
x1 = event.getX();
y1 = event.getY();
break;
case MotionEvent.ACTION_UP:
x2 = event.getX();
y2 = event.getY();
if ((x2 - x1) > 0) {
motionX = x2 - x1;
xdirection = "+";
} else {
motionX = x1 - x2;
xdirection = "-";
}
if ((y2 - y1) > 0) {
motionY = y2 - y1;
ydirection = "-";
} else {
motionY = y1 - y2;
ydirection = "+";
}
if (motionX < motionY) {
motion = "vertical";
if (x1 > (mScreenWidth / 2)) {
operation = "volumeControll";
} else {
operation = "brightnessControll";
}
xdirection = "";
} else {
operation = "playbackControll";
motion = "horizontal";
ydirection = "";
}
Log.i("drag++", operation + xdirection + ydirection);
if (operation.equalsIgnoreCase("volumeControll")) {
if (motionY > mScreenWidth / 5) {
if (ydirection.equalsIgnoreCase("+")) {
if (player.getVolume() < 1) {
player.setVolume((float) (player.getVolume() + 0.1));
}
} else {
if (player.getVolume() > 0) {
player.setVolume((float) (player.getVolume() - 0.1));
}
}
Log.i("drag++", "volume:" + player.getVolume());
}
} else if (operation.equalsIgnoreCase("brightnessControll")) {
if (motionY > mScrenHeight / 5) {
WindowManager.LayoutParams lp = getWindow().getAttributes();
Float brightness = lp.screenBrightness;
Log.i("drag++", "Brightness:" + getWindow().getAttributes().screenBrightness);
if (ydirection.equalsIgnoreCase("+")) {
if (lp.screenBrightness < 255) {
lp.screenBrightness = brightness + 15;
getWindow().setAttributes(lp);
}
} else {
if (lp.screenBrightness > 0) {
lp.screenBrightness = brightness - 15;
getWindow().setAttributes(lp);
}
}
}
} else if (operation.equalsIgnoreCase("playbackControll")) {
if (motionX > mScreenWidth / 10) {
if (xdirection.equalsIgnoreCase("+")) {
if (isLiveChannel) {
if (0 < playerPos) {
playclick(playerPos - 1);
} else {
playclick(fullChannelList.size() - 1);
}
} else {
if (player.getCurrentPosition() < (player.getDuration() - 10000)) {
player.seekTo(player.getCurrentPosition() + 10000);
} else {
player.seekTo(player.getDuration() - 1000);
}
}
} else {
if (isLiveChannel) {
if (playerPos < fullChannelList.size() - 1) {
playclick(playerPos + 1);
} else {
playclick(0);
}
} else {
if (player.getCurrentPosition() > 10000) {
player.seekTo(player.getCurrentPosition() - 10000);
} else {
player.seekTo(100);
}
}
}
}
}
break;
}
return true;
}
});
}
public void heartbeat() {
int delay = 30; // delay for 0.03 sec.
int period = 10000; // repeat every 10 sec.
mTimer_heartBeat = new Timer();
mTimerTask_heartBeat = new TimerTask() {
#Override
public void run() {
mBoolean_heartbeatStarted = true;
Log.d("heartbeat==", "heartbeat");
Constants.playerPosition = player.getCurrentPosition();
if (isplaying) {
InitialDataFromServer login = new InitialDataFromServer(PlayerActivity.this);
login.PlayRequest(Constants.mediaId, Constants.heartbeat);
}
}
};
mTimer_heartBeat.schedule(mTimerTask_heartBeat, delay, period); // 10000 is time in ms
}
}
Player is working fine. But when the device locks and activity resumes the player is not resuming the playback.Please help me to resolve this issue.
Thanks in advance.
Try changing on resume with the below code
#Override
protected void onResume() {
//satatus bar color setting
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
Window window = getWindow();
window.setStatusBarColor(Color.TRANSPARENT);
}
if (isresume) {
isresume=false;
player.stop();
player.clearVideoSurface();
isInPlayer = false;
seekto = Constants.playerPosition;
initPlayer();
loadPlayer();
} else {
loadPlayer();
}
super.onResume();
}
My code seems fine but suddenly after cleaning up my code i started reviving a run time error please help :
Error Log :
05-04 02:13:13.556: E/MediaPlayer(16609): start called in state 4
05-04 02:13:13.556: E/MediaPlayer(16609): error (-38, 0)
05-04 02:13:13.556: E/MediaPlayer(16609): Error (-38,0)
05-04 02:13:13.558: D/AndroidRuntime(16609): Shutting down VM
05-04 02:13:13.558: W/dalvikvm(16609): threadid=1: thread exiting with uncaught exception (group=0x41c88d40)
05-04 02:13:13.564: E/AndroidRuntime(16609): FATAL EXCEPTION: main
05-04 02:13:13.564: E/AndroidRuntime(16609): Process: com.ayush.mymusicplayer, PID: 16609
05-04 02:13:13.564: E/AndroidRuntime(16609): java.lang.RuntimeException: Error receiving broadcast Intent { act=com.ayush.mymusicplayer.seekprogress flg=0x10 (has extras) } in com.ayush.mymusicplayer.MyMainActivity$1#42553a80
05-04 02:13:13.564: E/AndroidRuntime(16609): at android.app.LoadedApk$ReceiverDispatcher$Args.run(LoadedApk.java:778)
05-04 02:13:13.564: E/AndroidRuntime(16609): at android.os.Handler.handleCallback(Handler.java:733)
05-04 02:13:13.564: E/AndroidRuntime(16609): at android.os.Handler.dispatchMessage(Handler.java:95)
05-04 02:13:13.564: E/AndroidRuntime(16609): at android.os.Looper.loop(Looper.java:136)
05-04 02:13:13.564: E/AndroidRuntime(16609): at android.app.ActivityThread.main(ActivityThread.java:5102)
05-04 02:13:13.564: E/AndroidRuntime(16609): at java.lang.reflect.Method.invokeNative(Native Method)
05-04 02:13:13.564: E/AndroidRuntime(16609): at java.lang.reflect.Method.invoke(Method.java:515)
05-04 02:13:13.564: E/AndroidRuntime(16609): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785)
05-04 02:13:13.564: E/AndroidRuntime(16609): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601)
05-04 02:13:13.564: E/AndroidRuntime(16609): at dalvik.system.NativeStart.main(Native Method)
05-04 02:13:13.564: E/AndroidRuntime(16609): Caused by: java.lang.NumberFormatException: Invalid int: "null"
05-04 02:13:13.564: E/AndroidRuntime(16609): at java.lang.Integer.invalidInt(Integer.java:137)
05-04 02:13:13.564: E/AndroidRuntime(16609): at java.lang.Integer.parseInt(Integer.java:354)
05-04 02:13:13.564: E/AndroidRuntime(16609): at java.lang.Integer.parseInt(Integer.java:331)
05-04 02:13:13.564: E/AndroidRuntime(16609): at com.ayush.mymusicplayer.MyMainActivity.updateUI(MyMainActivity.java:356)
05-04 02:13:13.564: E/AndroidRuntime(16609): at com.ayush.mymusicplayer.MyMainActivity.access$0(MyMainActivity.java:352)
05-04 02:13:13.564: E/AndroidRuntime(16609): at com.ayush.mymusicplayer.MyMainActivity$1.onReceive(MyMainActivity.java:348)
05-04 02:13:13.564: E/AndroidRuntime(16609): at android.app.LoadedApk$ReceiverDispatcher$Args.run(LoadedApk.java:768)
05-04 02:13:13.564: E/AndroidRuntime(16609): ... 9 more
05-04 02:13:18.279: I/Process(16609): Sending signal. PID: 16609 SIG: 9
MyMainActivity : (Error seems to be pointing the reviver - "broadcastReceiver" in this class which receive the info for seekbar ! the error occurs when i start playSong() )
public class MyMainActivity extends Activity implements OnSeekBarChangeListener {
private ImageButton btnPlay;
private ImageButton btnForward;
private ImageButton btnBackward;
private ImageButton btnNext;
private ImageButton btnPrevious;
private ImageButton btnPlaylist;
private ImageButton btnRepeat;
private ImageButton btnShuffle;
private TextView songTitleLabel;
private TextView songCurrentDurationLabel;
private TextView songTotalDurationLabel;
private SeekBar songProgressBar;
private int seekMax;
private int seekProgress;
private static int songEnded = 0;
boolean mBroadcastIsRegistered;
private int seekPos;
private SongsManager songManager;
private Utilities utils;
private int seekForwardTime = 5000; // 5000 milliseconds
private int seekBackwardTime = 5000; // 5000 milliseconds
private int currentSongIndex = 0;
private boolean isShuffle = false;
private boolean isRepeat = false;
private boolean startedPlaying = false;
private boolean paused = false;
private ArrayList<HashMap<String, String>> songsList = new ArrayList<HashMap<String, String>>();
Intent serviceIntent;
// Broadcasting
Intent broadcastStateIntent;
public static final String BROADCASTING = "com.ayush.mymusicplayer.broadcasting";
// --Set up constant ID for broadcast of seekbar position--
public static final String BROADCAST_SEEKBAR = "com.ayush.mymusicplayer.sendseekbar";
Intent intent;
#Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.player);
try {
// All player buttons
btnPlay = (ImageButton) findViewById(R.id.btnPlay);
btnForward = (ImageButton) findViewById(R.id.btnForward);
btnBackward = (ImageButton) findViewById(R.id.btnBackward);
btnNext = (ImageButton) findViewById(R.id.btnNext);
btnPrevious = (ImageButton) findViewById(R.id.btnPrevious);
btnPlaylist = (ImageButton) findViewById(R.id.btnPlaylist);
btnRepeat = (ImageButton) findViewById(R.id.btnRepeat);
btnShuffle = (ImageButton) findViewById(R.id.btnShuffle);
songProgressBar = (SeekBar) findViewById(R.id.songProgressBar);
songTitleLabel = (TextView) findViewById(R.id.songTitle);
songCurrentDurationLabel = (TextView) findViewById(R.id.songCurrentDurationLabel);
songTotalDurationLabel = (TextView) findViewById(R.id.songTotalDurationLabel);
songManager = new SongsManager();
utils = new Utilities();
// --- set up seekbar intent for broadcasting new position to
// service ---
intent = new Intent(BROADCAST_SEEKBAR);
broadcastStateIntent = new Intent(BROADCASTING);
serviceIntent = new Intent(this, myPlayService.class);
// Getting all songs list
songsList = songManager.getPlayList();
// set the starting title song
songTitleLabel.setText(songsList.get(0).get("songTitle"));
// Listeners
songProgressBar.setOnSeekBarChangeListener(this);
/**
* Play button click event
* plays a song and changes button to pause image
* pauses a song and changes button to play image
* */
btnPlay.setOnClickListener(new View.OnClickListener() {
#Override
public void onClick(View arg0) {
// check for already playing
if (startedPlaying == false && paused == false) {
// Changing button image to pause button
btnPlay.setImageResource(R.drawable.btn_pause);
playSong(currentSongIndex);
startedPlaying = true;
paused = false;
} else if (startedPlaying == false && paused == true) {
// Changing button image to play button
btnPlay.setImageResource(R.drawable.btn_pause);
resumingBroadcast();
paused = false;
startedPlaying = true;
}
else if (startedPlaying == true && paused == false) {
// Changing button image to play button
btnPlay.setImageResource(R.drawable.btn_play);
pausingBroadcast();
paused = true;
startedPlaying = false;
}
}
});
/**
* Forward button click event Forwards song specified seconds
* */
btnForward.setOnClickListener(new View.OnClickListener() {
#Override
public void onClick(View arg0) {
// check if seekForward time is lesser than song duration
if (seekProgress + seekForwardTime <= seekMax) {
// forward song
seekPos = seekProgress + seekForwardTime;
intent.putExtra("seekpos", seekPos);
sendBroadcast(intent);
} else {
// forward to end position
seekPos = seekMax;
intent.putExtra("seekpos", seekPos);
sendBroadcast(intent);
}
}
});
/**
* Backward button click event Backward song to specified seconds
* */
btnBackward.setOnClickListener(new View.OnClickListener() {
#Override
public void onClick(View arg0) {
// check if seekBackward time is greater than 0 sec
if (seekProgress - seekBackwardTime >= 0) {
// forward song
seekPos = seekProgress + seekBackwardTime;
intent.putExtra("seekpos", seekPos);
sendBroadcast(intent);
} else {
// backward to starting position
intent.putExtra("seekpos", 0);
sendBroadcast(intent);
}
}
});
/**
* Button Click event for Play list click event Launches list
* activity which displays list of songs
* */
btnPlaylist.setOnClickListener(new View.OnClickListener() {
#Override
public void onClick(View arg0) {
Intent i = new Intent(getApplicationContext(),
PlayListActivity.class);
startActivityForResult(i, 100);
}
});
/**
* Next button click event Plays next song by taking
* currentSongIndex + 1
* */
btnNext.setOnClickListener(new View.OnClickListener() {
#Override
public void onClick(View arg0) {
if (isShuffle) {
// shuffle is on - play a random song
Random rand = new Random();
currentSongIndex = rand.nextInt((songsList.size() - 1) - 0 + 1) + 0;
playSong(currentSongIndex);
} else {
// check if next song is there or not
if (currentSongIndex < (songsList.size() - 1)) {
playSong(currentSongIndex + 1);
currentSongIndex = currentSongIndex + 1;
} else {
// play first song
playSong(0);
currentSongIndex = 0;
}
}
}
});
/**
* Back button click event Plays previous song by currentSongIndex -
* 1
* */
btnPrevious.setOnClickListener(new View.OnClickListener() {
#Override
public void onClick(View arg0) {
if (isShuffle) {
// shuffle is on - play a random song
Random rand = new Random();
currentSongIndex = rand.nextInt((songsList.size() - 1) - 0 + 1) + 0;
playSong(currentSongIndex);
} else {
if (currentSongIndex > 0) {
playSong(currentSongIndex - 1);
currentSongIndex = currentSongIndex - 1;
} else {
// play last song
playSong(songsList.size() - 1);
currentSongIndex = songsList.size() - 1;
}
}
}
});
/**
* Button Click event for Repeat button Enables repeat flag to true
* */
btnRepeat.setOnClickListener(new View.OnClickListener() {
#Override
public void onClick(View arg0) {
if (isRepeat) {
isRepeat = false;
Toast.makeText(getApplicationContext(),
"Repeat is OFF", Toast.LENGTH_SHORT).show();
btnRepeat.setImageResource(R.drawable.btn_repeat);
} else {
// make repeat to true
isRepeat = true;
Toast.makeText(getApplicationContext(), "Repeat is ON",
Toast.LENGTH_SHORT).show();
// make shuffle to false
isShuffle = false;
btnRepeat
.setImageResource(R.drawable.btn_repeat_focused);
btnShuffle.setImageResource(R.drawable.btn_shuffle);
}
}
});
/**
* Button Click event for Shuffle button Enables shuffle flag to
* true
* */
btnShuffle.setOnClickListener(new View.OnClickListener() {
#Override
public void onClick(View arg0) {
if (isShuffle) {
isShuffle = false;
Toast.makeText(getApplicationContext(),
"Shuffle is OFF", Toast.LENGTH_SHORT).show();
btnShuffle.setImageResource(R.drawable.btn_shuffle);
} else {
// make repeat to true
isShuffle = true;
Toast.makeText(getApplicationContext(),
"Shuffle is ON", Toast.LENGTH_SHORT).show();
// make shuffle to false
isRepeat = false;
btnShuffle
.setImageResource(R.drawable.btn_shuffle_focused);
btnRepeat.setImageResource(R.drawable.btn_repeat);
}
}
});
} catch (Exception e) {
e.printStackTrace();
Toast.makeText(getApplicationContext(),
e.getClass().getName() + " " + e.getMessage(),
Toast.LENGTH_LONG).show();
}
}
/**
* Receiving song index from playlist view and play the song
* */
#Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == 100) {
currentSongIndex = data.getExtras().getInt("songIndex");
// play selected song
playSong(currentSongIndex);
}
}
// -- onPause, unregister broadcast receiver. To improve, also save screen data ---
#Override
protected void onPause() {
// Unregister broadcast receiver
if (mBroadcastIsRegistered) {
unregisterReceiver(broadcastReceiver);
mBroadcastIsRegistered = false;
}
super.onPause();
}
// -- onResume register broadcast receiver. To improve, retrieve saved screen data ---
#Override
protected void onResume() {
// Register broadcast receiver
if (!mBroadcastIsRegistered) {
registerReceiver(broadcastReceiver, new IntentFilter(
myPlayService.BROADCAST_ACTION));
mBroadcastIsRegistered = true;
}
super.onResume();
}
// -- Broadcast Receiver to update position of seekbar from service --
private BroadcastReceiver broadcastReceiver = new BroadcastReceiver() {
public void onReceive(Context context, Intent serviceIntent) {
updateUI(serviceIntent);
}
};
private void updateUI(Intent serviceIntent) {
String counter = serviceIntent.getStringExtra("counter");
String mediamax = serviceIntent.getStringExtra("mediamax");
String strSongEnded = serviceIntent.getStringExtra("song_ended");
seekProgress = Integer.parseInt(counter);
seekMax = Integer.parseInt(mediamax);
songEnded = Integer.parseInt(strSongEnded);
songProgressBar.setMax(seekMax);
songProgressBar.setProgress(seekProgress);
// Displaying Total Duration time
songTotalDurationLabel.setText("" + utils.milliSecondsToTimer(seekMax));
// Displaying time completed playing
songCurrentDurationLabel.setText(""
+ utils.milliSecondsToTimer(seekProgress));
if (songEnded == 1) {
// check for repeat is ON or OFF
if (isRepeat) {
// repeat is on play same song again
playSong(currentSongIndex);
} else if (isShuffle) {
// shuffle is on - play a random song
Random rand = new Random();
currentSongIndex = rand.nextInt((songsList.size() - 1) - 0 + 1) + 0;
playSong(currentSongIndex);
} else {
// no repeat or shuffle ON - play next song
if (currentSongIndex < (songsList.size() - 1)) {
playSong(currentSongIndex + 1);
currentSongIndex = currentSongIndex + 1;
} else {
// play first song
playSong(0);
currentSongIndex = 0;
}
}
}
}
// Send a message to Server to pause
private void pausingBroadcast() {
// Log.v(TAG, "BufferCompleteSent");
broadcastStateIntent.putExtra("Broadcasting", "0");
paused = true;
btnPlay.setImageResource(R.drawable.btn_play);
sendBroadcast(broadcastStateIntent);
}
// Send a message to Server to resume
private void resumingBroadcast() {
broadcastStateIntent.putExtra("Broadcasting", "1");
paused = false;
btnPlay.setImageResource(R.drawable.btn_pause);
sendBroadcast(broadcastStateIntent);
}
// Function to play a song
public void playSong(int songIndex) {
stopMyPlayService();
paused = false;
startedPlaying = true;
serviceIntent.putExtra("currentSongIndex", songIndex);
// -- Register receiver for seekbar--
registerReceiver(broadcastReceiver, new IntentFilter(
myPlayService.BROADCAST_ACTION));
mBroadcastIsRegistered = true;
try {
startService(serviceIntent);
// Displaying Song title
String songTitle = songsList.get(songIndex).get("songTitle");
songTitleLabel.setText(songTitle);
// Changing Button Image to pause image
btnPlay.setImageResource(R.drawable.btn_pause);
// set Progress bar values
songProgressBar.setProgress(0);
songProgressBar.setMax(100);
} catch (Exception e) {
e.printStackTrace();
Toast.makeText(getApplicationContext(),
e.getClass().getName() + " " + e.getMessage(),
Toast.LENGTH_LONG).show();
}
}
private void stopMyPlayService() {
// --Unregister broadcastReceiver for seekbar
if (mBroadcastIsRegistered) {
try {
unregisterReceiver(broadcastReceiver);
mBroadcastIsRegistered = false;
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
Toast.makeText(
getApplicationContext(),
e.getClass().getName() + " " + e.getMessage(),
Toast.LENGTH_LONG).show();
}
}
try {
stopService(serviceIntent);
} catch (Exception e) {
e.printStackTrace();
Toast.makeText(getApplicationContext(),
e.getClass().getName() + " " + e.getMessage(),
Toast.LENGTH_LONG).show();
}
}
// --- When user manually moves seekbar, broadcast new position to service
#Override
public void onProgressChanged(SeekBar sb, int progress, boolean fromUser) {
// TODO Auto-generated method stub
if (fromUser) {
seekPos = sb.getProgress();
intent.putExtra("seekpos", seekPos);
sendBroadcast(intent);
}
}
#Override
public void onStartTrackingTouch(SeekBar arg0) {
// TODO Auto-generated method stub
}
#Override
public void onStopTrackingTouch(SeekBar arg0) {
// TODO Auto-generated method stub
}
}
myPlayService : (the class which is broadcasting messages)
public class myPlayService extends Service implements OnCompletionListener,
OnPreparedListener, OnSeekCompleteListener, OnErrorListener {
// Media Player
private MediaPlayer mp;
private int currentSongIndex;
private ArrayList<HashMap<String, String>> songsList = new ArrayList<HashMap<String, String>>();
private SongsManager songManager;
// Pausing when phone call
private boolean isPausedInCall = false;
private PhoneStateListener phoneStateListener;
private TelephonyManager telephonyManager;
// Declare headsetSwitch variable
private int headsetSwitch = 1;
// ---Variables for seekbar processing---
Intent seekIntent;
String sntSeekPos;
int intSeekPos;
int mediaPosition;
int mediaMax;
private final Handler handler = new Handler();
private int songEnded = 0;
public static final String BROADCAST_ACTION = "com.ayush.mymusicplayer.seekprogress";
public void onCreate() {
// ---Set up intent for seekbar broadcast ---
seekIntent = new Intent(BROADCAST_ACTION);
// Register headset receiver
registerReceiver(headsetReceiver, new IntentFilter(
Intent.ACTION_HEADSET_PLUG));
songManager = new SongsManager();
songsList = songManager.getPlayList();
mp = new MediaPlayer();
mp.setOnCompletionListener(this);
mp.setOnPreparedListener(this);
mp.setOnSeekCompleteListener(this);
mp.setOnErrorListener(this);
mp.reset();
}
public int onStartCommand(Intent intent, int flags, int startId) {
// ---Set up receiver for State change ---
registerReceiver(broadcastActivityReceiver, new IntentFilter(
MyMainActivity.BROADCASTING));
// ---Set up receiver for seekbar change ---
registerReceiver(broadcastReceiver, new IntentFilter(
MyMainActivity.BROADCAST_SEEKBAR));
// Manage incoming phone calls during playback. Pause mp on incoming,
// resume on hangup.
// -----------------------------------------------------------------------------------
// Get the telephony manager
telephonyManager = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
phoneStateListener = new PhoneStateListener() {
#Override
public void onCallStateChanged(int state, String incomingNumber) {
switch (state) {
case TelephonyManager.CALL_STATE_OFFHOOK:
case TelephonyManager.CALL_STATE_RINGING:
if (mp != null) {
pauseMedia();
isPausedInCall = true;
}
break;
case TelephonyManager.CALL_STATE_IDLE:
// Phone idle. Start playing.
if (mp != null) {
if (isPausedInCall) {
isPausedInCall = false;
playMedia();
}
}
break;
}
}
};
// Register the listener with the telephony manager
telephonyManager.listen(phoneStateListener,
PhoneStateListener.LISTEN_CALL_STATE);
// Getting song Index from MyMainActivity
currentSongIndex = intent.getExtras().getInt("currentSongIndex");
mp.reset();
if (!mp.isPlaying()) {
try {
mp.setDataSource(songsList.get(currentSongIndex)
.get("songPath"));
mp.prepareAsync();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalStateException e) {
e.printStackTrace();
} catch (IOException e) {
}
}
// --- Set up seekbar handler ---
setupHandler();
return START_STICKY;
}
// If headset gets unplugged, stop music and service.
private BroadcastReceiver headsetReceiver = new BroadcastReceiver() {
private boolean headsetConnected = false;
#Override
public void onReceive(Context context, Intent intent) {
// TODO Auto-generated method stub
if (intent.hasExtra("state")) {
if (headsetConnected && intent.getIntExtra("state", 0) == 0) {
headsetConnected = false;
headsetSwitch = 0;
} else if (!headsetConnected
&& intent.getIntExtra("state", 0) == 1) {
headsetConnected = true;
headsetSwitch = 1;
}
}
switch (headsetSwitch) {
case (0):
pauseMedia();
break;
case (1):
playMedia();
break;
}
}
};
// ---Send seekbar info to activity----
private void setupHandler() {
handler.removeCallbacks(sendUpdatesToUI);
handler.postDelayed(sendUpdatesToUI, 250); // 0.25 second
}
private Runnable sendUpdatesToUI = new Runnable() {
public void run() {
LogMediaPosition();
handler.postDelayed(this, 250); // 0.25 seconds
}
};
private void LogMediaPosition() {
if (mp.isPlaying()) {
mediaPosition = mp.getCurrentPosition();
mediaMax = mp.getDuration();
seekIntent.putExtra("counter", String.valueOf(mediaPosition));
seekIntent.putExtra("mediamax", String.valueOf(mediaMax));
seekIntent.putExtra("song_ended", String.valueOf(songEnded));
sendBroadcast(seekIntent);
}
}
// --Receive seekbar position if it has been changed by the user in the
// activity
private BroadcastReceiver broadcastReceiver = new BroadcastReceiver() {
#Override
public void onReceive(Context context, Intent intent) {
updateSeekPos(intent);
}
};
// Update seek position from Activity
public void updateSeekPos(Intent intent) {
int seekPos = intent.getIntExtra("seekpos", 0);
if (mp.isPlaying()) {
handler.removeCallbacks(sendUpdatesToUI);
mp.seekTo(seekPos);
setupHandler();
}
}
// Play Song After Complition !
#Override
public void onSeekComplete(MediaPlayer mp) {
if (!mp.isPlaying()) {
playMedia();
}
}
public void onPrepared(MediaPlayer arg0) {
// Send a message to activity to end progress dialogue
playMedia();
}
// Set up broadcast receiver
private BroadcastReceiver broadcastActivityReceiver = new BroadcastReceiver() {
#Override
public void onReceive(Context context, Intent broadcastIntent) {
String broadcastValue = broadcastIntent
.getStringExtra("Broadcasting");
int broadcastIntValue = Integer.parseInt(broadcastValue);
switch (broadcastIntValue) {
case 0:
pauseMedia();
break;
case 1:
playMedia();
break;
}
}
};
public void pauseMedia() {
if (mp.isPlaying()) {
mp.pause();
}
}
public void playMedia() {
if (!mp.isPlaying()) {
mp.start();
}
}
#Override
public void onCompletion(MediaPlayer arg0) {
seekIntent.putExtra("song_ended", "1");
sendBroadcast(seekIntent);
stopSelf();
}
#Override
public void onDestroy() {
super.onDestroy();
if (mp != null) {
if (mp.isPlaying()) {
mp.stop();
}
mp.reset();
mp.release();
}
if (phoneStateListener != null) {
telephonyManager.listen(phoneStateListener,
PhoneStateListener.LISTEN_NONE);
}
// Stop the seekbar handler from sending updates to UI
handler.removeCallbacks(sendUpdatesToUI);
unregisterReceiver(headsetReceiver);
// Unregister seekbar receiver
unregisterReceiver(broadcastReceiver);
unregisterReceiver(broadcastActivityReceiver);
stopSelf();
}
// ---Error processing ---
#Override
public boolean onError(MediaPlayer mp, int what, int extra) {
switch (what) {
case MediaPlayer.MEDIA_ERROR_NOT_VALID_FOR_PROGRESSIVE_PLAYBACK:
Toast.makeText(this,
"MEDIA ERROR NOT VALID FOR PROGRESSIVE PLAYBACK " + extra,
Toast.LENGTH_SHORT).show();
break;
case MediaPlayer.MEDIA_ERROR_SERVER_DIED:
Toast.makeText(this, "MEDIA ERROR SERVER DIED " + extra,
Toast.LENGTH_SHORT).show();
break;
case MediaPlayer.MEDIA_ERROR_UNKNOWN:
Toast.makeText(this, "MEDIA ERROR UNKNOWN " + extra,
Toast.LENGTH_SHORT).show();
break;
}
return false;
}
#Override
public IBinder onBind(Intent arg0) {
// TODO Auto-generated method stub
return null;
}
}
Thanks In Advance ! :)
See this part in the error message:
NumberFormatException: Invalid int: "null"
you seem to try to parse the String "null" to an int. This is not possible and will therefore throw NumberFormatException.
I have a ball that keeps moving from start. I want to stop ball on button click. When I clicked on button it show the Toast, but the ball keep on moving. It doesn't stop.
Please guide me how to stop ball on button click. My code for Activity is there.
#SuppressLint("HandlerLeak")
public class BounceActivity extends Activity {
private static final int GAME_START = 500;
private static final int GAME_STOP = 600;
Thread myRefreshThread = null;
BounceView myBounceView = null;
int width = 0;
int height = 0;
Handler myGUIUpdateHandler = new Handler() {
public void handleMessage(Message msg) {
switch (msg.what) {
case BounceActivity.GAME_START:
myBounceView.invalidate();
break;
case BounceActivity.GAME_STOP:
Log.d("BounceView", "Game state: " + BounceView.game_state);
Toast.makeText(BounceActivity.this, "Game stopped", Toast.LENGTH_SHORT).show();
myRefreshThread = null;
break;
}
super.handleMessage(msg);
}
};
#Override
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
this.requestWindowFeature(Window.FEATURE_NO_TITLE);
DisplayMetrics dm = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(dm);
this.myBounceView = new BounceView(this, dm.widthPixels, dm.heightPixels);
this.setContentView(myBounceView);
myRefreshThread = new Thread(new RefreshRunner());
myRefreshThread.start();
}
class RefreshRunner implements Runnable {
#Override
public void run() {
while (myRefreshThread != null) {
if(BounceView.game_state == 0) {
Message msg = Message.obtain();
msg.what = BounceActivity.GAME_START;
myGUIUpdateHandler.sendMessage(msg);
} else if (BounceView.game_state == 1) {
Message msg = Message.obtain();
msg.what = BounceActivity.GAME_STOP;
myGUIUpdateHandler.sendMessage(msg);
}
try {
Thread.sleep(100);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
}
}
}}
You are accessing and setting myRefreshThread on different threads, which can be problematic.
Instead of checking if myRefreshThread is null in your while loop, you can add a "running" flag to RefreshRunner, and a stop method that sets it to false.
Than check that flag in the while loop.
Hold a reference to your RefreshRunner (the one you pass to myRefreshThread), and call stop() when you want the animation to stop.
class RefreshRunner implements Runnable {
private void mRunning = true;
public void stop () {
mRunning = false;
}
#Override
public void run() {
while (mRunning) {
if(BounceView.game_state == 0) {
Message msg = Message.obtain();
msg.what = BounceActivity.GAME_START;
myGUIUpdateHandler.sendMessage(msg);
} else if (BounceView.game_state == 1) {
Message msg = Message.obtain();
msg.what = BounceActivity.GAME_STOP;
myGUIUpdateHandler.sendMessage(msg);
}
try {
Thread.sleep(100);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
}
}
}}
To update a seekbar, I am using the following code:
My problem is that anytime the seekBar.setProgress() is call, other element on the UI become freezed, so I would like to have a different thread that update the seekBar in the main thread.
How to proceed ?
private Handler mHandler = new Handler() {
#Override
public void handleMessage(Message msg) {
try {
int pos;
switch (msg.what) {
case SHOW_PROGRESS:
pos = setProgress();
if (!mDragging && mBoundService.isPlaying()) {
msg = obtainMessage(SHOW_PROGRESS);
sendMessageDelayed(msg, 100 - (pos % 1000));
}
break;
}
} catch (Exception e) {
}
}
};
private int setProgress() {
if (mBoundService == null || mDragging) {
return 0;
}
int position = mBoundService.getCurrentPosition();
int duration = mBoundService.getDuration();
if (sliderSeekBar != null) {
if (duration > 0) {
// use long to avoid overflow
long pos = 1000L * position / duration;
sliderSeekBar.setProgress((int) pos);
}
}
if (sliderTimerStop != null)
sliderTimerStop.setText(stringForTime(duration));
if (sliderTimerStart != null)
sliderTimerStart.setText(stringForTime(position));
return position;
}
Activities have a runOnUiThread method that allows separate threads to update UI components. Your setProgress method would end up looking like:
private int setProgress() {
if (mBoundService == null || mDragging) {
return 0;
}
final int position = mBoundService.getCurrentPosition();
final int duration = mBoundService.getDuration();
runOnUiThread(new Runnable(){
#Override
public void run(){
if (sliderSeekBar != null) {
if (duration > 0) {
// use long to avoid overflow
long pos = 1000L * position / duration;
sliderSeekBar.setProgress((int) pos);
}
}
if (sliderTimerStop != null)
sliderTimerStop.setText(stringForTime(duration));
if (sliderTimerStart != null)
sliderTimerStart.setText(stringForTime(position));
}
});
return position;
}
I want to use MediaRecorder for recording the sounds and then want to calculate the "amplitude" for moving Bars up and down with the change in sound.I haven't Founded any proper solution yet. any suggestions.?? Edited: I managed to get my hand into it now the problem is i have Tried getMaxAmplitude() to find amplitude using Handler after that i am trying to use that value to show a bar movement up it did nt work then i printed the value of getMaxAmplitude() certainly the value comes out to be zero.what could be wrong here.?? Here is the piece of code
public void run() {
try {
mRecorder.start();
while (this.mIsRunning) {
// creating these variables here so that
// the mode change can be handled
double amp = getAmplitude();
Message msg = mHandle.obtainMessage(MY_MSG, amp);
mHandle.sendMessage(msg);
}
} catch (Exception e) {
e.printStackTrace();
Message msg = mHandle.obtainMessage(ERROR_MSG,
e.getLocalizedMessage() + "");
mHandle.sendMessage(msg);
}
if (mRecorder != null) {
mRecorder.stop();
mRecorder.release();
mRecorder = null;
}
}
public double getAmplitude() {
if (mRecorder != null) {
powerDb = 20 * Math.log10(mRecorder.getMaxAmplitude() / 2700.0);
return (powerDb);
}
else {
return 1;
}
}
public Handler mhandle = new Handler() {
#Override
public void handleMessage(Message msg) {
switch (msg.what) {
case MY_MSG:
// mSplModeTV.setText(" " + msg.obj);
if (audioEngineFlag == 1) {
String s1 = msg.obj.toString();
float f = Float.valueOf(s1.trim()).floatValue();
Log.v(TAG, "amplitude=" + f); }
you can use timer to call getMaxAmplitue() after every .5 sec
MyTimer tim = new new MyTimer(30000,500);;
mRecorder.start();
tim.start();
while (this.mIsRunning) {
// creating these variables here so that
// the mode change can be handled
double amp = getAmplitude();
Message msg = mHandle.obtainMessage(MY_MSG, amp);
mHandle.sendMessage(msg);
}
} catch (Exception e) {
e.printStackTrace();
Message msg = mHandle.obtainMessage(ERROR_MSG,
e.getLocalizedMessage() + "");
mHandle.sendMessage(msg);
}
if (mRecorder != null) {
mRecorder.stop();
mRecorder.release();
mRecorder = null;
}
}
public double getAmplitude() {
if (mRecorder != null) {
powerDb = 20 * Math.log10(mRecorder.getMaxAmplitude() / 2700.0);
return (powerDb);
}
else {
return 1;
}
}
public Handler mhandle = new Handler() {
#Override
public void handleMessage(Message msg) {
switch (msg.what) {
case MY_MSG:
// mSplModeTV.setText(" " + msg.obj);
if (audioEngineFlag == 1) {
String s1 = msg.obj.toString();
float f = Float.valueOf(s1.trim()).floatValue();
Log.v(TAG, "amplitude=" + f); }
public class MyTimer extends CountDownTimer {
public MyTimer(long millisInFuture, long countDownInterval) {
super(millisInFuture, countDownInterval);
// TODO Auto-generated constructor stub
}
#Override
public void onFinish() {
// TODO Auto-generated method stub
}
#Override
public void onTick(long millisUntilFinished) {
int amplitude = mRecorder.getMaxAmplitude();
Log.i("AMPLITUDE", new Integer(amplitude).toString());
}
}
You can use this handler in timer to get the result after every .5 sec.