2016-06-04 2 views
-1

음악 응용 프로그램을 개발 중이지만이 오류가 계속 발생합니다. 이해가되지 않고 해결 방법을 모릅니다. 나는 2 일 동안 코드를 다시 작성하려고 노력했지만 여전히 에러 팝업을 남기고있다. 내 logcat은 java.lang.IndexOutOfBoundsException처럼 나타난다. 잘못된 인덱스 0, 크기는 0이다. 그리고 주된 문제를 정교하게 적어 라.java.lang.IndexOutOfBoundsException : 잘못된 인덱스 0, 크기가 0입니다. Android 뮤직 플레이어

내가 온라인 검색을 해봤이 MainActivity.java

package com.developer.bunamay.player; 

     import android.app.SearchManager; 
     import android.content.ComponentName; 
     import android.content.Context; 
     import android.content.Intent; 
     import android.content.ServiceConnection; 
     import android.content.res.Resources; 
     import android.graphics.Bitmap; 
     import android.graphics.PorterDuff; 
     import android.graphics.drawable.BitmapDrawable; 
     import android.os.Bundle; 
     import android.os.Handler; 
     import android.os.IBinder; 
     import android.os.Message; 
     import android.support.v4.content.ContextCompat; 
     import android.support.v7.app.AppCompatActivity; 
     import android.text.TextUtils; 
     import android.util.Log; 
     import android.view.Menu; 
     import android.view.MenuItem; 
     import android.view.View; 
     import android.view.animation.Animation; 
     import android.view.animation.AnimationUtils; 
     import android.widget.AdapterView; 
     import android.widget.Button; 
     import android.widget.ImageView; 
     import android.widget.LinearLayout; 
     import android.widget.ListView; 
     import android.widget.SearchView; 
     import android.widget.SeekBar; 
     import android.widget.TextView; 

     import java.util.List; 



public class MainActivity extends AppCompatActivity implements MusicService.MediaFileListener { 

public static final PlayerUtils PlayerController = PlayerUtils.getInstance(); 

public static final int PICK_FOLDER_REQUEST = 8; 
private MediaFileAdapter mediaFileAdapter = null; 
private TextView playingSong; 
private Button btnPause, btnPlay, btnNext, btnPrevious; 
private Button btnStop; 
private LinearLayout linearLayoutPlayingSong; 
private ListView mediaListView; 
private SeekBar seekbar; 
private TextView textBufferDuration, textDuration; 
private ImageView imageViewAlbumArt; 
private Context context; 

MusicService mService; 
boolean mBound = false; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    context = MainActivity.this; 
    init(); 

    if (!PlayerUtils.isServiceRunning(MusicService.class.getName(), getApplicationContext())) { 
     Intent i = new Intent(getApplicationContext(), MusicService.class); 
     startService(i); 
    } 
} 

private void init() { 
    initViews(); 
    setListeners(); 
    playingSong.setSelected(true); 
    seekbar.getProgressDrawable().setColorFilter(ContextCompat.getColor(context, R.color.colorText), PorterDuff.Mode.SRC_IN); 
    if (PlayerController.SONGS_LIST.size() <= 0) { 
     PlayerController.SONGS_LIST = PlayerController.listOfSongs(getApplicationContext()); 
    } 
    initAdapter(); 
} 

private void initAdapter() { 
    mediaFileAdapter = new MediaFileAdapter(this, R.layout.custom_list, PlayerController.SONGS_LIST); 
    mediaListView.setAdapter(mediaFileAdapter); 
    mediaListView.setTextFilterEnabled(true); 
    mediaListView.setFastScrollEnabled(true); 
} 

private void initViews() { 
    playingSong = (TextView) findViewById(R.id.textNowPlaying); 
    mediaListView = (ListView) findViewById(R.id.listViewMusic); 
    btnPause = (Button) findViewById(R.id.btnPause); 
    btnPlay = (Button) findViewById(R.id.btnPlay); 
    linearLayoutPlayingSong = (LinearLayout) findViewById(R.id.linearLayoutPlayingSong); 
    seekbar = (SeekBar) findViewById(R.id.seekBar); 
    btnStop = (Button) findViewById(R.id.btnStop); 
    textBufferDuration = (TextView) findViewById(R.id.textBufferDuration); 
    textDuration = (TextView) findViewById(R.id.textDuration); 
    imageViewAlbumArt = (ImageView) findViewById(R.id.imageViewAlbumArt); 
    btnNext = (Button) findViewById(R.id.btnNext); 
    btnPrevious = (Button) findViewById(R.id.btnPrevious); 
} 

private Animation setButtonAnimation() { 
    return AnimationUtils.loadAnimation(this, R.anim.button_anim); 
} 

// defines callbacks for service binding, passed to bindService() 
private ServiceConnection mConnection = new ServiceConnection() { 

    @Override 
    public void onServiceConnected(ComponentName className, 
            IBinder service) { 
     MusicService.LocalBinder binder = (MusicService.LocalBinder) service; 
     mService = binder.getService(); 
     mService.setListener(MainActivity.this); 
     mBound = true; 

    } 

    @Override 
    public void onServiceDisconnected(ComponentName arg0) { 
     mBound = false; 
     mService = null; 

    } 
}; 


private void setListeners() { 
    mediaListView.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
     @Override 
     public void onItemClick(AdapterView<?> parent, View item, int position, long id) { 
      PlayerController.SONG_PAUSED = false; 
      PlayerController.SONG_NUMBER = position; 
      boolean isServiceRunning = PlayerUtils.isServiceRunning(MusicService.class.getName(), getApplicationContext()); 
      if (!isServiceRunning) { 
       Intent i = new Intent(getApplicationContext(), MusicService.class); 
       startService(i); 
      } else { 
       PlayerController.SONG_CHANGE_HANDLER.sendMessage(
         PlayerController.SONG_CHANGE_HANDLER.obtainMessage()); 
      } 
      updateUI(); 
      changeButton(); 
     } 
    }); 

    btnPlay.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      PlayerController.playControl(getApplicationContext()); 
     } 
    }); 
    btnPause.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      PlayerController.pauseControl(getApplicationContext()); 
     } 
    }); 
    btnNext.setOnClickListener(new View.OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      v.startAnimation(setButtonAnimation()); 
      PlayerController.nextControl(getApplicationContext()); 
     } 
    }); 
    btnPrevious.setOnClickListener(new View.OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      v.startAnimation(setButtonAnimation()); 
      PlayerController.previousControl(getApplicationContext()); 
     } 
    }); 
    btnStop.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      if (PlayerUtils.isServiceRunning(MusicService.class.getName(), getApplicationContext())) { 
       PlayerController.pauseControl(getApplicationContext()); 
      } 
      linearLayoutPlayingSong.setVisibility(View.GONE); 
     } 
    }); 

    seekbar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { 
     @Override 
     public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { 
      if (fromUser) { 
       // clicked position on the seekBar 
       int currentSeekBarPosition = seekBar.getProgress(); 
       // 1% of song duration = song duration/100% 
       int onePercentOfSongDuration = (mService.getDuration()/100); 
       // associate song duration with clicked position on the seekBar 
       int changedPosition = currentSeekBarPosition * onePercentOfSongDuration; 

       // seek to selected position 
       PlayerController.seekToAnyControl(getApplicationContext(), changedPosition); 
      } 
     } 

     @Override 
     public void onStartTrackingTouch(SeekBar seekBar) { 
     } 

     @Override 
     public void onStopTrackingTouch(SeekBar seekBar) { 

     } 
    }); 
} 

@Override 
protected void onPause() { 
    if (mBound) { 
     unbindService(mConnection); 
    } 
    super.onPause(); 
} 

@Override 
protected void onResume() { 
    super.onResume(); 
    Intent i = new Intent(getApplicationContext(), MusicService.class); 
    bindService(i, mConnection, Context.BIND_AUTO_CREATE); 

    handleAudioFromOpenWithPopup(); 

    boolean isServiceRunning = PlayerUtils.isServiceRunning(MusicService.class.getName(), getApplicationContext()); 
    if (isServiceRunning) { 
     updateUI(); 
    } else { 
     linearLayoutPlayingSong.setVisibility(View.GONE); 
    } 
    changeButton(); 
    PlayerController.SEEKBAR_HANDLER = new Handler() { 
     @Override 
     public void handleMessage(Message msg) { 

      Integer i[] = (Integer[]) msg.obj; 
      textBufferDuration.setText(PlayerUtils.getDuration(i[0])); 
      textDuration.setText(PlayerUtils.getDuration(i[1])); 
      seekbar.setProgress(i[2]); 
     } 
    }; 
} 

public void updateUI() { 
    MediaFile mediaFile = PlayerController.SONGS_LIST.get(PlayerController.SONG_NUMBER); 
    String nowPlayingTitleText = mediaFile.getTitle() + " " + mediaFile.getArtist() + "-" + mediaFile.getAlbum(); 
    playingSong.setText(nowPlayingTitleText); 
    Bitmap albumArt = PlayerController.getAlbumart(context, mediaFile.getAlbumId()); 
    if (albumArt != null) { 
     imageViewAlbumArt.setBackgroundDrawable(new BitmapDrawable(Resources.getSystem(), albumArt)); 
    } else { 
     Bitmap defaultAlbumArt = PlayerController.getDefaultAlbumArt(context); 
     imageViewAlbumArt.setBackgroundDrawable(new BitmapDrawable(Resources.getSystem(), defaultAlbumArt)); 
    } 
    linearLayoutPlayingSong.setVisibility(View.VISIBLE); 
} 

public void changeButton() { 
    if (PlayerController.SONG_PAUSED) { 
     btnPause.setVisibility(View.GONE); 
     btnPlay.setVisibility(View.VISIBLE); 
    } else { 
     btnPause.setVisibility(View.VISIBLE); 
     btnPlay.setVisibility(View.GONE); 
    } 
} 

public void changeUI() { 
    updateUI(); 
    changeButton(); 
} 

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    getMenuInflater().inflate(R.menu.menu_main, menu); 
    SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE); 

    // init menu items for search 
    MenuItem itemSearchTitle = menu.findItem(R.id.action_search_title); 
    MenuItem itemSearchAlbum = menu.findItem(R.id.action_search_album); 
    MenuItem itemSearchArtist = menu.findItem(R.id.action_search_artist); 

    SearchView searchViewTitle = (SearchView) itemSearchTitle.getActionView(); 
    SearchView searchViewAlbum = (SearchView) itemSearchAlbum.getActionView(); 
    SearchView searchViewArtist = (SearchView) itemSearchArtist.getActionView(); 

    searchViewTitle.setFocusable(true); 
    searchViewAlbum.setFocusable(true); 
    searchViewArtist.setFocusable(true); 

    // init searchable info for each menu item 
    searchViewTitle.setSearchableInfo(searchManager.getSearchableInfo(getComponentName())); 
    searchViewTitle.setQueryHint("title..."); 
    searchViewTitle.setIconified(true); 

    searchViewAlbum.setSearchableInfo(searchManager.getSearchableInfo(getComponentName())); 
    searchViewAlbum.setQueryHint("album..."); 
    searchViewAlbum.setIconified(true); 

    searchViewArtist.setSearchableInfo(searchManager.getSearchableInfo(getComponentName())); 
    searchViewArtist.setQueryHint("artist..."); 
    searchViewArtist.setIconified(true); 

    // set textChangeListeners for each type of search 
    final SearchView.OnQueryTextListener textChangeListenerTitle = new SearchView.OnQueryTextListener() { 
     @Override 
     public boolean onQueryTextChange(String newText) { 
      if (!TextUtils.isEmpty(newText)) { 
       mediaFileAdapter.getFilter().filter(newText); 
      } 
      return true; 
     } 

     @Override 
     public boolean onQueryTextSubmit(String query) { 
      return true; 
     } 
    }; 

    SearchView.OnQueryTextListener textChangeListenerAlbum = new SearchView.OnQueryTextListener() { 
     @Override 
     public boolean onQueryTextChange(String newText) { 
      if (!TextUtils.isEmpty(newText)) { 
       mediaFileAdapter.getFilter().filter(newText); 
      } 
      return true; 
     } 

     @Override 
     public boolean onQueryTextSubmit(String query) { 
      return true; 
     } 
    }; 

    SearchView.OnQueryTextListener textChangeListenerArtist = new SearchView.OnQueryTextListener() { 
     @Override 
     public boolean onQueryTextChange(String newText) { 
      if (!TextUtils.isEmpty(newText)) { 
       mediaFileAdapter.getFilter().filter(newText); 
      } 
      return true; 
     } 

     @Override 
     public boolean onQueryTextSubmit(String query) { 
      return true; 
     } 
    }; 

    // apply listeners to searchViews 
    searchViewTitle.setOnQueryTextListener(textChangeListenerTitle); 
    searchViewAlbum.setOnQueryTextListener(textChangeListenerAlbum); 
    searchViewArtist.setOnQueryTextListener(textChangeListenerArtist); 

    return super.onCreateOptionsMenu(menu); 

} 

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 

    int id = item.getItemId(); 
    // get music from specific folder 
    if (id == R.id.folder_music) { 
     Intent intent = new Intent(this, FolderPickerActivity.class); 
     startActivityForResult(intent, PICK_FOLDER_REQUEST); 
     return true; 
    } 
    // fetch all music from device 
    if (id == R.id.all_music) { 
     PlayerController.SONGS_LIST = PlayerController.listOfSongs(getApplicationContext()); 
     initAdapter(); 

     return true; 
    } 

    // search songs by title 
    if (id == R.id.action_search_title) { 
     PlayerController.SEARCH_TYPE = "TITLE"; 

     return true; 
    } 
    // search songs by artist 
    if (id == R.id.action_search_artist) { 
     PlayerController.SEARCH_TYPE = "ARTIST"; 

     return true; 
    } 
    // search songs by album 
    if (id == R.id.action_search_album) { 
     PlayerController.SEARCH_TYPE = "ALBUM"; 

     return true; 
    } 

    if (id == R.id.action_sort_title) { 
     MediaFileComparator.sortByTitle(PlayerController.SONGS_LIST); 
     MediaFileAdapter mediaAdapter = (MediaFileAdapter) mediaListView.getAdapter(); 
     mediaAdapter.notifyDataSetChanged(); 

     return true; 
    } 
    if (id == R.id.action_sort_album) { 
     MediaFileComparator.sortByAlbum(PlayerController.SONGS_LIST); 
     MediaFileAdapter mediaAdapter = (MediaFileAdapter) mediaListView.getAdapter(); 
     mediaAdapter.notifyDataSetChanged(); 

     return true; 
    } 
    if (id == R.id.action_sort_artist) { 
     MediaFileComparator.sortByArtist(PlayerController.SONGS_LIST); 
     MediaFileAdapter mediaAdapter = (MediaFileAdapter) mediaListView.getAdapter(); 
     mediaAdapter.notifyDataSetChanged(); 

     return true; 
    } 
    if (id == R.id.action_sort_duration) { 
     MediaFileComparator.sortByDuration(PlayerController.SONGS_LIST); 
     MediaFileAdapter mediaAdapter = (MediaFileAdapter) mediaListView.getAdapter(); 
     mediaAdapter.notifyDataSetChanged(); 

     return true; 
    } 
    return super.onOptionsItemSelected(item); 
} 

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    super.onActivityResult(requestCode, resultCode, data); 
    if (resultCode == RESULT_OK) { 

     if (requestCode == PICK_FOLDER_REQUEST) { 

      String pickedFolder = data.getStringExtra("pickedFolder"); 
      Log.i("PICKER_FOLDER_TAG", pickedFolder); 

      // get last subfolder from path as WHERE arg 
      pickedFolder = getSelectionArg(pickedFolder); 
      Log.i("PICKER_FOLDER_WHERE_TAG", pickedFolder); 

      // reinit music list and adapter with data from specific folder 
      List<MediaFile> songsFromSpecificFolder = PlayerController.getSongsFromSpecificFolder(
        getApplicationContext(), new String[]{pickedFolder} 
      ); 
      if (songsFromSpecificFolder.size() != 0) { 
       PlayerController.SONGS_LIST = songsFromSpecificFolder; 
       PlayerController.SONG_NUMBER = 0; 
       initAdapter(); 
      } 
     } 
    } 
} 

// receive audio action from 'Complete action with' pop-up 
private void handleAudioFromOpenWithPopup() { 
    // receive Intent 
    Intent intent = getIntent(); 
    // check action 
    String action = intent.getAction(); 
    // if it's audio action view 
    if (action != null && action.equals("android.intent.action.VIEW")) { 
     // play song 
     PlayerController.playMusicFromActionPicker(this, intent.getData()); 
    } 
} 

// get last subfolder from path as WHERE arg 
private String getSelectionArg(String path) { 
    String sTag = "%"; 
    // substring last directory in path 
    String lastSubfolder = path.substring(path.lastIndexOf("/") + 1); 
    return sTag + lastSubfolder + sTag; 
} 

@Override 
public void onMediaFileChanged() { 
    changeUI(); 
} 

@Override 
public void onPlayPauseActionChanged() { 
    changeButton(); 
} 

}

는 시간을 varios하지만 난 아직도 이해 해달라고.

Object[] array = new Object[0]; 
... 
System.out.println(array[0]); 

뭔가 어떤 종류의 (배열을 만든 : 감사

+0

오류의 원인은 무엇입니까? – TychoTheTaco

+0

updateUI에서 PlayerController.SONGS_LIST.size()> 0을 확인해야합니다. – phongvan

+0

스택 추적은 어디에 있습니까? –

답변

0

문제의 근본 원인은 코드 또는 코드는 다음에 해당 뭔가를하고 사용하는 몇 가지 코드 중 하나가, 그 어딘가에) 크기가 0이고, 그 배열 (또는 뭔가 다른 것)은 해당 배열의 첫 번째 요소 (인덱스 0)에 액세스하려고합니다. 그것은 배열의 끝을 넘어서는 것이며 ... 예외가 발생합니다.


코드에서 길이가 0 인 배열을 어디에 만들 수 있는지 알 수 없습니다.

0

protected void onResume()을 살펴볼 수 있습니까?

나는 당신이 다음 줄에 문제가있을 수 있습니다 생각 :

Integer i[] = (Integer[]) msg.obj; 
textBufferDuration.setText(PlayerUtils.getDuration(i[0])); 
textDuration.setText(PlayerUtils.getDuration(i[1])); 
seekbar.setProgress(i[2]); 

먼저 그 라인을 주석하여 프로그램을 실행하십시오. 경우에 따라 msg.obj이 실제로 길이가 0 인 배열 일 수 있습니다. 그런 다음 java.lang.IndexOutOfBoundsException: Invalid index 0, size is 0이 표시됩니다. 희망이 당신을 돕는다.

관련 문제