barthap / expo-music-picker

A music picker library for React Native. Provides access to the system's UI for selecting songs from the phone's music library.
71 stars 3 forks source link

Crash on Android 12 after pick music track #2

Open nicredshaw opened 1 year ago

nicredshaw commented 1 year ago

Hi,

Nice idea - looking forward to getting it working on Android ! Have got the bluetooth side of things working on some 'Arduino-like' hardware, but having problems with the music picker: the application crashes with the below error message. If I select a track with the native music picker it will start playing, but as soon as I click on 'Done' it crashes. Note that it doesn't get as far as the check to see if the result has been cancelled: I put in a console.log just after the return from 'openMusicLibraryAsync' which doesn't get called. I also put in a call to 'requestPermissionsAsync' which correctly asked me for permissions the first time.

Crash trace: Your app just crashed. See the error below.

java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=2317, result=-1, data=Intent { dat=content://media/external/audio/media/14 typ=audio/mpeg flg=0x1 }} to activity {com.barthap.expomegademo/com.barthap.expomegademo.MainActivity}: java.lang.IllegalArgumentException: Invalid column last_modified
at android.app.ActivityThread.deliverResults(ActivityThread.java:5946)
at android.app.ActivityThread.handleSendResult(ActivityThread.java:5985)
at android.app.servertransaction.ActivityResultItem.execute(ActivityResultItem.java:54)
at android.app.servertransaction.ActivityTransactionItem.execute(ActivityTransactionItem.java:45)
at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2443)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loopOnce(Looper.java:226)
at android.os.Looper.loop(Looper.java:313)
at android.app.ActivityThread.main(ActivityThread.java:8751)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:571)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1135)
at Caused By android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:172)
at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:142)
at android.content.ContentProviderProxy.query(ContentProviderNative.java:481)
at android.content.ContentResolver.query(ContentResolver.java:1226)
at android.content.ContentResolver.query(ContentResolver.java:1158)
at android.content.ContentResolver.query(ContentResolver.java:1114)
at expo.community.modules.musicpicker.MusicMetadataResolver.getDirectUriInfo(MusicMetadataResolver.kt:162)
at expo.community.modules.musicpicker.MusicMetadataResolver.getMusicMetadata(MusicMetadataResolver.kt:46)
at expo.community.modules.musicpicker.MusicPickerModule.getMusicMetadata(MusicPickerModule.kt:92)
at expo.community.modules.musicpicker.MusicPickerModule.processPickerResult(MusicPickerModule.kt:109)
at expo.community.modules.musicpicker.MusicPickerModule.access$processPickerResult(MusicPickerModule.kt:37)
at expo.community.modules.musicpicker.MusicPickerModule$definition$lambda-5$$inlined$OnActivityResult$1.invoke(ModuleDefinitionBuilder.kt:604)
at expo.community.modules.musicpicker.MusicPickerModule$definition$lambda-5$$inlined$OnActivityResult$1.invoke(ModuleDefinitionBuilder.kt:597)
at expo.modules.kotlin.events.EventListenerWithSenderAndPayload.call(EventListener.kt:37)
at expo.modules.kotlin.ModuleHolder.post(ModuleHolder.kt:40)
at expo.modules.kotlin.ModuleRegistry.post(ModuleRegistry.kt:67)
at expo.modules.kotlin.AppContext.onActivityResult(AppContext.kt:167)
at expo.modules.kotlin.ReactLifecycleDelegate.onActivityResult(ReactLifecycleDelegate.kt:33)
at com.facebook.react.bridge.ReactContext.onActivityResult(ReactContext.java:328)
at com.facebook.react.ReactInstanceManager.onActivityResult(ReactInstanceManager.java:828)
at com.facebook.react.ReactDelegate.onActivityResult(ReactDelegate.java:90)
at com.facebook.react.ReactActivityDelegate.onActivityResult(ReactActivityDelegate.java:113)
at expo.modules.ReactActivityDelegateWrapper.onActivityResult(ReactActivityDelegateWrapper.kt:145)
at com.facebook.react.ReactActivity.onActivityResult(ReactActivity.java:70)
at android.app.Activity.dispatchActivityResult(Activity.java:8659)
at android.app.ActivityThread.deliverResults(ActivityThread.java:5939)
at android.app.ActivityThread.handleSendResult(ActivityThread.java:5985)
at android.app.servertransaction.ActivityResultItem.execute(ActivityResultItem.java:54)
at android.app.servertransaction.ActivityTransactionItem.execute(ActivityTransactionItem.java:45)
at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2443)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loopOnce(Looper.java:226)
at android.os.Looper.loop(Looper.java:313)
at android.app.ActivityThread.main(ActivityThread.java:8751)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:571)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1135)

Any ideas ?

Thanks,

Nic

barthap commented 1 year ago

Moved this to expo-music-picker repo as it is directly related to the music picker module, rather than the demo app.

barthap commented 1 year ago

The hotfix for this is to comment-out a few lines in expo-music-picker/android/src/main/java/expo/community/modules/musicpicker/MusicMetadataResolver.kt:

diff --git a/node_modules/expo-music-picker/android/src/main/java/expo/community/modules/musicpicker/MusicMetadataResolver.kt b/node_modules/expo-music-picker/android/src/main/java/expo/community/modules/musicpicker/MusicMetadataResolver.kt
index d8f0aec..047c1e8 100644
--- a/node_modules/expo-music-picker/android/src/main/java/expo/community/modules/musicpicker/MusicMetadataResolver.kt
+++ b/node_modules/expo-music-picker/android/src/main/java/expo/community/modules/musicpicker/MusicMetadataResolver.kt
@@ -156,7 +156,7 @@ internal class MusicMetadataResolver(
 //            MediaStore.Audio.AudioColumns._ID,
 //            DocumentsContract.Document.COLUMN_DOCUMENT_ID,
         DocumentsContract.Document.COLUMN_DISPLAY_NAME,
-        DocumentsContract.Document.COLUMN_LAST_MODIFIED
+//        DocumentsContract.Document.COLUMN_LAST_MODIFIED
     )

     return appContext.reactContext!!.contentResolver.query(
@@ -171,15 +171,15 @@ internal class MusicMetadataResolver(
       }

       val fileNameIndex = cursor.getColumnIndexOrThrow(DocumentsContract.Document.COLUMN_DISPLAY_NAME)
-      val lastModifiedIndex = cursor.getColumnIndexOrThrow(DocumentsContract.Document.COLUMN_LAST_MODIFIED)
+ //   val lastModifiedIndex = cursor.getColumnIndexOrThrow(DocumentsContract.Document.COLUMN_LAST_MODIFIED)

       val fileName = cursor.getString(fileNameIndex)
-      val lastModified = cursor.getInt(lastModifiedIndex)
+//    val lastModified = cursor.getInt(lastModifiedIndex)

       return@use MusicMetadata(
           uri,
           fileName = fileName,
-          dateAdded = lastModified
+    //      dateAdded = lastModified
       )
     }
   }
nicredshaw commented 1 year ago

Thanks ! Thought something like this might fix it, but it being deep in the Kotlin didn't want to start hacking about with it.

Not quite there yet, but further forwards !