Domanda

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)

È stato utile?

Soluzione

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top