'ArrayList.get(int) on a null object reference - Android
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;
}
}
Solution 1:[1]
Problem:
The song list you're trying to use in PlayerActivity is null.
Reason:
You're sending the Songs' list using Intent Extras but here's the catch.
You're putting the list as an extra with key song in MainActivity. But, you're trying to get the extra with key songs in PlayerActivity.
Solution:
Change your MainActivity code from
.putExtra("song",mySongs)
to
.putExtra("songs",mySongs)
Alternatively, You can change songs to song in PlayerActivity, the endgame is just the keys should match otherwise you're reading null data.
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
| Solution | Source |
|---|---|
| Solution 1 | Lalit Fauzdar |
