2013-07-31 1 views
1

커서를 설정했지만 실제로 검색하는 데 여전히 어려움이 있습니다. 트랙 이름을 어떻게 검색합니까? Mediaplayer에 전달할 수 있도록 ID를 얻으려면 어떻게해야합니까? 나는 다른 일을 시도했지만 성공하지 못했습니다.문자열을 사용하여 mediastore 커서에서 노래를 실제로 검색하는 방법

기본적으로 특정 문자열 (이 경우 문자열 songToPlay)에 대한 mediastore를 검색하고, 결과를 얻고, 가장 일치하는 ID를 얻고, 내 미디어 플레이어 서비스에 전달하여 배경. 내가 당신에게 요구하는 유일한 것은 ID를 얻는 방법입니다.

Uri uri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI; 
String[] songToPlay = value.split("play song"); 
    String[] searchWords = songToPlay[1].split(" "); 
       String [] keywords = null; 
       StringBuilder where = new StringBuilder(); 
       where.append(MediaStore.Audio.Media.TITLE + " != ''"); 
    String selection = where.toString(); 
        String[] projection = { 
          BaseColumns._ID, 
          MediaStore.Audio.Media.MIME_TYPE, 
          MediaStore.Audio.Artists.ARTIST, 
          MediaStore.Audio.Albums.ALBUM, 
          MediaStore.Audio.Media.TITLE 
        }; 
for (int i = 0; i < searchWords.length; i++) { 
         keywords[i] = '%' + MediaStore.Audio.keyFor(searchWords[i]) + '%'; 
        } 

       Cursor cursor = this.managedQuery(uri, projection, selection, keywords, MediaStore.Audio.Media.TITLE);    
       if (cursor.moveToFirst()) { 
        do{ 
         test.setText(cursor.getString(cursor 
           .getColumnIndex(MediaStore.Audio.Media.DISPLAY_NAME))); 
        }while(cursor.moveToNext()); 
       } 

나는 매우 혼란 스러워요 및이 코드의 대부분은 인터넷에서입니다 :

내가 사용하고있는 코드입니다. 나는 2 일 동안 이것을하려고 노력하고 있었다. 그래서 나는 여기에서 묻고있다. 나 혼자 힘으로 노력했다.

편집 : 현재 코드. 음악 ID 또는 커서에서 해당 노래를 재생하는 데 필요한 위치를 어떻게 찾을 수 있습니까?

Uri uri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI; 
      String songToPlay = value.replaceAll("play song", "").trim(); 
      int music_column_index; 
      String[] projection = { 
        MediaStore.Audio.Media._ID, 
        MediaStore.Audio.Artists.ARTIST, 
        MediaStore.Audio.Albums.ALBUM, 
        MediaStore.Audio.Media.TITLE 
      }; 


      @SuppressWarnings("deprecation") 
      Cursor cursor = this.managedQuery(uri, 
        null, 
        MediaStore.Audio.Media.TITLE + "=?", 
        new String[]{songToPlay}, 
        MediaStore.Audio.Media.TITLE + " ASC"); 

답변

2

이것은 당신의 songToPlay 문자열의 값과 동일한 제목으로 모든 노래에 대한 MediaStore을 검색합니다.

Cursor cursor = getContentResolver().query(
    MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, 
    null, 
    MediaStore.Audio.Media.TITLE + "=?", 
    new String[]{songToPlay}, 
    MediaStore.Audio.Media.TITLE + " ASC"); 

물론 커서를 쿼리하여 결과의 ​​ID (및 다른 모든 열)를 가져올 수 있습니다.

while (cursor.moveToNext()) { 
    String path = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.DATA)); 
    long id = cursor.getLong(cursor.getColumnIndex(MediaStore.Audio.Media._ID)); 
    // Whatever else you need 
} 

그러나 이것은 당신이 더 퍼지 경기를 위해 LIKE 연산자를 사용하실 수 있습니다, 정확한 일치가 필요합니다.

+0

너무 많이 묻는다면 미안하지만 정말 붙어 있습니다. 나는 아직도 DB 쿼리에 대해 전혀 모른다. 커서를 선언 한 후 커서에서 파일 위치 또는 음악 ID를 얻으려면 어떻게해야합니까? 나는 거의 우울합니다. 나는 2 일 넘게 이것을 진행할 수 없습니다. 현재 코드를 원래 게시물에 넣었습니다. –

+0

나는 내 대답을 편집했습니다 –

+0

안녕하세요 켄. 아주 유용한 답변입니다. 게시 해 주셔서 감사합니다. LIKE 연산자에 대해 자세히 설명 할 수 있는지 알고 싶습니다. 나는이 코드가 작동하지만 당신이 진술했듯이 정확한 곡명이 필요하다. 내가 검색 할 때 내가 찾고있는 문자를 포함하는 노래를 채울 수 있도록 어떻게 만들 수 있는가? 고마워요. – Jack

관련 문제