2016-04-15 2 views
0

Je développe une application Music Player dans Android Studio.NullPointerException dans l'application Music Player

Ceci est mon SongsManager.java

package com.example.mudit.take6; 

/** 
* Created by Mudit on 16/04/16. 
*/ 
import java.io.File; 
import java.io.FilenameFilter; 
import java.util.ArrayList; 
import java.util.HashMap; 

public class SongsManager { 
    // SDCard Path 
    final String MEDIA_PATH = new String("/sdcard/"); 
    private ArrayList<HashMap<String, String>> songsList = new ArrayList<HashMap<String, String>>(); 

// Constructor 
public SongsManager(){ 

} 

/** 
* Function to read all mp3 files from sdcard 
* and store the details in ArrayList 
* */ 
public ArrayList<HashMap<String, String>> getPlayList() { 
    File home = new File(MEDIA_PATH); 

     if (home.listFiles(new FileExtensionFilter()).length > 0) { 
      for (File file : home.listFiles(new FileExtensionFilter())) { 
       HashMap<String, String> song = new HashMap<String, String>(); 
       song.put("songTitle", file.getName().substring(0, (file.getName().length() - 4))); 
       song.put("songPath", file.getPath()); 

       // Adding each song to SongList 
       songsList.add(song); 
      } 
     } 
     // return songs list array 
     return songsList; 

} 
/** 
* Class to filter files which are having .mp3 extension 
* */ 
class FileExtensionFilter implements FilenameFilter { 
    public boolean accept(File dir, String name) { 
     return (name.endsWith(".mp3") || name.endsWith(".MP3")); 
    } 
} 

}

Ceci est mon AndroidBuildingMusicPlayerActivity.java

package com.example.mudit.take6; 

/** 
* Created by Mudit on 16/04/16. 
*/ 


import android.app.Activity; 
import android.content.Intent; 
import android.media.MediaPlayer; 
import android.media.MediaPlayer.OnCompletionListener; 
import android.os.Bundle; 
import android.os.Handler; 
import android.view.View; 
import android.widget.Button; 
import android.widget.SeekBar; 
import android.widget.TextView; 
import android.widget.Toast; 

import java.io.IOException; 
import java.util.ArrayList; 
import java.util.HashMap; 
import java.util.Random; 

public class AndroidBuildingMusicPlayerActivity extends Activity  implements OnCompletionListener, SeekBar.OnSeekBarChangeListener { 

private Button btnPlay; 
private Button btnForward; 
private Button btnBackward; 
private Button btnNext; 
private Button btnPrevious; 
private Button btnPlaylist; 
private Button btnRepeat; 
private Button btnShuffle; 
private SeekBar songProgressBar; 
private TextView songTitleLabel; 
private TextView songCurrentDurationLabel; 
private TextView songTotalDurationLabel; 
// Media Player 
private MediaPlayer mp; 
// Handler to update UI timer, progress bar etc,. 
private Handler mHandler = new Handler();; 
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 ArrayList<HashMap<String, String>> songsList = new ArrayList<HashMap<String, String>>(); 


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

    // All player buttons 
    btnPlay = (Button) findViewById(R.id.btplay); 
    // btnForward = (ImageButton) findViewById(R.id.bt); 
    //btnBackward = (ImageButton) findViewById(R.id.btnBackward); 
    btnNext = (Button) findViewById(R.id.btnxt); 
    btnPrevious = (Button) findViewById(R.id.btprv); 
    //btnPlaylist = (ImageButton) findViewById(R.id.btnPlaylist); 
    btnRepeat = (Button) findViewById(R.id.btrep); 
    btnShuffle = (Button) findViewById(R.id.btsh); 
    //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 
    if (songProgressBar != null) { 


    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(); 
        // Changing button image to play button 
        // btnPlay.setImageResource(R.drawable.play); 
       } 
      }else{ 
       // Resume song 
       if(mp!=null){ 
        mp.start(); 
        // Changing button image to pause button 
        // btnPlay.setImageResource(R.drawable.pause); 
       } 
      } 

     } 
    }); 

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

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

} 

/** 
* 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.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(); 
    int currentPosition = utils.progressToTimer(seekBar.getProgress(), totalDuration); 

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

    // update timer progress again 
    updateProgressBar(); 
} 

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

} 

et ceci est l'erreur:

04-16 02:53:03.652 23194-23194/? I/art: Late-enabling -Xcheck:jni 
04-16 02:53:03.680 23194-23199/? I/art: Debugger is no longer active 
04-16 02:53:03.714 23194-23194/? W/System: ClassLoader referenced  unknown path: /data/app/com.example.mudit.take6-1/lib/arm 
04-16 02:53:03.795 23194-23194/? D/AndroidRuntime: Shutting down VM 
04-16 02:53:03.796 23194-23194/? E/AndroidRuntime: FATAL EXCEPTION: main 
               Process: com.example.mudit.take6, PID: 23194 
               java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.mudit.take6/com.example.mudit.take6.AndroidBuildingMusicPlayerActivity}: java.lang.NullPointerException: Attempt to get length of null array 
                at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2426) 
                at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2490) 
                at android.app.ActivityThread.-wrap11(ActivityThread.java) 
                at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1354) 
                at android.os.Handler.dispatchMessage(Handler.java:102) 
                at android.os.Looper.loop(Looper.java:148) 
                at android.app.ActivityThread.main(ActivityThread.java:5443) 
                at java.lang.reflect.Method.invoke(Native Method) 
                at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:728) 
                at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618) 
               Caused by: java.lang.NullPointerException: Attempt to get length of null array 
                at com.example.mudit.take6.SongsManager.getPlayList(SongsManager.java:28) 
                at com.example.mudit.take6.AndroidBuildingMusicPlayerActivity.onCreate(AndroidBuildingMusicPlayerActivity.java:85) 
                at android.app.Activity.performCreate(Activity.java:6259) 
                at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1130) 
                at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2379) 
                at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2490)  
                at android.app.ActivityThread.-wrap11(ActivityThread.java)  
                at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1354)  
                at android.os.Handler.dispatchMessage(Handler.java:102)  
                at android.os.Looper.loop(Looper.java:148)  
                at android.app.ActivityThread.main(ActivityThread.java:5443)  
                at java.lang.reflect.Method.invoke(Native Method)  
                at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:728)  
                at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)  

Pouvez-vous Aidez-moi moi avec ceci et dites-moi si je mets en application le bon code. Toute aide sera appréciée.

Répondre

0

Je pense que votre journal d'erreur montre clairement:

Caused by: java.lang.NullPointerException: Attempt to get length of null array at com.example.mudit.take6.SongsManager.getPlayList(SongsManager.java:28)

if (home.listFiles(new FileExtensionFilter()).length > 0) {} 

Ici home.listFiles (nouveau FileExtensionFilter()) est nulle. S'il vous plaît ajouter un point de rupture ici pour déboguer.

+0

que devrais-je ajouter? – Mudit

+0

j'ai ajouté if (home.listFiles (new FileExtensionFilter()). Longueur! = 0) – Mudit

+0

mais son ne fonctionne pas – Mudit