2013-07-18 3 views
0

내 앱은 미디어 저장소에서 앨범을 반환하고 listview에 저장합니다. 앨범을 클릭하면 해당 앨범과 관련된 노래가 들어있는 다른 목록보기가 열립니다. 하지만 노래를 클릭하면 앱이 다운됩니다. 선택한 노래의 파일 경로를 가져 와서 해당 노래를 재생하는 다른 활동으로 전달할 수 있기를 원합니다. 여기 내 코드 : public class Albums extends ListActivity { 커서 커서;listview에서 데이터를 가져와 다른 액티비티로 전달하는 방법

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.playlist); 

    String[] columns = { android.provider.MediaStore.Audio.Albums._ID, 
      android.provider.MediaStore.Audio.Albums.ALBUM }; 

    cursor = managedQuery(MediaStore.Audio.Albums.EXTERNAL_CONTENT_URI, 
      columns, null, null, null); 

    String[] displayFields = new String[] { MediaStore.Audio.Albums.ALBUM }; 
    int[] displayViews = new int[] { android.R.id.text1 }; 
    setListAdapter(new SimpleCursorAdapter(this, 
      android.R.layout.simple_list_item_1, cursor, displayFields, 
      displayViews)); 

} 

protected void onListItemClick(ListView l, View v, int position, long id) { 
    if (cursor.moveToPosition(position)) { 

     String[] columns = { MediaStore.Audio.Media.DATA, 
       MediaStore.Audio.Media._ID, MediaStore.Audio.Media.TITLE, 
       MediaStore.Audio.Media.DISPLAY_NAME, 
       MediaStore.Audio.Media.MIME_TYPE, }; 

     String where = android.provider.MediaStore.Audio.Media.ALBUM + "=?"; 

     String whereVal[] = { cursor.getString(cursor 
       .getColumnIndex(MediaStore.Audio.Albums.ALBUM)) }; 

     String orderBy = android.provider.MediaStore.Audio.Media.TITLE; 

     cursor = managedQuery(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, 
       columns, where, whereVal, orderBy); 

     String[] displayFields = new String[] { MediaStore.Audio.Media.DISPLAY_NAME }; 
     int[] displayViews = new int[] { android.R.id.text1 }; 

     setListAdapter(new SimpleCursorAdapter(this, 
       android.R.layout.simple_list_item_1, cursor, displayFields, 
       displayViews)); 

    } 
} 


} 

이것은 로그 캣에 포함되어있는 것입니다 :

07-18 17:44:20.327: D/libEGL(30458): loaded /system/lib/egl/libGLES_android.so 
07-18 17:44:20.387: D/libEGL(30458): loaded /system/lib/egl/libEGL_adreno200.so 
07-18 17:44:20.407: D/libEGL(30458): loaded /system/lib/egl/libGLESv1_CM_adreno200.so 
07-18 17:44:20.437: D/libEGL(30458): loaded /system/lib/egl/libGLESv2_adreno200.so 
07-18 17:44:20.607: I/Adreno200-EGLSUB(30458): <ConfigWindowMatch:2078>: Format RGBA_8888. 
07-18 17:44:20.667: D/memalloc(30458): ashmem: Mapped buffer base:0x51fcf000 size:1536000 fd:62 
07-18 17:44:20.697: D/OpenGLRenderer(30458): Enabling debug mode 0 
07-18 17:44:20.818: D/memalloc(30458): ashmem: Mapped buffer base:0x52156000 size:1536000 fd:65 
07-18 17:44:40.737: D/OpenGLRenderer(30458): has fontRender patch 
07-18 17:44:41.047: D/memalloc(30458): ashmem: Mapped buffer base:0x526bd000 size:1536000 fd:68 
07-18 17:44:43.750: I/Adreno200-EGLSUB(30458): <ConfigWindowMatch:2078>: Format RGBA_8888. 
07-18 17:44:43.770: D/memalloc(30458): ashmem: Mapped buffer base:0x52834000 size:1536000 fd:71 
07-18 17:44:43.960: D/memalloc(30458): ashmem: Mapped buffer base:0x52bab000 size:1536000 fd:78 
07-18 17:44:43.980: D/OpenGLRenderer(30458): Flushing caches (mode 0) 
07-18 17:44:44.981: D/memalloc(30458): ashmem: Mapped buffer base:0x51ecf000 size:1536000 fd:63 
07-18 17:44:47.454: E/CursorWindow(30458): Failed to read row 4, column -1 from a CursorWindow which has 11 rows, 5 columns. 
07-18 17:44:47.454: D/AndroidRuntime(30458): Shutting down VM 
07-18 17:44:47.454: W/dalvikvm(30458): threadid=1: thread exiting with uncaught exception (group=0x40ac7228) 
07-18 17:44:47.494: E/AndroidRuntime(30458): FATAL EXCEPTION: main 
07-18 17:44:47.494: E/AndroidRuntime(30458): java.lang.IllegalStateException: Couldn't read row 4, col -1 from CursorWindow. Make sure the Cursor is initialized correctly before accessing data from it. 
07-18 17:44:47.494: E/AndroidRuntime(30458): at android.database.CursorWindow.nativeGetString(Native Method) 
07-18 17:44:47.494: E/AndroidRuntime(30458): at android.database.CursorWindow.getString(CursorWindow.java:491) 
07-18 17:44:47.494: E/AndroidRuntime(30458): at android.database.AbstractWindowedCursor.getString(AbstractWindowedCursor.java:51) 
07-18 17:44:47.494: E/AndroidRuntime(30458): at android.database.CursorWrapper.getString(CursorWrapper.java:118) 
07-18 17:44:47.494: E/AndroidRuntime(30458): at com.project.helixplayer.Albums.onListItemClick(Albums.java:49) 
07-18 17:44:47.494: E/AndroidRuntime(30458): at android.app.ListActivity$2.onItemClick(ListActivity.java:326) 
07-18 17:44:47.494: E/AndroidRuntime(30458): at android.widget.AdapterView.performItemClick(AdapterView.java:292) 
07-18 17:44:47.494: E/AndroidRuntime(30458): at android.widget.AbsListView.performItemClick(AbsListView.java:1077) 
07-18 17:44:47.494: E/AndroidRuntime(30458): at android.widget.AbsListView$PerformClick.run(AbsListView.java:2533) 
07-18 17:44:47.494: E/AndroidRuntime(30458): at android.widget.AbsListView$1.run(AbsListView.java:3198) 
07-18 17:44:47.494: E/AndroidRuntime(30458): at android.os.Handler.handleCallback(Handler.java:605) 
07-18 17:44:47.494: E/AndroidRuntime(30458): at android.os.Handler.dispatchMessage(Handler.java:92) 
07-18 17:44:47.494: E/AndroidRuntime(30458): at android.os.Looper.loop(Looper.java:154) 
07-18 17:44:47.494: E/AndroidRuntime(30458): at android.app.ActivityThread.main(ActivityThread.java:4945) 
07-18 17:44:47.494: E/AndroidRuntime(30458): at java.lang.reflect.Method.invokeNative(Native Method) 
07-18 17:44:47.494: E/AndroidRuntime(30458): at java.lang.reflect.Method.invoke(Method.java:511) 
07-18 17:44:47.494: E/AndroidRuntime(30458): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784) 
07-18 17:44:47.494: E/AndroidRuntime(30458): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551) 
07-18 17:44:47.494: E/AndroidRuntime(30458): at dalvik.system.NativeStart.main(Native Method) 
07-18 17:44:49.846: D/Process(30458): killProcess, pid=30458 
07-18 17:44:49.846: D/Process(30458): dalvik.system.VMStack.getThreadStackTrace(Native Method) 
07-18 17:44:49.846: D/Process(30458): java.lang.Thread.getStackTrace(Thread.java:599) 
07-18 17:44:49.846: D/Process(30458): android.os.Process.killProcess(Process.java:788) 
07-18 17:44:49.846: D/Process(30458): com.android.internal.os.RuntimeInit$UncaughtHandler.uncaughtException(RuntimeInit.java:104) 
07-18 17:44:49.846: D/Process(30458): java.lang.ThreadGroup.uncaughtException(ThreadGroup.java:693) 
07-18 17:44:49.846: D/Process(30458): java.lang.ThreadGroup.uncaughtException(ThreadGroup.java:690) 
07-18 17:44:49.846: D/Process(30458): dalvik.system.NativeStart.main(Native Method) 
07-18 17:44:49.846: I/Process(30458): Sending signal. PID: 30458 SIG: 9 
+0

내가 생각하기에 : "커서가 데이터를 액세스하기 전에 올바르게 초기화되었는지 확인하십시오." . 커서에 액세스하려면 코드를 사용해보십시오. 당신은 질의를 할 필요가 없습니다! – JJ86

답변

1

편집 질문과 로그 캣을 추가합니다. 나는 당신이 itemClick에 무엇을하고 있는지 모른다. (이해가 안되면 나에게 맞춰라.) 커서를 가져간 곳을 결정하지 않고 cursor.moveToPosition (position)을 사용한다; 그런 다음 열 및 기타 쿼리 직원을 고용합니다. 마침내 당신은 목록을 만듭니다.

간단히 말해서, 항목을 클릭하면 목록을 만드는 것처럼 보입니다! 이런 방식으로 방법에 코드를 변경 :

@Override 
public void onItemClick(AdapterView<?> listView, View view, int position, long id) { 
    // Get the cursor, positioned to the corresponding row in the result set 
    Cursor cursor = (Cursor) listViev.getItemAtPosition(position); 
    // Find your data on cursor and launch your second activity in order to show album's tracks 
} 

편집

을 아래 의견에 대한 우리의 논의 후, 난 당신이 프로젝트에 구조를 변경해야 할 것 같아요.

앨범 목록이 포함 된 첫 번째 활동을 추가하십시오. 하나의 항목을 클릭하면 앨범 트랙 목록이 포함 된 두 번째 활동을 시작합니다.

데이터베이스를 사용하는 경우 데이터를 쿼리하고 표시하는 것이 더 쉽습니다.

+0

Logcat을 추가했습니다. 내 질문에 대해 설명해 줄지 말해봐. – diamondtrust66

+0

활동이 시작되면 앨범 목록이 표시됩니다. 앨범을 클릭하면 해당 앨범의 노래가 목록보기에 표시됩니다 (onListItemClick() 메소드에 의해 처리됨). 노래 목록에서 노래를 클릭하면 경로를 추출하여 다른 활동으로 보내고 싶지만 앱이 충돌합니다. – diamondtrust66

+0

@ diamondtrust66 모든 작업이 동일한 작업에서 수행됩니까? – JJ86

관련 문제