I'm Trying StandOutWindow Library In which I tried to Create MusicPlayer from this This Tutorial My ListView is Showing songs but When i Click on songs the App Crashes. What am i Missing ? Thanks.
MainActivity
public void createAndAttachView(int id, FrameLayout frame) {
LayoutInflater inflater = (LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE);
View view = inflater.inflate(R.layout.musicplayer, frame, true);
songView = (ListView) view.findViewById(R.id.lvMusicPlayer_songList);
songList = new ArrayList<Song>();
getSonglist();
Collections.sort(songList, new Comparator<Song>() {
public int compare(Song a, Song b) {
return a.getTitle().compareTo(b.getTitle());
}
});
SongAdapter songAdapter = new SongAdapter(this, songList);
songView.setAdapter(songAdapter);
songView.setOnItemClickListener(new OnItemClickListener() {
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
musicService.playSong();
}
});
}
private void getSonglist() {
ContentResolver musicResolver = getContentResolver();
Uri musicUri = android.provider.MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
Cursor musicCursor = musicResolver.query(musicUri, null, null, null,
null);
if (musicCursor != null && musicCursor.moveToFirst()) {
int titleColumn = musicCursor
.getColumnIndex(android.provider.MediaStore.Audio.Media.TITLE);
int idColumn = musicCursor
.getColumnIndex(android.provider.MediaStore.Audio.Media._ID);
int artistColumn = musicCursor
.getColumnIndex(android.provider.MediaStore.Audio.Media.ARTIST);
do {
long thisId = musicCursor.getLong(idColumn);
String thisTitle = musicCursor.getString(titleColumn);
String thisArtist = musicCursor.getString(artistColumn);
songList.add(new Song(thisId, thisTitle, thisArtist));
} while (musicCursor.moveToNext());
}
}
MusicService
public void onCreate() {
super.onCreate();
songPosition = 0;
random = new Random();
mp = new MediaPlayer();
initMusicPlayer();
}
private void initMusicPlayer() {
mp.setWakeMode(getApplicationContext(), PowerManager.PARTIAL_WAKE_LOCK);
mp.setAudioStreamType(AudioManager.STREAM_MUSIC);
mp.setOnPreparedListener(this);
mp.setOnCompletionListener(this);
mp.setOnErrorListener(this);
}
public void setList(ArrayList<Song> theSong) {
songs = theSong;
}
public class MusicBinder extends Binder {
MusicService getService() {
return MusicService.this;
}
}
@Override
public IBinder onBind(Intent intent) {
return musicBind;
}
@Override
public boolean onUnbind(Intent intent) {
mp.stop();
mp.release();
return false;
}
public void playSong() {
mp.reset();
Song playSong = songs.get(songPosition);
songTitle = playSong.getTitle();
long currSong = playSong.getID();
Uri trackUri = ContentUris.withAppendedId(
android.provider.MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,
currSong);
try {
mp.setDataSource(getApplicationContext(), trackUri);
} catch (Exception e) {
Log.e("MUSIC SERVICR", "Error setting data source", e);
}
mp.prepareAsync();
}
public void setSong(int songIndex) {
songPosition = songIndex;
}
@Override
public void onCompletion(MediaPlayer mp) {
if (mp.getCurrentPosition() > 0) {
mp.reset();
playNext();
}
}
@Override
public boolean onError(MediaPlayer mp, int what, int extra) {
Log.v("MUSIC PLAYER", " Playback Error");
mp.reset();
return false;
}
@Override
public void onPrepared(MediaPlayer mp) {
mp.start();
}
public int getPosition() {
return mp.getCurrentPosition();
}
public int getDur() {
return mp.getDuration();
}
public boolean isPng() {
return mp.isPlaying();
}
public void pausePlayer() {
mp.pause();
}
public void seek(int position) {
mp.seekTo(position);
}
public void go() {
mp.start();
}
public void playPrev() {
songPosition--;
if (songPosition < 0)
songPosition = songs.size() - 1;
playSong();
}
public void playNext() {
if (shuffle) {
int newSong = songPosition;
while (newSong == songPosition) {
newSong = random.nextInt(songs.size());
}
songPosition = newSong;
} else {
songPosition++;
if (songPosition >= songs.size())
songPosition = 0;
}
playSong();
}
public void onDestroy() {
stopForeground(true);
;
}
public void setShuffle() {
if (shuffle)
shuffle = false;
else
shuffle = true;
}
LOGCAT
04-19 23:37:04.917:E/AndroidRuntime(8932):at android.widget.AdapterView.performItemClick(AdapterView.java:301) 04-19 23:37:04.917:E/AndroidRuntime(8932):at android.widget.AbsListView.performItemClick(AbsListView.java:1510) 04-19 23:37:04.917:E/AndroidRuntime(8932):at android.widget.AbsListView$PerformClick.run(AbsListView.java:3339) 04-19 23:37:04.917:E/AndroidRuntime(8932):at android.widget.AbsListView.onTouchEvent(AbsListView.java:4635) 04-19 23:37:04.917:E/AndroidRuntime(8932):at android.view.View.dispatchTouchEvent(View.java:7817) 04-19 23:37:04.917:E/AndroidRuntime(8932):at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2435) 04-19 23:37:04.917:E/AndroidRuntime(8932):at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2159) 04-19 23:37:04.917:E/AndroidRuntime(8932):at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2441) 04-19 23:37:04.917:E/AndroidRuntime(8932):at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2174) 04-19 23:37:04.917:E/AndroidRuntime(8932):at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2441) 04-19 23:37:04.917:E/AndroidRuntime(8932):at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2174) 04-19 23:37:04.917:E/AndroidRuntime(8932):at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2441) 04-19 23:37:04.917:E/AndroidRuntime(8932):at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2174) 04-19 23:37:04.917:E/AndroidRuntime(8932):at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2441) 04-19 23:37:04.917:E/AndroidRuntime(8932):at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2174) 04-19 23:37:04.917:E/AndroidRuntime(8932):at android.view.View.dispatchPointerEvent(View.java:8025) 04-19 23:37:04.917:E/AndroidRuntime(8932):at android.view.ViewRootImpl$ViewPostImeInputStage.processPointerEvent(ViewRootImpl.java:4675) 04-19 23:37:04.917:E/AndroidRuntime(8932):at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:4563) 04-19 23:37:04.917:E/AndroidRuntime(8932):at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:4157) 04-19 23:37:04.917:E/AndroidRuntime(8932):at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:4214) 04-19 23:37:04.917:E/AndroidRuntime(8932):at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:4183) 04-19 23:37:04.917:E/AndroidRuntime(8932):at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:4268) 04-19 23:37:04.917:E/AndroidRuntime(8932):at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:4191) 04-19 23:37:04.917:E/AndroidRuntime(8932):at android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:4325) 04-19 23:37:04.917:E/AndroidRuntime(8932):at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:4157) 04-19 23:37:04.917:E/AndroidRuntime(8932):at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:4214) 04-19 23:37:04.917:E/AndroidRuntime(8932):at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:4183) 04-19 23:37:04.917:E/AndroidRuntime(8932):at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:4191) 04-19 23:37:04.917:E/AndroidRuntime(8932):at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:4157) 04-19 23:37:04.917:E/AndroidRuntime(8932):at android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:6317) 04-19 23:37:04.917:E/AndroidRuntime(8932):at android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:6255) 04-19 23:37:04.917:E/AndroidRuntime(8932):at android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:6226) 04-19 23:37:04.917:E/AndroidRuntime(8932):at android.view.ViewRootImpl$WindowInputEventReceiver.onInputEvent(ViewRootImpl.java:6397) 04-19 23:37:04.917:E/AndroidRuntime(8932):at android.view.InputEventReceiver.dispatchInputEvent(InputEventReceiver.java:188) 04-19 23:37:04.917:E/AndroidRuntime(8932):at android.os.MessageQueue.nativePollOnce(Native Method) 04-19 23:37:04.917:E/AndroidRuntime(8932):at android.os.MessageQueue.next(MessageQueue.java:132) 04-19 23:37:04.917:E/AndroidRuntime(8932):at android.os.Looper.loop(Looper.java:124) 04-19 23:37:04.917:E/AndroidRuntime(8932):at android.app.ActivityThread.main(ActivityThread.java:5493) 04-19 23:37:04.917:E/AndroidRuntime(8932):at java.lang.reflect.Method.invokeNative(Native Method) 04-19 23:37:04.917:E/AndroidRuntime(8932):at java.lang.reflect.Method.invoke(Method.java:525) 04-19 23:37:04.917:E/AndroidRuntime(8932):at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1209) 04-19 23:37:04.917:E/AndroidRuntime(8932): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1025) 04-19 23:37:04.917:E/AndroidRuntime(8932):at dalvik.system.NativeStart.main(Native Method)
You need to add a public method songPicked() in your Activity.
If you read the complete tutorial on Step 3
Remember that we added an onClick attribute to the layout for each item in the song list. Add that method to the main Activity class
So , when an item is clicked this songPicked will be called , which is expected to be public method in your Activity.
public void songPicked(View view){
musicService.setSong(Integer.parseInt(view.getTag().toString()));
musicService.playSong();
}
You can remove the setOnItemClickListener code if you add the method or remove the onClick="songPicked" from the layout