-5

I am trying to develop an app which it download my content from the my server and play locally, so soon as i click on to the icon the initial screen appears(that is initial activity is executing fine where as once it goes to the second activity it is showing error as

Unfortunately app has stopped

This is my log cat

01-13 00:25:41.070: E/AndroidRuntime(955): FATAL EXCEPTION: main
01-13 00:25:41.070: E/AndroidRuntime(955): Process: com.tmp.timbremediaplayer, PID: 955
01-13 00:25:41.070: E/AndroidRuntime(955): java.lang.RuntimeException: Unable to resume activity {com.tmp.timbremediaplayer/com.tmp.timbremediaplayer.MusicPlayerActivity}: android.util.SuperNotCalledException: Activity {com.tmp.timbremediaplayer/com.tmp.timbremediaplayer.MusicPlayerActivity} did not call through to super.onResume()
01-13 00:25:41.070: E/AndroidRuntime(955):  at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2788)
01-13 00:25:41.070: E/AndroidRuntime(955):  at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:2817)
01-13 00:25:41.070: E/AndroidRuntime(955):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2250)
01-13 00:25:41.070: E/AndroidRuntime(955):  at android.app.ActivityThread.access$800(ActivityThread.java:135)
01-13 00:25:41.070: E/AndroidRuntime(955):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1196)
01-13 00:25:41.070: E/AndroidRuntime(955):  at android.os.Handler.dispatchMessage(Handler.java:102)
01-13 00:25:41.070: E/AndroidRuntime(955):  at android.os.Looper.loop(Looper.java:136)
01-13 00:25:41.070: E/AndroidRuntime(955):  at android.app.ActivityThread.main(ActivityThread.java:5017)
01-13 00:25:41.070: E/AndroidRuntime(955):  at java.lang.reflect.Method.invokeNative(Native Method)
01-13 00:25:41.070: E/AndroidRuntime(955):  at java.lang.reflect.Method.invoke(Method.java:515)
01-13 00:25:41.070: E/AndroidRuntime(955):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
01-13 00:25:41.070: E/AndroidRuntime(955):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
01-13 00:25:41.070: E/AndroidRuntime(955):  at dalvik.system.NativeStart.main(Native Method)
01-13 00:25:41.070: E/AndroidRuntime(955): Caused by: android.util.SuperNotCalledException: Activity {com.tmp.timbremediaplayer/com.tmp.timbremediaplayer.MusicPlayerActivity} did not call through to super.onResume()
01-13 00:25:41.070: E/AndroidRuntime(955):  at android.app.Activity.performResume(Activity.java:5312)
01-13 00:25:41.070: E/AndroidRuntime(955):  at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2778)
01-13 00:25:41.070: E/AndroidRuntime(955):  ... 12 more

This is the initial activity

public class SyncActivity extends Activity {
    private Button btnProgressBar;
    private ProgressDialog prgDialog;
    // Progress Dialog type (0 - for Horizontal progress bar)
    public static final int progress_bar_type = 0;
    // Music resource URL
    private static String file_url = "https://docs.google.com/uc?export=download&id=0B_TtB7EjzcYCUXVuRTFmRzNkczg";

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        // Show Download Music Button
        btnProgressBar = (Button) findViewById(R.id.btnProgressBar);
        // Download Music Button click listener
        btnProgressBar.setOnClickListener(new View.OnClickListener() {
            // When Download Music Button is clicked
            public void onClick(View v)
            {
                // Disable the button to avoid playing of song multiple times
                btnProgressBar.setEnabled(false);
                // Downloaded Music File path in SD Card
                File sdcard = Environment.getExternalStorageDirectory();
                File dir = new File(sdcard.getAbsolutePath()+"/timbre media");
                dir.mkdirs();
                File file = new File(Environment.getExternalStorageDirectory().getPath()+"/timbre media/song.mp3");
                // Check if the Music file already exists
                if (file.exists()) 
                {
                    Toast.makeText(getApplicationContext(), "File already exist under SD card, playing Music", Toast.LENGTH_SHORT).show();
                    /* Play Music
                     * Include the player activity
                     * and playing starts from here if the music file
                     * already exist
                     */
                    Intent i = new Intent(getApplicationContext(), MusicPlayerActivity.class);
                    startActivityForResult(i, 100);
                // If the Music File doesn't exist in SD card (Not yet downloaded)
                } 
                else 
                {
                    Toast.makeText(getApplicationContext(), "File doesn't exist under SD Card, downloading Mp3", Toast.LENGTH_SHORT).show();
                    // Trigger Async Task (onPreExecute method)
                    new DownloadMusic().execute(file_url);
                }
            }
        });
    }

    // Show Dialog Box with Progress bar
    @Override
    protected Dialog onCreateDialog(int id) {
        switch (id) {
        case progress_bar_type:
            prgDialog = new ProgressDialog(this);
            prgDialog.setMessage("Downloading Mp3 file. Please wait...");
            prgDialog.setIndeterminate(false);
            prgDialog.setMax(100);
            prgDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
            prgDialog.setCancelable(false);
            prgDialog.show();
            return prgDialog;
        default:
            return null;
        }
    }

    // Async Task Class
    class DownloadMusic extends AsyncTask<String, String, String> 
    {

        // Show Progress bar before downloading Music


        @SuppressWarnings("deprecation")
        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            // Shows Progress Bar Dialog and then call doInBackground method
            showDialog(progress_bar_type);
        }

        // Download Music File from Internet
        @Override
        protected String doInBackground(String... f_url) {
            int count;
            try {
                URL url = new URL(f_url[0]);
                URLConnection conection = url.openConnection();
                conection.connect();
                // Get Music file length
                int lenghtOfFile = conection.getContentLength();
                // input stream to read file - with 8k buffer
                InputStream input = new BufferedInputStream(url.openStream(),10*1024);
                // Output stream to write file in SD card
                OutputStream output = new FileOutputStream(Environment.getExternalStorageDirectory().getPath()+"/timbre media/song.mp3");
                byte data[] = new byte[1024];
                long total = 0;
                while ((count = input.read(data)) != -1) {
                    total += count;
                    // Publish the progress which triggers onProgressUpdate method
                    publishProgress("" + (int) ((total * 100) / lenghtOfFile));

                    // Write data to file
                    output.write(data, 0, count);
                }
                // Flush output
                output.flush();
                // Close streams
                output.close();
                input.close();
            } catch (Exception e) {
                Log.e("Error: ", e.getMessage());
            }
            return null;
        }

        // While Downloading Music File
        protected void onProgressUpdate(String... progress) {
            // Set progress percentage
            prgDialog.setProgress(Integer.parseInt(progress[0]));
        }

        // Once Music File is downloaded

        @SuppressWarnings("deprecation")
        @Override
        protected void onPostExecute(String file_url) {
            // Dismiss the dialog after the Music file was downloaded
            dismissDialog(progress_bar_type);
            Toast.makeText(getApplicationContext(), "Download complete, playing Music", Toast.LENGTH_LONG).show();
            /*
             *  Play the music
             */

                Intent i = new Intent(getApplicationContext(), MusicPlayerActivity.class);
                startActivityForResult(i, 100);         

        }
    }

}

This is the second activity

public class MusicPlayerActivity extends Activity implements OnCompletionListener, SeekBar.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 ImageButton btnClose;
private SeekBar songProgressBar;
private TextView songTitleLabel;
private TextView songCurrentDurationLabel;
private TextView songTotalDurationLabel;
// Media Player
public MediaPlayer mp;
// Handler to update UI timer, progress bar etc,.
private Handler mHandler = new Handler();;
private SongsManager songManager;
private Utilities utils;
public int length=0;
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 ArrayList<HashMap<String, String>> songsList = new ArrayList<HashMap<String, String>>();
String TAG = "phoneCallListener";


@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.player);

    // 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);
    btnClose = (ImageButton) findViewById(R.id.btnClose);
    songProgressBar = (SeekBar) findViewById(R.id.songProgressBar);
    songTitleLabel = (TextView) findViewById(R.id.songTitle);
    songCurrentDurationLabel = (TextView) findViewById(R.id.songCurrentDurationLabel);
    songTotalDurationLabel = (TextView) findViewById(R.id.songTotalDurationLabel);

    // Mediaplayer
    mp = new MediaPlayer();
    songManager = new SongsManager();
    utils = new Utilities();

    // Listeners
    songProgressBar.setOnSeekBarChangeListener(this); // Important
    mp.setOnCompletionListener(this); // Important

    // Getting all songs list
    songsList = songManager.getPlayList();

    // By default play first song
    playSong(0);

    /**
     * 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(mp.isPlaying()){
                if(mp!=null){
                    mp.pause();
                    length = mp.getCurrentPosition();

                    // Changing button image to play button

                    btnPlay.setImageResource(R.drawable.btn_play);
                        }

            }else if(mp!=null)
            {
                // Resume song
                mp.start();
                // Changing button image to pause button
                btnPlay.setImageResource(R.drawable.btn_pause);

            }
            else 
            {
            onResume();             
            }
        }
    });
            /**
     * Forward button click event
     * Forwards song specified seconds
     * */
    btnForward.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View arg0) {
            // get current song position                
            int currentPosition = mp.getCurrentPosition();
            // check if seekForward time is lesser than song duration
            if(currentPosition + seekForwardTime <= mp.getDuration()){
                // forward song
                mp.seekTo(currentPosition + seekForwardTime);
            }else{
                // forward to end position
                mp.seekTo(mp.getDuration());
            }
        }
    });

    /*
     * Close image button
     */
    btnClose.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            openAlert(v);   
        }
    });
    /*private void openAlert(View view) {

    }
    */


    /**
     * Backward button click event
     * Backward song to specified seconds
     * */
    btnBackward.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View arg0) {
            // get current song position                
            int currentPosition = mp.getCurrentPosition();
            // check if seekBackward time is greater than 0 sec
            if(currentPosition - seekBackwardTime >= 0){
                // forward song
                mp.seekTo(currentPosition - seekBackwardTime);
            }else{
                // backward to starting position
                mp.seekTo(0);
            }

        }
    });

    /**
     * Next button click event
     * Plays next song by taking currentSongIndex + 1
     * */
    btnNext.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View arg0) {
            // 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(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);
            }   
        }
    });

    /**
     * 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);         
        }
    });

}


public void onCallStateChanged(int state, String incoming_Number)
    {

    Intent i = new Intent(getApplicationContext(),Call_Exception.class);
    startActivityForResult(i, 100);

    }


protected void onResume(){
if(mp.isPlaying()== false)
{
    if(mp!=null)
    {
        mp.seekTo(length);
        super.onResume();
        mp.start();
        btnPlay.setImageResource(R.drawable.btn_pause);

    }

}
}

protected void openAlert(View v) {
    // TODO Auto-generated method stub
    AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(MusicPlayerActivity.this);

     alertDialogBuilder.setTitle(this.getTitle()+ " decision");
     alertDialogBuilder.setMessage("Are you sure?");
             // set negative button: No message
     alertDialogBuilder.setNegativeButton("No",new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog,int id) {
                // cancel the alert box and put a Toast to the user
                dialog.cancel();
                Toast.makeText(getApplicationContext(), "You choose a negative answer", 
                        Toast.LENGTH_SHORT).show();
            }
        });
     // set neutral button: Exit the app message
     alertDialogBuilder.setNeutralButton("Exit the app",new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog,int id) {
                // exit the app and go to the HOME
                MusicPlayerActivity.this.finish();
            }
        });

     AlertDialog alertDialog = alertDialogBuilder.create();
     // show alert
    alertDialog.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);
    }

}




/**
 * Function to play a song
 * @param songIndex - index of song
 * */
public void  playSong(int songIndex){
    // Play song
    try {
        mp.reset();
        mp.setDataSource(songsList.get(songIndex).get("songPath"));
        mp.prepare();
        mp.start();

        // 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);

        // Updating progress bar
        updateProgressBar();            
    } catch (IllegalArgumentException e) {
        e.printStackTrace();
    } catch (IllegalStateException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

/**
 * Update timer on seekbar
 * */
public void updateProgressBar() {
    mHandler.postDelayed(mUpdateTimeTask, 100);        
}   

/**
 * Background Runnable thread
 * */
private Runnable mUpdateTimeTask = new Runnable() {
       public void run() {
           long totalDuration = mp.getDuration();
           long currentDuration = mp.getCurrentPosition();

           // Displaying Total Duration time
           songTotalDurationLabel.setText(""+utils.milliSecondsToTimer(totalDuration));
           // Displaying time completed playing
           songCurrentDurationLabel.setText(""+utils.milliSecondsToTimer(currentDuration));

           // Updating progress bar
           int progress = (int)(utils.getProgressPercentage(currentDuration, totalDuration));
           //Log.d("Progress", ""+progress);
           songProgressBar.setProgress(progress);

           // Running this thread after 100 milliseconds
           mHandler.postDelayed(this, 100);
       }
    };

/**
 * 
 * */
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromTouch) {

}

/**
 * When user starts moving the progress handler
 * */
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
    // remove message Handler from updating progress bar
    //mHandler.removeCallbacks(mUpdateTimeTask);


}

/**
 * When user stops moving the progress hanlder
 * */
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
    //mHandler.removeCallbacks(mUpdateTimeTask);
    //int totalDuration = mp.getDuration();
    // currentPosition = utils.progressToTimer(seekBar.getProgress(), totalDuration);

    // forward or backward to certain seconds
    //mp.seekTo(currentPosition);

    // update timer progress again
    //updateProgressBar();
    Toast.makeText(getApplicationContext(), "This facility is disabled",Toast.LENGTH_SHORT).show();

}

/**
 * On Song Playing completed
 * if repeat is ON play same song again
 * if shuffle is ON play random song
 * */
@Override
public void onCompletion(MediaPlayer arg0) {

    // 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;
        }
    }
}

@Override
 public void onDestroy(){
 super.onDestroy();
    mp.release();
 }

}
Cœur
  • 37,241
  • 25
  • 195
  • 267
sreesanth
  • 23
  • 1
  • 5

3 Answers3

0

From the log cat what I have observerd is you have overridden onResume() method of the activty, but did not call the super method. Try implementing onResume() as follows.

@Override
protected void onResume() {
    super.onResume();
    //Your code here
}

Note that super.onResume() must be the first call inside onResume() function.

Hope this helps.

Vilas
  • 1,695
  • 1
  • 13
  • 13
0

01-13 00:25:41.070: E/AndroidRuntime(955): Process: com.tmp.timbremediaplayer, PID: 955 01-13 00:25:41.070: E/AndroidRuntime(955): java.lang.RuntimeException: Unable to resume activity {com.tmp.timbremediaplayer/com.tmp.timbremediaplayer.MusicPlayerActivity}: android.util.SuperNotCalledException: Activity {com.tmp.timbremediaplayer/com.tmp.timbremediaplayer.MusicPlayerActivity} did not call through to super.onResume()

You forget to call super.onResume()

Arnav M.
  • 2,590
  • 1
  • 27
  • 44
0

From the log what it says is you "did not call through to super.onResume()" So in your Activity class if you are overriding 'onResume' it should be like below

protected void onResume()
{
    super.onResume();//This is important

    //Your code goes here
}

If you have done this already please post your Activity code

Sreekanth
  • 2,887
  • 2
  • 16
  • 30