Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: Android Auto Support #2094

Open
wants to merge 84 commits into
base: main
Choose a base branch
from

Conversation

lovegaoshi
Copy link
Contributor

continuation of #2043 . Synced up with RNTP v4.0.0 rc07

lovegaoshi and others added 30 commits June 15, 2023 06:20
feat: full android auto support
@caustin24345
Copy link

Hi @lovegaoshi - I'm wondering if local files could be supported for an Android Auto MediaItem's iconUri. It seems like this is possible with items added to the TrackPlayer (using require('path_to_local_file')), which directly updates things like the images in the Android Auto player screen, and icons in the playback queue, but not possible for the icons in the Android Auto lists.

My understanding is the iconUri string gets mapped to the mediaDescriptionBuilder.iconUri which is used to populate the MediaItem that we see on the Android Auto screen, so in theory it should be working for any local file Uri that gets saved to a device (i.e a downloaded piece of content + image that is saved to local storage).

Have you had any experience with this in the past or during testing?

FYI - Forcing a loading indicator for an AA template is possible by temporarily sending a result of null in the onLoadChildren callback.

@lovegaoshi
Copy link
Contributor Author

I don't think when i first made it, i made it right that it also accepts a resource id; see
lovegaoshi/KotlinAudio@7a3d90b#diff-7d05808a134fc6efdaef2d0049ac5bf23ee4367c6c2601f159b4577f6bbb29bfR205
you'd probably have to put in a uri identifier there?

@PatelPiyush04
Copy link

I'm utilizing react-native-track-player for my player implementation in a React Native app. While attempting to fetch local artwork stored at "file:///data/user/0/au.com.podcastoneaustralia.dev/files/offline/c95fee2d-5099-4ace-8c86-b00500231c2e/imageUrl.jpg", I encounter an issue where the artwork fails to load within the list and player components. Strangely, it displays perfectly fine for the queue list in Android Auto.

My understanding is the iconUri string gets mapped to the mediaDescriptionBuilder.iconUri which is used to populate the MediaItem that we see on the Android Auto screen, so in theory it should be working for any local file Uri that gets saved to a device (i.e a downloaded piece of content + image that is saved to local storage).

I'm seeking assistance to resolve this inconsistency and ensure that the local artwork loads seamlessly across all components, including the list and player interfaces within the Android Auto app.

  1. media List : AndroidAutoBrowseTree
Screenshot 2024-03-28 at 3 39 17 pm
  1. Player View
Screenshot 2024-03-28 at 3 39 27 pm
  1. queue list: where we used ** TrackPlayer.add** it accept the require("file path")
Screenshot 2024-03-28 at 3 39 36 pm

@lovegaoshi
Copy link
Contributor Author

its a bit more complicated than that:
the media list you are referring to uses setIconUri as per google's guidelines. https://developer.android.com/media/legacy/audio/mediabrowserservice#communicating_content_with_onloadchildren

the player view you are referring to uses specifically lovegaoshi/KotlinAudio@7a3d90b
(see discussion: #1984 (reply in thread))
I have no idea what the queue list uses, but it should be exoplayer's item.

so you're looking at onLoadChildren, NotificationManager, and exoplayer's internal queue - I guess I'm not surprised only the internal queue behaves if some of them has to fail.

If I did setIconUri correctly, then I believe this is a better question to google/media3; however the way we used this, exoplayer2, is depreciated and I doubt google will give you an answer. Otherwise you're welcome to poke around yourself

@andreknieriem
Copy link

Hi there. I've testet your version and it is working great. Do you have a hint for long lists? For example a list of all albums/tracks or all tracks in a playlist? Is there a "ScrollToEnd" Event to fetch more items?

@lovegaoshi
Copy link
Contributor Author

lovegaoshi commented Apr 18, 2024 via email

@michele-ruocco
Copy link

Hi @lovegaoshi,
I thank you for the great work you are doing for the whole community.

Have you had a chance to check and understand how to handle an Android Auto startup from closed app?

Also, I would like to point out that development for Android Automotive OS (AOSP) is growing rapidly. https://developers.google.com/cars/design/automotive-os

Could this be a launching point to support it?

The big challenge here is that Android Automotive is an operating system and platform running directly on the in-vehicle hardware supporting development as for Android Auto but no primary Activity is available.

@lovegaoshi
Copy link
Contributor Author

hi!
see https://github.com/doublesymmetry/react-native-track-player/pull/2094/files#diff-1d541f5b0b5ea040825889f05cb7e342bfe8d0b64177561b49dc819a0804ee36R63
as for AOSP IMO its a pretty remote system that only very few models use. and NO this is not a launching point to support AOSP bc AA and AOSP are completely different. also i personally have a camry so i dont have any interest.

@gavrichards
Copy link
Contributor

Do you think this is ever likely to be merged into the main branch? Have the maintainers shared what their reluctance is, or is it just a case of needing time to review?

@dcvz
Copy link
Contributor

dcvz commented Apr 30, 2024

Do you think this is ever likely to be merged into the main branch? Have the maintainers shared what their reluctance is, or is it just a case of needing time to review?

My hope has always been to get this in -- the reluctance has been about the need for the main project to eventually update to using media3 for Android audio playback. There are some adjustments I'm envisioning will need to happen here, and as stretched out as I am, I am fearful of getting this in before then and then being responsible for also maintaining this behaviour after migration.

I understand though that this has been waiting for a while and am sorry for that.

@lovegaoshi
Copy link
Contributor Author

lovegaoshi commented Apr 30, 2024 via email

@andreknieriem
Copy link

Hi @lovegaoshi . I've maybe found a bug. There is no "subtitle"/artists on my headunit. I've tried the default artist for trackplayer and a subtitle too. But none of them is showing up. Any advice?

@lovegaoshi
Copy link
Contributor Author

i dont think RNTP track has a subtitle property - u could try mapping all artist to subtitle and see if that works

@andreknieriem
Copy link

i dont think RNTP track has a subtitle property - u could try mapping all artist to subtitle and see if that works

So you don't have a subtitle too in your android auto headunit?

image

Here I am missing Linkin Park as artist. In my list views it is showing up:
image

Of course I tried to set subtitle on my now playing item but it doesn't work. Any idea?

@lovegaoshi
Copy link
Contributor Author

how exactly did u map/use subtitle?
eg if u map artist to subtitle like this lovegaoshi/KotlinAudio@aefe6d8
it would work:
image
which works the same if u set the mediaItem's subtitle as well

@andreknieriem
Copy link

Thanks for your answer, but I don't get it.
I have a playlist like this with 1 track for example

[
  {
    id: 11,
    title: "More the victim"
    subtitle: "Linkin Park",
    artist: "Linkin Park",
    url: "https://url.com/lp.mp3",
    duration: 200,
    artwork: "cover.jpg"
  }
]

This works all in my app on my phone with trackplayer. It shows everywhere in the notification and so on. On my android auto it doesn't show the artist. You see I tried setting both artist and subtitle, but that didn't change anything. Now I tried your latest version with implementation 'com.github.lovegaoshi:KotlinAudio:v2.0.0-aa23' as dependency but it says, that there is no version aa23 in jitpack.io.

@lovegaoshi
Copy link
Contributor Author

lovegaoshi commented May 17, 2024 via email

@KestasVenslauskas
Copy link

Wanted to try this out but can't get past this error:
Failed to resolve: com.github.lovegaoshi:KotlinAudio:v2.0.0-aa23

@lovegaoshi
Copy link
Contributor Author

can u not build? bc i can
image
or ur network/jitpack is not stable rn

@KestasVenslauskas
Copy link

can u not build? bc i can image or ur network/jitpack is not stable rn

Yes it was just an issue with jitpack being down probably. Now it works

@lovegaoshi
Copy link
Contributor Author

lovegaoshi commented May 29, 2024

edit about album art on AA:

I originally enabled album art via lovegaoshi/KotlinAudio@7a3d90b but google's guidelines seem to contradict with that. nevertheless however RNTP is currently set up (for ex https://github.com/lovegaoshi/react-native-track-player/blob/6f634594f24aa1974b2c8cdc6848b8b349cccdf0/android/src/main/java/com/doublesymmetry/kotlinaudio/notification/NotificationManager.kt#L389) for remote urls it works great, but for local uris (file:///) and embedded covers within local media files it wont work.

for local uris while I do not have a use and no rigorous tests yet, I believe converting the file:/// uri to a content:// one, as specified in the google guidelines, would work. u can see how i did this via a fileProvider: lovegaoshi/azusa-player-mobile#449

for embedded covers (which I worked on for the past few days) this has to be first resolved and written to a file, then load the content:// uri as in the google guidelines. I tried with both ffmpeg and MediaMetadataRetriever, opted for the latter in the end for simplicity. commit is here: lovegaoshi@6f63459

the specific implementation I have does have a drawback taht the local file is written in the /Pictures folder. you might be able to write to cache using File() then convert to content:// with a fileProvider, but I chose the simplicity of MediaStore and can deal with this drawback.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet