2014-04-19 2 views
0

나는 StandOutWindow 라이브러리를 사용하고 있습니다.이 곳에서 MusicPlayer를 만들려고 시도했습니다. This Tutorial 내 ListView는 노래를 표시하지만 노래를 클릭하면 앱이 다운됩니다. 나는 무엇을 놓치고 있습니까? 감사.내 ListView.onItemClickListner에서 PlaySong을 사용할 수 없습니까?

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

로그 캣

04-19 23 : 37 : 04.917 : E/AndroidRuntime (8932)에서 기계적 인조 인간. 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분 : 043317 : E/AndroidRuntime (8932) : android.view.View.View.ViewGroup.dispatchTouchEvent (ViewGroup.java:2435) 04-19 23 : 37 : 04.917 : E/AndroidRuntime (8932) : android.view.View.ViewGroup.dispatchTouchEvent ViewGroup.java:2159) 04-19 23 : 37 : 04.917 : E/AndroidRuntime (8932) : android.view.Vie (ViewGroup.java : 2441) 04-19 23 : 37 : 04.917 : E/AndroidRuntime (8932) : android.view.ViewGroup.dispatchTouchEvent (ViewGroup.java:2174) 04-19 23:37 : wGroup.dispatchTransformedTouchEvent 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/(8932) AndroidRuntime : 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 (8 932) : 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) : 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),363,210 04-19 23 : 37 : 04.917 : E/AndroidRuntime (8932) android.view.ViewRootImpl $ AsyncInputStage.forward (ViewRootImpl.java:4268)에서 04-19 23 : 37 : 04.917/AndroidRuntime (8932) E : 37 : 04.917 : E/AndroidRuntime (8932) : android.view.ViewRootImpl $ AsyncInputStage.apply에서 (ViewRootImpl.java 04-19 23 android.view.ViewRootImpl $ InputStage.apply (ViewRootImpl.java:4191)에서 : 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) : 안드로이드에서.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/Andr oidRuntime (8932) : android.view.ViewRootImpl $ WindowInputEventReceiver.onInputEvent (ViewRootImpl.java:6397) 04-19 23 : 37 : 04.917 : E/AndroidRuntime (8932) : android.view.InputEventReceiver.dispatchInputEvent (InputEventReceiver. 자바 : 188) 04-19 23 : 37 : 04.917 : E/AndroidRuntime (8932) : android.os.MessageQueue.nativePollOnce (기본 메소드) 04-19 23 : 37 : 04.917 : E/AndroidRuntime (8932) : android.os.MessageQueue.next (MessageQueue.java:132) 04-19 23 : 37 : 04.917 : E/AndroidRuntime (8932) : android.os.Looper.loop (Looper.java:124) 04- 19 23 : 37 : 04.917 : E/AndroidRuntime (8932) : android.app.ActivityThread.main (ActivityThread.java:5493) 04-19 23 : 37 : 04.917 : E/AndroidRuntime (8932) : java.lang .reflect.Method.invokeNative (네이티브 메소드) 04-19 23 : 37 : 04.917 : E/AndroidRuntime (8932) : java.lang.reflec t.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 (네이티브 메서드)

+3

가 다음 로그 캣을 게시 setOnItemClickListener 코드를 제거 할 수 있습니다. –

+0

레이아웃 파일을 넣으십시오. –

답변

1

활동에 public 메서드 songPicked()를 추가해야합니다.

당신은 3

우리는 onclick을 노래 목록의 각 항목에 대한 레이아웃에 속성을 추가 한 것을 기억 단계에서 전체 자습서를 읽는다면. 해당 메서드를 주 활동 클래스에 추가하십시오.

그래서 항목을 클릭하면이 songPicked가 호출됩니다.이 노래는 귀하의 활동에서 공개 메소드로 예상됩니다. 당신은 레이아웃에서의 onclick = "songPicked을"방법을 추가하거나 제거하는 경우

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

당신은

+0

나는 onItemclicklistner에서 추가했습니다 .. – Yusuf

+0

onItemclicklistner에서 제거하거나 레이아웃에서 onClick = "songPicked"을 제거하십시오. – Libin

+0

그래도 시도해 보았지만 뛰어난 창 때문에 다른 방법이있는 것은 아닙니다. 빠른 대답을위한 것보다. – Yusuf