Не удается воспроизвести песню из My ListView.onItemClickListner?

Я пытаюсь использовать библиотеку StandOutWindow, в которой я пытался создать MusicPlayer из этого Это руководство Мой ListView показывает песни, но когда я нажимаю на песни, происходит сбой приложения. Что мне не хватает? Спасибо.

Основное действие

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());
    }

}

Музыкальная служба

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;
}

ЛОГКАТ

Вам нужно добавить публичный метод songPicked() в свою активность.


person Yusuf    schedule 19.04.2014    source источник
comment
поместите свой файл макета.   -  person M D    schedule 19.04.2014
comment
Удалите его из onItemclicklistner или удалите onClick=songPicked из макета.   -  person M D    schedule 19.04.2014


Ответы (1)


Если вы прочитали полный учебник на шаге 3

Помните, что мы добавили атрибут onClick в макет для каждого элемента в списке песен. Добавьте этот метод в основной класс Activity

Итак, когда элемент щелкнут, будет вызван этот songPicked, который, как ожидается, будет общедоступным методом в вашей деятельности.

Вы можете удалить код setOnItemClickListener, если добавите метод или удалите onClick="songPicked" из макета.

 public void songPicked(View view){
    musicService.setSong(Integer.parseInt(view.getTag().toString()));
    musicService.playSong();
}   

опубликуйте свой logcat тогда.

person Libin    schedule 19.04.2014
comment
Пробовал, но это все еще не работает из-за выдающегося окна, есть ли альтернативный способ. Спс за быстрый ответ. - person Libin; 19.04.2014
comment
в чем сейчас была проблема? - person Yusuf; 19.04.2014
comment
удалил onClick=songPicked из xml и попробовал SoundPicked Outside ItemClickListner, но приложение все равно вылетает. И я обновил свой журнал и основные действия - person Libin; 19.04.2014
comment
04-19 23:37:04.917:E/AndroidRuntime(8932):в android.widget.AdapterView.performItemClick(AdapterView.java:301) 04-19 23:37:04.917:E/AndroidRuntime(8932):в android. widget.AbsListView.performItemClick(AbsListView.java:1510) 04-19 23:37:04.917:E/AndroidRuntime(8932):в android.widget.AbsListView$PerformClick.run(AbsListView.java:3339) 04-19 23: 37:04.917:E/AndroidRuntime(8932):в android.widget.AbsListView.onTouchEvent(AbsListView.java:4635) 04-19 23:37:04.917:E/AndroidRuntime(8932):в android.view.View.dispatchTouchEvent (View.java:7817) 04-19 23:37:04.917:E/AndroidRuntime(8932):в android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2435) 04-19 23:37:04.917:E/AndroidRuntime (8932): в android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2159) 04-19 23:37:04.917:E/AndroidRuntime(8932):в android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2441) 04-19 23:37:04.917:E/AndroidRuntime(8932):в 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) : в android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2174) 04-19 23:37:04.917:E/AndroidRuntime(8932):в android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2441) 04-19 23:37:04.917:E/AndroidRuntime(8932):в android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2174) 04-19 23:37:04.917:E/AndroidRuntime(8932):в android.view.ViewGroup .dispatchTransformedTouchEvent(ViewGroup.java:2441) 04-19 23:37:04.917:E/AndroidRuntime(8932):в android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2174) 04-19 23:37:04.917:E /AndroidRuntime(8932):в android.view.View.dispatchPointerEvent(View.java:8025) 04-19 23:37:04.917:E/AndroidRuntime(8932):в android.view.ViewRootImpl$ViewPostImeInputStage.processPointerEvent(ViewRootImpl. java:4675) 04-19 23:37:04.917:E/AndroidRuntime(8932):в 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):в android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:4214) 04-19 23:37:04.917:E/AndroidRuntime(8932):в android.view .ViewRootImpl$InputStage.forward(ViewRootImpl.java:4183) 04-19 23:37:04.917:E/AndroidRuntime(8932):в 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):в android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:4325) 04-19 23:37:04.917:E/AndroidRuntime(8932):в 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):в android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:4183) 04-19 23:37:04.917:E/AndroidRuntime(8932):в 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):в android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:6317) 04- 19 23:37:04.917:E/AndroidRuntime(8932):в android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:6255) 04-19 23:37:04.917:E/AndroidRuntime(8932):в 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):в android.view.InputEventReceiver.dispatchInputEvent(InputEventReceiver.java:188) 04-19 23:37:04.917:E/AndroidRuntime(8932):в android.os.MessageQueue.nativePollOnce(собственный метод) 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(собственный метод) 04-19 23:37:04.9 17:E/AndroidRuntime(8932):в java.lang.reflect.Method.invoke(Method.java:525) 04-19 23:37:04.917:E/AndroidRuntime(8932):в com.android.internal.os .ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1209) 04-19 23:37:04.917:E/AndroidRuntime(8932): в com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1025) 04- 19 23:37:04.917:E/AndroidRuntime(8932):at dalvik.system.NativeStart.main(собственный метод) - person Yusuf; 19.04.2014