Error:
Error : E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.mpmusic, PID: 10142
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.mpmusic/com.example.mpmusic.PlayerActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.Object java.util.ArrayList.get(int)' on a null object reference
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2913)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3048)
at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:78)
at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:108)
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:68)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1808)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loop(Looper.java:193)
at android.app.ActivityThread.main(ActivityThread.java:6669)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.Object java.util.ArrayList.get(int)' on a null object reference
at com.example.mpmusic.PlayerActivity.onCreate(PlayerActivity.java:90)
at android.app.Activity.performCreate(Activity.java:7136)
at android.app.Activity.performCreate(Activity.java:7127)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1271)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2893)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3048)
at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:78)
at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:108)
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:68)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1808)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loop(Looper.java:193)
at android.app.ActivityThread.main(ActivityThread.java:6669)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
PlayerActivity
:
public class PlayerActivity extends AppCompatActivity {
Button btnPlay , btnNext , btnPrevious , btnForward , btnRewind;
TextView txtSongName , txtSongStart , txtSongEnd;
SeekBar seekMusicBar;
ImageView imageView;
String songName;
public static final String EXTRA_NAME = "song_name";
static MediaPlayer mediaPlayer;
int position;
ArrayList<File> mySongs;
@Override
public boolean onOptionsItemSelected(@NonNull MenuItem item) {
if(item.getItemId() == android.R.id.home)
{
onBackPressed();
}
return super.onOptionsItemSelected(item);
}
Thread updateSeekBar;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_player);
getSupportActionBar().setTitle("Nhac Viet");
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
getSupportActionBar().setDisplayShowHomeEnabled(true);
btnPrevious = findViewById(R.id.btnPrevious);
btnNext = findViewById(R.id.btnNext);
btnPlay = findViewById(R.id.btnPlay);
btnForward = findViewById(R.id.btnForward);
btnRewind = findViewById(R.id.btnPrevious);
txtSongName = findViewById(R.id.txtSong);
txtSongStart = findViewById(R.id.txtSongStart);
txtSongEnd = findViewById(R.id.txtSongEnd);
seekMusicBar = findViewById(R.id.seekBar);
imageView = findViewById(R.id.imgView);
if(mediaPlayer != null)
{
mediaPlayer.start();
mediaPlayer.release();
}
Intent intent = getIntent();
Bundle bundle = intent.getExtras();
mySongs = (ArrayList)bundle.getParcelableArrayList("songs");
String sName = intent .getStringExtra("songname");
position = bundle.getInt("pos",0);
txtSongName.setSelected(true);
Uri uri = Uri.parse(mySongs.get(position).toString());
songName = mySongs.get(position).getName();
txtSongName.setText(songName);
mediaPlayer = MediaPlayer.create(getApplicationContext(),uri);
mediaPlayer.start();
updateSeekBar = new Thread()
{
@Override
public void run() {
int totalDuration = mediaPlayer.getDuration();
int currentPosition = 0;
while(currentPosition<totalDuration)
{
try {
sleep(500);
currentPosition = mediaPlayer.getCurrentPosition();
seekMusicBar.setProgress(currentPosition);
}
catch (InterruptedException e)
{
e.printStackTrace();
}
super.run();
}
}
};
seekMusicBar.setMax(mediaPlayer.getDuration());
updateSeekBar.start();
seekMusicBar.getProgressDrawable().setColorFilter(getResources().getColor(R.color.purple_700),PorterDuff.Mode.MULTIPLY);
seekMusicBar.getThumb().setColorFilter(getResources().getColor(R.color.purple_700), PorterDuff.Mode.SRC_IN);
seekMusicBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
@Override
public void onProgressChanged(SeekBar seekBar, int i, boolean b) {
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
}
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
mediaPlayer.seekTo(seekBar.getProgress());
}
});
String endTime = createTime(mediaPlayer.getDuration());
txtSongEnd.setText(endTime);
final Handler handle = new Handler();
final int delay = 1000;
handle.postDelayed(new Runnable() {
@Override
public void run() {
String currentTime = createTime(mediaPlayer.getCurrentPosition());
txtSongStart.setText(currentTime);
handle.postDelayed(this,delay);
}
},delay);
btnPlay.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (mediaPlayer.isPlaying())
{
btnPlay.setBackgroundResource(R.drawable.ic_play);
mediaPlayer.pause();
}
else
{
btnPlay.setBackgroundResource(R.drawable.ic_pause);
mediaPlayer.start();
TranslateAnimation moveAnim = new TranslateAnimation(-25,-25,-25,-25);
moveAnim.setInterpolator(new AccelerateInterpolator());
moveAnim.setDuration(600);
moveAnim.setFillEnabled(true);
moveAnim.setFillAfter(true);
moveAnim.setRepeatMode(Animation.REVERSE);
moveAnim.setRepeatCount(1);
imageView.startAnimation(moveAnim);
}
}
});
mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mediaPlayer) {
btnNext.performClick();
}
});
btnNext.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mediaPlayer.stop();
mediaPlayer.release();
position = (position+1)%mySongs.size();
Uri uri = Uri.parse(mySongs.get(position).toString());
mediaPlayer = MediaPlayer.create(getApplicationContext(),uri);
songName = mySongs.get(position).getName();
txtSongName.setText(songName);
mediaPlayer.start();
startAnimation(imageView,360f);
}
});
btnPrevious.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
mediaPlayer.stop();
mediaPlayer.release();
position = ((position-1)<0)?(mySongs.size()-1):position-1;
Uri uri = Uri.parse(mySongs.get(position).toString());
mediaPlayer = MediaPlayer.create(getApplicationContext(),uri);
songName = mySongs.get(position).getName();
txtSongName.setText(songName);
mediaPlayer.start();
startAnimation(imageView,-360f);
}
});
btnForward.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if(mediaPlayer.isPlaying()){
mediaPlayer.seekTo(mediaPlayer.getCurrentPosition()+10000);
}
}
});
btnRewind.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if(mediaPlayer.isPlaying()){
mediaPlayer.seekTo(mediaPlayer.getCurrentPosition()-10000);
}
}
});
}
private String createTime(int duration) {
String time = "";
int min = duration/1000/60;
int sec = duration/1000%60;
time = time+min+":";
if(sec<10){
time+="0";
}
return time;
}
public void startAnimation(View view , Float degree){
ObjectAnimator objectAnimator = ObjectAnimator.ofFloat(imageView,"rotation",0f,degree);
objectAnimator.setDuration(1000);
AnimatorSet animatorSet = new AnimatorSet();
animatorSet.playTogether(objectAnimator);
animatorSet.start();
}
MainActivity
:
public class MainActivity extends AppCompatActivity {
ListView listView;
String[] items;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
listView = (ListView) findViewById(R.id.listView);
runtimePermission();
}
public void runtimePermission() {
Dexter.withContext(this).withPermissions(Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.RECORD_AUDIO)
.withListener(new MultiplePermissionsListener() {
@Override
public void onPermissionsChecked(MultiplePermissionsReport multiplePermissionsReport) {
displaySong();
}
@Override
public void onPermissionRationaleShouldBeShown(List<PermissionRequest> list, PermissionToken permissionToken) {
permissionToken.continuePermissionRequest();
}
}).check();
}
public ArrayList<File> findSong(File file){
ArrayList<File> arrayList = new ArrayList<>();
File[] files = file.listFiles();
for(File singleFile : files){
if(singleFile.isDirectory() && !singleFile.isHidden())
{
arrayList.addAll(findSong(singleFile));
}
else
{
if(singleFile.getName().endsWith(".mp3") || singleFile.getName().endsWith(".wav"))
{
arrayList.add(singleFile);
}
}
}
return arrayList;
}
public void displaySong()
{
final ArrayList<File> mySongs = findSong(Environment.getExternalStorageDirectory());
items = new String[mySongs.size()];
for(int i=0;i<mySongs.size();i++)
{
items[i] = mySongs.get(i).getName().toString().replace(".mp3","").replace(".wav","");
}
customAdapter customAdapter = new customAdapter();
listView.setAdapter(customAdapter);
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
String songName = (String)listView.getItemAtPosition(position);
startActivity(new Intent(getApplicationContext(),PlayerActivity.class)
.putExtra("song",mySongs)
.putExtra("songname",songName)
.putExtra("pos",position)
);
}
});
}
class customAdapter extends BaseAdapter{
@Override
public int getCount() {
return items.length;
}
@Override
public Object getItem(int position) {
return null;
}
@Override
public long getItemId(int position) {
return 0;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View view = getLayoutInflater().inflate(R.layout.list_item,null);
TextView txtSong = view.findViewById(R.id.txtSong);
txtSong.setSelected(true);
txtSong.setText(items[position]);
return view;
}
}