Giter Site home page Giter Site logo

jrfeng / snow Goto Github PK

View Code? Open in Web Editor NEW
187.0 5.0 43.0 5.57 MB

Android music player framework, compatible with MediaSession. Support custom music player (MediaPlayer, ExoPlayer), custom Notification, custom audio effect engine, only WiFi network, sound quality/dynamic URL, headset clicks, sleep timer, playback history, player state persistence.

License: MIT License

Java 100.00%
music-player android mediaplayer exoplayer playlist sleep-timer headset-control sound-quality dynamic-url playback-history

snow's Introduction

API Level GitHub

中文

Android music player framework. Compatible with MediaSession.

Support:

  • Custom music player (MediaPlayer, ExoPlayer)
  • Custom Notification
  • Custom audio effect engine
  • Only WiFi network
  • Sound quality/dynamic URL
  • Headset clicks
  • Sleep timer
  • Playback history
  • Player state persistence

Document:

More:

Sample App

The app module is a sample app —— Download

Sample App Screenshot

LICENSE

MIT License

Copyright (c) 2020 jrfeng

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

snow's People

Contributors

janzjoy avatar jrfeng avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar

snow's Issues

Namespace not specified. Specify a namespace in the module's build file

If i set latest gradle plugin i have this following error... old gradle 7.3.3 and down working fine
important: we not using implementation .. we import snow projact in to ourapp
we are using like this

 implementation project(path: ':player')
 implementation project(path: ':exo')
 implementation project(path: ':ui')

Error:

  Namespace not specified. Specify a namespace in the module's build file. See https://d.android.com/r/tools/upgrade-assistant/set- 
  namespace for information about setting the namespace.

 If you've specified the package attribute in the source AndroidManifest.xml, you can use the AGP Upgrade Assistant to migrate to 
 the namespace value in the build file. Refer to https://d.android.com/r/tools/upgrade-assistant/agp-upgrade-assistant for general 
 information about using the AGP Upgrade Assistant.

EqualizerActivity 正在播放音频开启均衡器会闪退

java.lang.RuntimeException: Cannot initialize effect engine for type: 0bed4300-ddd6-11db-8f34-0002a5d5c51b Error: -3
at android.media.audiofx.AudioEffect.(AudioEffect.java:538)
at android.media.audiofx.AudioEffect.(AudioEffect.java:501)
at android.media.audiofx.AudioEffect.(AudioEffect.java:475)
at android.media.audiofx.Equalizer.(Equalizer.java:139)
at snow.player.ui.equalizer.AndroidAudioEffectManager.attachAudioEffect(AndroidAudioEffectManager.java:72)
at snow.player.AbstractPlayer.attachAudioEffect(AbstractPlayer.java:1387)
at snow.player.AbstractPlayer.notifyAudioEffectEnableChanged(AbstractPlayer.java:1374)
at snow.player.PlayerService.notifyAudioEffectEnableChanged(PlayerService.java:647)
at snow.player.PlayerService.setAudioEffectEnabled(PlayerService.java:575)
at snow.player.PlayerManager__ChannelHelper$Dispatcher.dispatch(PlayerManager__ChannelHelper.java:122)
at channel.helper.DispatcherUtil$1.dispatch(DispatcherUtil.java:15)
at channel.helper.pipe.CustomActionPipe.dispatch(CustomActionPipe.java:57)
at snow.player.PlayerService.onCustomAction(PlayerService.java:1331)
at snow.player.PlayerService$MediaSessionCallback.onCustomAction(PlayerService.java:1497)
at android.support.v4.media.session.MediaSessionCompat$Callback$MediaSessionCallbackApi21.onCustomAction(MediaSessionCompat.java:1814)
at android.media.session.MediaSession$CallbackMessageHandler.handleMessage(MediaSession.java:1649)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loopOnce(Looper.java:233)
at android.os.Looper.loop(Looper.java:344)
at android.app.ActivityThread.main(ActivityThread.java:8210)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:584)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1034)

STATE_BUFFERING update when play start

Today i download latest code from github. PlaybackStateCompat.STATE_BUFFERING updating after playing it must update when buffering start. PlaybackStateCompat.STATE_PLAYING and PlaybackStateCompat.STATE_BUFFERING showing same time
it was working fine before . my code is

   testMediaSession(playerClient.getMediaController());

     public void testMediaSession(MediaControllerCompat mediaController) {
    mediaController.registerCallback(new MediaControllerCompat.Callback() {
        @Override
        public void onPlaybackStateChanged(PlaybackStateCompat state) {
            switch (state.getState()) {
                case PlaybackStateCompat.STATE_BUFFERING:
                    Log.e(TAG, "STATE_BUFFERING");
                    break;

or i must use playerClient.addOnPlaybackStateChangeListener? and playerClient.addOnBufferedProgressChangeListener();?

Disable Show notification playerClient.connect

1.When playerClient.connect Notfication showing automatically . How can i disable this? .. Notification must show when call play(),
2.And also that notification not possible remove .if we call playerClient.shutdown(); or playerClient.disconnect(); its not remove
(But its removed after playing song . if call connect then disconnect() with out play notification not removes)

Media Notification Not closed

android api 33 .. after closed app Media Notification Not closed
even we called all

@Override
protected void onDestroy() {
    super.onDestroy();
    if(mPlayerClient !=null){
        mPlayerClient.stop();
        mPlayerClient.disconnect();
        mPlayerClient.shutdown();
    }
}

Still notification showing ... need to be closed manuly...pls check

I need play action request new mp3 get url

MusicItem song1 = new MusicItem.Builder()
                .setTitle("test")
                .setArtist("asd")
                .setDuration(313520)
                .setUri(url)
                .setIconUri("http://p1.music.126.net/4tTN8CnR7wG4E1cauIPCvQ==/109951163240682406.jpg")
                .build();
        BaseApp.playerClient.setPlaylist( new snow.player.playlist.Playlist.Builder()
                .append(song1)
                .build(), true);

My call application

BaseApp.playerClient = PlayerClient.newInstance(this, MyPlayerService.class);


@Override
protected MusicPlayer onCreateMusicPlayer(@NonNull Context context, @NonNull MusicItem musicItem, @NonNull Uri uri) {

    String path = uri.getLastPathSegment();
   // I need new Request and call exoplayer My method SYNC not return
    Log.e("x",uri.toString());
    return new ExoMusicPlayer(context, mProgressiveMediaSourceFactory, uri);
}

EqualizerActivity Failed resolution of: Landroidx/databinding/DataBinderMapperImpl;

Try to implement EqualizerActivity. i aaadded in AndroidManifest and PlayerService

  equaliser_button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            EqualizerActivity.start(FmRadioPlayer_Activity.this, MyPlayerService.class);
        }
    });

i get this error

java.lang.NoClassDefFoundError: Failed resolution of: Landroidx/databinding/DataBinderMapperImpl;
    at androidx.databinding.e.<clinit>(:32)
    at androidx.databinding.e.f(:284)
    at snow.player.ui.equalizer.EqualizerActivity.onCreate(:93)
    at android.app.Activity.performCreate(Activity.java:6662)
    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1118)
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2599)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2707)
    at android.app.ActivityThread.-wrap12(ActivityThread.java)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1460)
    at android.os.Handler.dispatchMessage(Handler.java:102)
    at android.os.Looper.loop(Looper.java:154)
    at android.app.ActivityThread.main(ActivityThread.java:6077)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:866)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:756)
 Caused by: java.lang.ClassNotFoundException: Didn't find class "androidx.databinding.DataBinderMapperImpl" on path: DexPathList[[zip file "/data/app/com.www.www-1/base.apk"],nativeLibraryDirectories=[/data/app/com.www.www-1/lib/x86, /data/app/com.www.www-1/base.apk!/lib/x86, /system/lib, /vendor/lib]]
    at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:56)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:380)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:312)
    at androidx.databinding.e.<clinit>(:32) 
    at androidx.databinding.e.f(:284) 
    at snow.player.ui.equalizer.EqualizerActivity.onCreate(:93) 
    at android.app.Activity.performCreate(Activity.java:6662) 
    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1118) 
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2599) 
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2707) 
    at android.app.ActivityThread.-wrap12(ActivityThread.java) 
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1460) 
    at android.os.Handler.dispatchMessage(Handler.java:102) 
    at android.os.Looper.loop(Looper.java:154) 
    at android.app.ActivityThread.main(ActivityThread.java:6077) 
    at java.lang.reflect.Method.invoke(Native Method) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:866) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:756) 

down下来编译通过 但是一运行就报错

Unable to load class 'javafx.util.Pair'.
Possible causes for this unexpected error include:
Gradle's dependency cache may be corrupt (this sometimes occurs after a network connection timeout.)

qq音乐的播放链接不能播放,用浏览器直接打开是没问题的

http://isure.stream.qqmusic.qq.com/C400002ORbbT3FynhJ.m4a?guid=2796982635&vkey=B30C73AF8CF88AF8964FCCE0D2F39348E0FCF5E4AF9208D36FDFC3634389DFEEC2AE4F48B46124491EA05D73BEA6320B26EE596588D9CBF1&uin=&fromtag=120032

错误日志:
2023-03-14 10:20:58.756 20446-20446/com.zpp.mobile.zmusic V/MediaPlayer-JNI: native_setup
2023-03-14 10:20:58.756 20446-20446/com.zpp.mobile.zmusic V/MediaPlayerNative: constructor
2023-03-14 10:20:58.756 20446-20446/com.zpp.mobile.zmusic V/MediaPlayerNative: setListener
2023-03-14 10:20:58.769 20446-20446/com.zpp.mobile.zmusic W/MediaPlayer: Couldn't open "http://isure.stream.qqmusic.qq.com/C400002ORbbT3FynhJ.m4a?guid=2796982635&vkey=B30C73AF8CF88AF8964FCCE0D2F39348E0FCF5E4AF9208D36FDFC3634389DFEEC2AE4F48B46124491EA05D73BEA6320B26EE596588D9CBF1&uin=&fromtag=120032"
java.io.FileNotFoundException: No content provider: "http://isure.stream.qqmusic.qq.com/C400002ORbbT3FynhJ.m4a?guid=2796982635&vkey=B30C73AF8CF88AF8964FCCE0D2F39348E0FCF5E4AF9208D36FDFC3634389DFEEC2AE4F48B46124491EA05D73BEA6320B26EE596588D9CBF1&uin=&fromtag=120032"
at android.content.ContentResolver.openTypedAssetFileDescriptor(ContentResolver.java:1680)
at android.content.ContentResolver.openAssetFileDescriptor(ContentResolver.java:1510)
at android.content.ContentResolver.openAssetFileDescriptor(ContentResolver.java:1427)
at android.media.MediaPlayer.attemptDataSource(MediaPlayer.java:1180)
at android.media.MediaPlayer.setDataSource(MediaPlayer.java:1152)
at snow.player.audio.MediaMusicPlayer.prepare(MediaMusicPlayer.java:185)
at snow.player.AbstractPlayer$2.accept(AbstractPlayer.java:333)
at snow.player.AbstractPlayer$2.accept(AbstractPlayer.java:322)
at io.reactivex.internal.observers.ConsumerSingleObserver.onSuccess(ConsumerSingleObserver.java:62)
at io.reactivex.internal.operators.single.SingleObserveOn$ObserveOnSingleObserver.run(SingleObserveOn.java:81)
at io.reactivex.android.schedulers.HandlerScheduler$ScheduledRunnable.run(HandlerScheduler.java:124)
at android.os.Handler.handleCallback(Handler.java:883)
at android.os.Handler.dispatchMessage(Handler.java:100)
at android.os.Looper.loop(Looper.java:237)
at android.app.ActivityThread.main(ActivityThread.java:8167)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:496)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1100)
2023-03-14 10:20:58.782 20446-20446/com.zpp.mobile.zmusic V/MediaPlayerNative: setVideoSurfaceTexture
2023-03-14 10:20:58.782 20446-20446/com.zpp.mobile.zmusic V/MediaPlayerNative: prepareAsync
2023-03-14 10:20:58.785 20446-21810/com.zpp.mobile.zmusic V/MediaPlayerNative: message received msg=100, ext1=1, ext2=-2147483648
2023-03-14 10:20:58.785 20446-21810/com.zpp.mobile.zmusic E/MediaPlayerNative: error (1, -2147483648)
2023-03-14 10:20:58.807 20446-20446/com.zpp.mobile.zmusic E/MediaPlayer: Error (1,-2147483648)
2023-03-14 10:20:58.807 20446-20446/com.zpp.mobile.zmusic E/MediaMusicPlayer: MediaPlayer Error[what: 1, extra: -2147483648]
2023-03-14 10:20:58.807 20446-20446/com.zpp.mobile.zmusic E/MusicPlayer: errorCode:2
2023-03-14 10:20:58.808 20446-20446/com.zpp.mobile.zmusic V/MediaPlayer: resetDrmState: mDrmInfo=null mDrmProvisioningThread=null mPrepareDrmInProgress=false mActiveDrmScheme=false
2023-03-14 10:20:58.808 20446-20446/com.zpp.mobile.zmusic V/MediaPlayer: cleanDrmObj: mDrmObj=null mDrmSessionId=null
2023-03-14 10:20:58.808 20446-20446/com.zpp.mobile.zmusic V/MediaPlayer-JNI: release
2023-03-14 10:20:58.808 20446-20446/com.zpp.mobile.zmusic V/MediaPlayerNative: setListener
2023-03-14 10:20:58.808 20446-20446/com.zpp.mobile.zmusic V/MediaPlayerNative: disconnect
2023-03-14 10:20:58.814 20446-20446/com.zpp.mobile.zmusic V/MediaPlayerNative: destructor
2023-03-14 10:20:58.815 20446-20446/com.zpp.mobile.zmusic V/MediaPlayerNative: disconnect
2023-03-14 10:21:01.236 20446-20446/com.zpp.mobile.zmusic I/ViewRootImpl@7188fca[SongSheetInfo]: MSG_WINDOW_FOCUS_CHANGED 0 1
2023-03-14 10:21:01.236 20446-20446/com.zpp.mobile.zmusic D/InputMethodManager: prepareNavigationBarInfo() DecorView@3349128[SongSheetInfo]
2023-03-14 10:21:01.236 20446-20446/com.zpp.mobile.zmusic D/InputMethodManager: getNavigationBarColor() -855310
2023-03-14 10:21:02.513 20446-20446/com.zpp.mobile.zmusic I/ViewRootImpl@7188fca[SongSheetInfo]: MSG_WINDOW_FOCUS_CHANGED 1 1
2023-03-14 10:21:02.513 20446-20446/com.zpp.mobile.zmusic D/InputMethodManager: prepareNavigationBarInfo() DecorView@3349128[SongSheetInfo]
2023-03-14 10:21:02.513 20446-20446/com.zpp.mobile.zmusic D/InputMethodManager: getNavigationBarColor() -855310

Cant create playlist

Cannot resolve symbol 'MusicItemBuilder'

  ` MusicItem song1 = new MusicItemBuilder(313520, "http://music.163.com/song/media/outer/url?id=4875306")
            .setTitle("逍遥叹")
            .setArtist("胡歌")
            .setIconUri("http://p1.music.126.net/4tTN8CnR7wG4E1cauIPCvQ==/109951163240682406.jpg")
            .build();`

How i create playlist?

Also create clear demo

if we import your project there is error in demo debug

 `Unable to load class 'javafx.util.Pair'.
  Possible causes for this unexpected error include:
 Gradle's dependency cache may be corrupt (this sometimes occurs after a network connection timeout.)
 Re-download dependencies and sync project (requires network)`

MyFactory Conected with where?

Bro I just Import your library to my app.

 `implementation project(path: ':player')
implementation project(path: ':exo')`

`include ':exo'
 include ':player'`

I also added MyFactory.class and codes. but MyFactory conected with nothing .. So again m3u8 Not work and also redirect urls not work..

But working fine if i import github library separately .. in you library MyFactory.class conected with your doc pages ..not code...

If i add to my app where I should conect MyFactory.class ?

忽略音频焦点会闪退,闪退后无法播放音频,需要重新启用音频焦点才行

java.lang.SecurityException: listen
at android.os.Parcel.createExceptionOrNull(Parcel.java:2441)
at android.os.Parcel.createException(Parcel.java:2425)
at android.os.Parcel.readException(Parcel.java:2408)
at android.os.Parcel.readException(Parcel.java:2350)
at com.android.internal.telephony.ITelephonyRegistry$Stub$Proxy.listenWithEventList(ITelephonyRegistry.java:1036)
at android.telephony.TelephonyRegistryManager.listenFromListener(TelephonyRegistryManager.java:250)
at android.telephony.TelephonyManager.listen(TelephonyManager.java:6064)
at snow.player.helper.PhoneCallStateHelper.registerCallStateListener(PhoneCallStateHelper.java:65)
at snow.player.AbstractPlayer.requestAudioFocusFailed(AbstractPlayer.java:1413)
at snow.player.AbstractPlayer.notifyIgnoreAudioFocusChanged(AbstractPlayer.java:1405)
at snow.player.PlayerService.setIgnoreAudioFocus(PlayerService.java:667)
at snow.player.PlayerManager__ChannelHelper$Dispatcher.dispatch(PlayerManager__ChannelHelper.java:130)
at channel.helper.DispatcherUtil$1.dispatch(DispatcherUtil.java:15)
at channel.helper.pipe.CustomActionPipe.dispatch(CustomActionPipe.java:57)
at snow.player.PlayerService.onCustomAction(PlayerService.java:1331)
at snow.player.PlayerService$MediaSessionCallback.onCustomAction(PlayerService.java:1497)
at android.support.v4.media.session.MediaSessionCompat$Callback$MediaSessionCallbackApi21.onCustomAction(MediaSessionCompat.java:1814)
at android.media.session.MediaSession$CallbackMessageHandler.handleMessage(MediaSession.java:1649)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loopOnce(Looper.java:233)
at android.os.Looper.loop(Looper.java:344)
at android.app.ActivityThread.main(ActivityThread.java:8210)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:584)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1034)
Caused by: android.os.RemoteException: Remote stack trace:
at com.android.internal.telephony.TelephonyPermissions.enforceCarrierPrivilege(TelephonyPermissions.java:634)
at com.android.internal.telephony.TelephonyPermissions.checkReadPhoneState(TelephonyPermissions.java:149)
at com.android.internal.telephony.TelephonyPermissions.checkCallingOrSelfReadPhoneState(TelephonyPermissions.java:94)
at com.android.server.TelephonyRegistry.checkListenerPermission(TelephonyRegistry.java:3226)
at com.android.server.TelephonyRegistry.listen(TelephonyRegistry.java:1030)

Bug Cannot initialize effect engine

my error

2020-12-18 16:25:22.653 24951-24951/com.E/AndroidRuntime: FATAL EXCEPTION: main
	Process: com., PID: 24951
	java.lang.RuntimeException: Cannot initialize effect engine for type: 0bed4300-ddd6-11db-8f34-0002a5d5c51b Error: -3
		at android.media.audiofx.AudioEffect.<init>(AudioEffect.java:468)
		at android.media.audiofx.Equalizer.<init>(Equalizer.java:139)
		at snow.player.ui.equalizer.AndroidAudioEffectManager.attachAudioEffect(AndroidAudioEffectManager.java:72)
		at snow.player.PlayerService.attachAudioEffect(PlayerService.java:517)
		at snow.player.PlayerService$PlayerImp.attachAudioEffect(PlayerService.java:1316)
		at snow.player.AbstractPlayer$4.onPrepared(AbstractPlayer.java:391)
		at snow.player.exo.ExoMusicPlayer$1.onReady(ExoMusicPlayer.java:118)
		at snow.player.exo.ExoMusicPlayer$1.onPlaybackStateChanged(ExoMusicPlayer.java:102)
		at com.google.android.exoplayer2.ExoPlayerImpl$PlaybackInfoUpdate.lambda$run$7$ExoPlayerImpl$PlaybackInfoUpdate(ExoPlayerImpl.java:1447)
		at com.google.android.exoplayer2.-$$Lambda$ExoPlayerImpl$PlaybackInfoUpdate$Kzo2-1gqk6OImqd4IyiYsdO2xc8.invokeListener(Unknown Source:2)
		at com.google.android.exoplayer2.BasePlayer$ListenerHolder.invoke(BasePlayer.java:279)
		at com.google.android.exoplayer2.ExoPlayerImpl.invokeAll(ExoPlayerImpl.java:1496)
		at com.google.android.exoplayer2.ExoPlayerImpl.access$100(ExoPlayerImpl.java:56)
		at com.google.android.exoplayer2.ExoPlayerImpl$PlaybackInfoUpdate.run(ExoPlayerImpl.java:1445)
		at com.google.android.exoplayer2.ExoPlayerImpl.notifyListeners(ExoPlayerImpl.java:1326)
		at com.google.android.exoplayer2.ExoPlayerImpl.updatePlaybackInfo(ExoPlayerImpl.java:954)
		at com.google.android.exoplayer2.ExoPlayerImpl.handlePlaybackInfo(ExoPlayerImpl.java:918)
		at com.google.android.exoplayer2.ExoPlayerImpl.lambda$new$0$ExoPlayerImpl(ExoPlayerImpl.java:162)
		at com.google.android.exoplayer2.-$$Lambda$ExoPlayerImpl$Krt_XK5S7OaAWWQo8WMLuiuwNGE.run(Unknown Source:4)
		at android.os.Handler.handleCallback(Handler.java:883)
		at android.os.Handler.dispatchMessage(Handler.java:100)
		at android.os.Looper.loop(Looper.java:224)
		at android.app.ActivityThread.main(ActivityThread.java:7562)
		at java.lang.reflect.Method.invoke(Native Method)
		at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:539)
		at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:950)

my service

  @Nullable
	@Override
	protected AudioEffectManager onCreateAudioEffectManager() {
		return new AndroidAudioEffectManager();
	}

We need Some More Function

  1. stop() or disconnect() not closing notification also even if we closed app (if we already stopped) notification not closed

  2. Need One more icon inside notification called stop or close
    when click stop or close icon must service stopped and also must notification close

  3. Need enable disable function for remove progress bar inside Notification. ( Live Stream no need this i think only play from local stored mp3 need this progress bar ??)

  4. Now Song playing time if we receive call its muted that right working fine .. But we need enable disable function for on call finished start playing automatically .. if user enable it it resume automatically or user need enable manually..

Thank you For you hard work ..

moveMusicItem 移动歌曲位置有问题啊。

复现方法:将一首处于当前播放歌曲下方的item移动到当前播放歌曲的上方,再把一首处于当前播放歌曲上方的item移动到当前播放歌曲的下方,然后点击下一首,播放的还是当前播放的歌曲。

寻求一下帮助。

我用ijkplayer写一个自定义播放器,但是存在一些问题:一开始播放需要点击两次才能正常播放,切换音质后也存在该问题。

代码
`public class IjkMusicPlayer extends AbstractMusicPlayer {

private String TAG = "JkPlayer";
private IjkMediaPlayer exoMediaPlayer;

private final Context mContext;
private final Uri mUri;

@Nullable
private OnCompletionListener mCompletionListener;

@Nullable
private OnStalledListener mStalledListener;

@Nullable
private OnErrorListener mErrorListener;
@Nullable
private OnRepeatListener mRepeatListener;

private boolean mStalled;
private boolean mInvalid;
private boolean mLooping;

private boolean mPreparing;
private boolean mPlayerReady;

public IjkMusicPlayer(Context context, Uri uri) {

    mContext = context;
    mUri = uri;

    exoMediaPlayer = new IjkMediaPlayer();
    mInvalid = false;
    exoMediaPlayer.setWakeMode(context, PowerManager.PARTIAL_WAKE_LOCK);
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        exoMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "soundtouch", 0);
    }else{
        exoMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "soundtouch", 1);
    }
    exoMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_FORMAT,"analyzemaxduration",100L);
    exoMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "start-on-prepared", 0);
    exoMediaPlayer.setOption( IjkMediaPlayer.OPT_CATEGORY_FORMAT, "dns_cache_clear", 1);

    exoMediaPlayer.setOnErrorListener(new IMediaPlayer.OnErrorListener() {
        @Override
        public boolean onError(IMediaPlayer iMediaPlayer, int i, int i1) {
            Log.e(TAG, "MediaPlayer Error[what: " + i + ", extra: " + i1 + "]");

            setInvalid();

            if (mErrorListener != null) {
                mErrorListener.onError(IjkMusicPlayer.this, toErrorCode(i1));
            }
            return true;
        }
    });

    exoMediaPlayer.setOnInfoListener(new IMediaPlayer.OnInfoListener() {
        @Override
        public boolean onInfo(IMediaPlayer iMediaPlayer, int i, int i1) {
            switch (i) {
                case IMediaPlayer.MEDIA_INFO_BUFFERING_START:
                    setStalled(true);
                    return true;
                case IMediaPlayer.MEDIA_INFO_BUFFERING_END:
                    setStalled(false);
                    return true;
            }
            return false;
        }
    });

    exoMediaPlayer.setOnCompletionListener(new IMediaPlayer.OnCompletionListener() {
        @Override
        public void onCompletion(IMediaPlayer iMediaPlayer) {
            if (mLooping) {
                iMediaPlayer.start();
                notifyOnRepeat();
                return;
            }

            notifyOnComplete();
        }
    });
}

private int toErrorCode(int extra) {
    switch (extra) {
        case IMediaPlayer.MEDIA_ERROR_IO:    
        case IMediaPlayer.MEDIA_ERROR_TIMED_OUT:
            return ErrorCode.DATA_LOAD_FAILED;
        case IMediaPlayer.MEDIA_ERROR_MALFORMED:  
        case IMediaPlayer.MEDIA_ERROR_UNSUPPORTED:
            return ErrorCode.PLAYER_ERROR;
        default:
            return ErrorCode.UNKNOWN_ERROR;
    }
}

private void notifyOnRepeat() {
    if (mRepeatListener != null) {
        mRepeatListener.onRepeat(this);
    }
}

private void notifyOnComplete() {
    if (mCompletionListener != null) {
        mCompletionListener.onCompletion(this);
    }
}

private void setStalled(boolean stalled) {
    mStalled = stalled;
    if (mStalledListener != null) {
        mStalledListener.onStalled(mStalled);
    }
}

private synchronized void setInvalid() {
    mInvalid = true;
}

@Override
public void startEx() {
    Log.e(TAG,"播放");
    exoMediaPlayer.start();
}

@Override
public void pauseEx() {
    exoMediaPlayer.pause();
}

@Override
public void stopEx() {
    exoMediaPlayer.stop();
}

@Override
public void releaseEx() {
    setInvalid();
    if (exoMediaPlayer != null) {
        exoMediaPlayer.reset();
        exoMediaPlayer.release();
        exoMediaPlayer = null;
    }
}

@Override
public void prepare() throws Exception {
    if (isInvalid()) {
        return;
    }
    try {
        exoMediaPlayer.setDataSource(mContext, mUri);
        exoMediaPlayer.prepareAsync();
    } catch (Exception e) {
        setInvalid();
        throw e;
    }
}

@Override
public void setLooping(boolean looping) {
    mLooping = looping;
    exoMediaPlayer.setLooping(looping);
}

@Override
public boolean isLooping() {
    return exoMediaPlayer.isLooping();
}

@Override
public boolean isStalled() {
    return mStalled;
}

@Override
public boolean isPlaying() {
    return exoMediaPlayer.isPlaying();
}

@Override
public int getDuration() {
    return (int) exoMediaPlayer.getDuration();
}

@Override
public int getProgress() {
    return (int) exoMediaPlayer.getCurrentPosition();
}

@Override
public void seekTo(int pos) {
    exoMediaPlayer.seekTo(pos);
}

@Override
public void setVolume(float leftVolume, float rightVolume) {
    exoMediaPlayer.setVolume(leftVolume, rightVolume);
}

@Override
public void setSpeed(float speed) {
    exoMediaPlayer.setSpeed(speed);
}

@Override
public boolean isInvalid() {
    return mInvalid;
}

@Override
public int getAudioSessionId() {
    return exoMediaPlayer.getAudioSessionId();
}

@Override
public void setOnPreparedListener(@Nullable OnPreparedListener listener) {
    if (listener == null) {
        exoMediaPlayer.setOnPreparedListener(null);
        return;
    }

    exoMediaPlayer.setOnPreparedListener(new IMediaPlayer.OnPreparedListener() {
        @Override
        public void onPrepared(IMediaPlayer iMediaPlayer) {
            listener.onPrepared(IjkMusicPlayer.this);
        }
    });
}

@Override
public void setOnCompletionListener(@Nullable OnCompletionListener listener) {
    mCompletionListener = listener;
}

@Override
public void setOnRepeatListener(@Nullable OnRepeatListener listener) {
    mRepeatListener = listener;
}

@Override
public void setOnSeekCompleteListener(@Nullable OnSeekCompleteListener listener) {
    if (listener == null) {
        exoMediaPlayer.setOnSeekCompleteListener(null);
        return;
    }

    exoMediaPlayer.setOnSeekCompleteListener(new IMediaPlayer.OnSeekCompleteListener() {
        @Override
        public void onSeekComplete(IMediaPlayer iMediaPlayer) {
            listener.onSeekComplete(IjkMusicPlayer.this);
        }
    });
}

@Override
public void setOnStalledListener(@Nullable OnStalledListener listener) {
    mStalledListener = listener;
}

@Override
public void setOnBufferingUpdateListener(@Nullable OnBufferingUpdateListener listener) {
    if (listener == null) {
        exoMediaPlayer.setOnBufferingUpdateListener(null);
        return;
    }

    exoMediaPlayer.setOnBufferingUpdateListener(new IMediaPlayer.OnBufferingUpdateListener() {
        @Override
        public void onBufferingUpdate(IMediaPlayer iMediaPlayer, int i) {
            listener.onBufferingUpdate(IjkMusicPlayer.this, i, true);
        }
    });
}

@Override
public void setOnErrorListener(@Nullable OnErrorListener listener) {
    mErrorListener = listener;
}

}`

Notification Onclick

how can i implement If notification onclick open activity? now its onclick nothing .. it must be open Mainactivity?

How can we add PlaybackStateCompat.ACTION_STOP ? or is missing?

*Important proguard Issue

I thing we have proguard issue .. pls add proguard details what we need to add.
my app playing good with out proguard. if i add proguard its not playing

在线音乐如果获取时长

我这边音乐不知道时长。需要播放获取后写入。有什么办法可以和这个库结合吗。我发现时长都是需要预先设置

Android 13 黑屏音乐过一会就会停止播放

手机型号:三星s20国行
系统 Android 13
表现:app在后台时,黑屏一会音乐停止,重新打开app会恢复 app不在后台是只需亮屏就能恢复播放
点击清理消息时还会把音乐的Notification清理掉。。 但是在媒体管理里能看到正在播放的歌曲

Android Latest Version Notification Problem

Android Notification problem

android 30

  1. Notification icon not showing
  2. Player Notification not possible remove .. after stopped and exit app media notification still showing.

android 32

  1. Notification icon not showing

Custom Notification icon

It is possible change Notification icons? i want use my won icons for play and pause and next privies icons.
Can you add this function?

switch playmode int java.lang.Integer.intValue()

public LiveData<Integer> getPlayModeDrawable() {
		if (!mInitialized) {
			throw new IllegalStateException("NavigationViewModel not init yet.");
		}

		return Transformations.map(mPlayerViewModel.getPlayMode(), playMode -> {
			switch (playMode) {
				case PLAYLIST_LOOP:
					return R.drawable.ic_play_mode_playlist_loop;
				case LOOP:
					return R.drawable.ic_play_mode_loop;
				case SHUFFLE:
					return R.drawable.ic_play_mode_shuffle;
			}

			return R.drawable.ic_play_mode_playlist_loop;
		});
	}

add my modelview function and call xml file

 <ImageButton
							android:id="@+id/switchmode"
							android:layout_width="wrap_content"
							android:layout_height="wrap_content"
							android:onClick="@{() -> modelim.switchPlayMode()}"
							android:layout_weight="1"
							android:src="@{modelim.getPlayModeDrawable}"
						   />

ERROR LOG

  java.lang.RuntimeException: Failed to call observer method
		at androidx.lifecycle.ClassesInfoCache$MethodReference.invokeCallback(ClassesInfoCache.java:226)
		at androidx.lifecycle.ClassesInfoCache$CallbackInfo.invokeMethodsForEvent(ClassesInfoCache.java:194)
		at androidx.lifecycle.ClassesInfoCache$CallbackInfo.invokeCallbacks(ClassesInfoCache.java:185)
		at androidx.lifecycle.ReflectiveGenericLifecycleObserver.onStateChanged(ReflectiveGenericLifecycleObserver.java:37)
		at androidx.lifecycle.LifecycleRegistry$ObserverWithState.dispatchEvent(LifecycleRegistry.java:361)
		at androidx.lifecycle.LifecycleRegistry.forwardPass(LifecycleRegistry.java:300)
		at androidx.lifecycle.LifecycleRegistry.sync(LifecycleRegistry.java:339)
		at androidx.lifecycle.LifecycleRegistry.moveToState(LifecycleRegistry.java:145)
		at androidx.lifecycle.LifecycleRegistry.handleLifecycleEvent(LifecycleRegistry.java:131)
		at androidx.fragment.app.Fragment.performStart(Fragment.java:2735)
		at androidx.fragment.app.FragmentStateManager.start(FragmentStateManager.java:365)
		at androidx.fragment.app.FragmentManager.moveToState(FragmentManager.java:1194)
		at androidx.fragment.app.FragmentManager.moveToState(FragmentManager.java:1356)
		at androidx.fragment.app.FragmentManager.moveFragmentToExpectedState(FragmentManager.java:1434)
		at androidx.fragment.app.FragmentManager.moveToState(FragmentManager.java:1497)
		at androidx.fragment.app.FragmentManager.dispatchStateChange(FragmentManager.java:2625)
		at androidx.fragment.app.FragmentManager.dispatchStart(FragmentManager.java:2583)
		at androidx.fragment.app.Fragment.performStart(Fragment.java:2739)
		at androidx.fragment.app.FragmentStateManager.start(FragmentStateManager.java:365)
		at androidx.fragment.app.FragmentManager.moveToState(FragmentManager.java:1194)
		at androidx.fragment.app.FragmentManager.moveToState(FragmentManager.java:1356)
		at androidx.fragment.app.FragmentManager.moveFragmentToExpectedState(FragmentManager.java:1434)
		at androidx.fragment.app.FragmentManager.moveToState(FragmentManager.java:1497)
		at androidx.fragment.app.FragmentManager.dispatchStateChange(FragmentManager.java:2625)
		at androidx.fragment.app.FragmentManager.dispatchStart(FragmentManager.java:2583)
		at androidx.fragment.app.FragmentController.dispatchStart(FragmentController.java:258)
		at androidx.fragment.app.FragmentActivity.onStart(FragmentActivity.java:550)
		at androidx.appcompat.app.AppCompatActivity.onStart(AppCompatActivity.java:210)
		at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1433)
		at android.app.Activity.performStart(Activity.java:7923)
		at android.app.ActivityThread.handleStartActivity(ActivityThread.java:3332)
		at android.app.servertransaction.TransactionExecutor.performLifecycleSequence(TransactionExecutor.java:221)
		at android.app.servertransaction.TransactionExecutor.cycleToPath(TransactionExecutor.java:201)
		at android.app.servertransaction.TransactionExecutor.executeLifecycleState(TransactionExecutor.java:173)
		at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:97)
		at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2044)
		at android.os.Handler.dispatchMessage(Handler.java:107)
		at android.os.Looper.loop(Looper.java:224)
		at android.app.ActivityThread.main(ActivityThread.java:7562)
		at java.lang.reflect.Method.invoke(Native Method)
		at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:539)
		at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:950)
	 Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'int java.lang.Integer.intValue()' on a null object reference
		at com.mm.musicmode.databinding.FragmentHomeBindingImpl.executeBindings(FragmentHomeBindingImpl.java:408)
		at androidx.databinding.ViewDataBinding.executeBindingsInternal(ViewDataBinding.java:473)
		at androidx.databinding.ViewDataBinding.executePendingBindings(ViewDataBinding.java:445)
2020-12-14 20:22:20.150 23973-23973/com.mm.musicmode E/AndroidRuntime:     at androidx.databinding.ViewDataBinding$OnStartListener.onStart(ViewDataBinding.java:1687)
		at java.lang.reflect.Method.invoke(Native Method)
		at androidx.lifecycle.ClassesInfoCache$MethodReference.invokeCallback(ClassesInfoCache.java:216)
			... 41 more

getPlayProgress 使用问题

您好,我想用一个定时器去读取当前进度,但是播放时读取的时间都是一样,点击暂停后才更新

       Handler handler= new Handler();
        Runnable runnable= new Runnable(){
            @Override
            public void run() {
                int time =  mPlayerClient.getPlayProgress();
                Log.d("runnable", "time" + time);
                handler.postDelayed(this, 1000);
            }
        };
        handler.postDelayed(runnable, 1000);

We need pass Mediaitem inside MyFactory

We need use More conditions inside MyFactory.class

For example in my App we using three kind of urls
1.Normal
2. Custom User agent //Some urls need pass special user agent
2. Need Authentication // Some Urls need Login

Right now we access only "url" inside MyFactory . We meed access all MediaItem inside MyFactory

ex We need like this

 `  public MusicPlayer createMusicPlayer(@NonNull Context context, @NonNull **MusicItem musicItem**) {
        if(musicItem.type.Contain("useragent1"){
              useragent = "bbbb";
      ]else{
         useragent = "ccc";
     }
     if(musicItem.type.Contain("needlogin"){
          we can use okhttp authentication 

May be we can use "extra" for or we need "Type" and "Categories " for inside model.. I Bellevue you understand

Fatal Exception: java.lang.IndexOutOfBoundsException

I have this in firebase crash list . this one is your library problem or ourside problem?

  Fatal Exception: java.lang.IndexOutOfBoundsException: Index: 45, Size: 24
   at java.util.ArrayList.get(ArrayList.java:437)
   at snow.player.playlist.Playlist.get(Playlist.java:2)
   at snow.player.AbstractPlayer.playPause(AbstractPlayer.java:2)
   at snow.player.Player__ChannelHelper$Dispatcher.dispatch(Player__ChannelHelper.java:86)
   at channel.helper.DispatcherUtil$1.dispatch(DispatcherUtil.java:19)
   at channel.helper.pipe.CustomActionPipe.dispatch(CustomActionPipe.java:3)
   at snow.player.PlayerService.onCustomAction(PlayerService.java:3)
   at snow.player.PlayerService$MediaSessionCallback.onCustomAction(PlayerService.java:2)
   at android.support.v4.media.session.MediaSessionCompat$Callback$MediaSessionCallbackApi21.onCustomAction(MediaSessionCompat.java:257)
   at android.media.session.MediaSession$CallbackMessageHandler.handleMessage(MediaSession.java:1635)
   at android.os.Handler.dispatchMessage(Handler.java:107)
   at android.os.Looper.loop(Looper.java:225)
   at android.app.ActivityThread.main(ActivityThread.java:7563)
   at java.lang.reflect.Method.invoke(Method.java)
   at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:539)
   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:994)

Need Clear Playlist

If we add extra item inside playlist its not update when open app or setPlaylist. Its playing old play list only .. we need clear playlist before adding setPlaylist. We using like this from arraylist

 `   private Playlist createPlaylist() {
    return new Playlist.Builder()
            .appendAll(fmradiomodellist)
            .build();
}`

[Feature Request] Need Mute audio on call

Need Mute audio on Call received. Also need enable disable function

  1. On call receive Need Mute audio
  2. auto play after call finished .. need enable disable function

1.Mute all other incoming sound need enable disable function ( Whats App call message and if open other audio app)
2.auto play after mute finished .. need true/ false function

为什么有些网络歌曲没播放完就直接播放下一首了

网易云:鹿晗的《海底》无损音质
会输出这个日志:W/MediaHTTPConnection: readAt 23568698 / 24262 => java.net.ProtocolException: unexpected end of stream

另外用LiveProgress实时获取播放进度
进度是秒单位的。
而seekTo更新播放进度是毫秒单位的。
有点不严谨,秒单位在歌词滚动这功能也会有点不适配。这有点难受。

Some https Urls not work

https://stream.zenolive.com/7w4w5kt7hqzuv.aac
This Url From Very popular and open free Audio Stream Creator site called https://zeno.fm/ working fine without https.
Its only hapening old apis like api 18

 `Caused by: javax.net.ssl.SSLHandshakeException: java.security.cert.CertPathValidatorException: Trust anchor for certification path not found.`

We already using enableTls12OnPreLollipop inside MyFactory All other https working fine

 ` OkHttpClient.Builder builder = new OkHttpClient.Builder()
                .followRedirects(true)
                .followSslRedirects(true)
                .retryOnConnectionFailure(true)
                .connectTimeout(10, TimeUnit.SECONDS)
                .writeTimeout(20, TimeUnit.SECONDS)
                .readTimeout(20, TimeUnit.SECONDS);
        OkHttpUtil.enableTls12OnPreLollipop(builder);
       httpDataSourceFactory = new OkHttpDataSourceFactory(builder.build(), "xxx-xxx");`

Need Update Library

Exoplayer changed to Meida3 .. also latest exoplayer only support api 33 only ... we need update this library .

  1. When using Api33 Cont Use custum Media Notification bar.. pls check it..

r2.19.0 Latest
This is the last planned release of the com.google.android.exoplayer2 artifacts. This project is now deprecated. All users should migrate to androidx.media3 (which contains the same ExoPlayer code). See the migration guide for more details, including a script to help with the migration.

thank you

PlayerViewModel Missing Meidaitems

If i want get current playing media item details i need user PlayerViewModel Right? But Using PlayerViewModel we cant get all music items. Missing "musicId", "album" We need it for Add to favorite list ..

or There is any onother way to get Current playing Items? Or you can create function called something like this

`currentmediaitem( Mediaitem mediaitem){
}`

Fatal Exception: android.app.ForegroundServiceStartNotAllowedException

   `Fatal Exception: android.app.ForegroundServiceStartNotAllowedException: Service.startForeground() not allowed due to mAllowStartForeground false: service com.gggggg.ggggg/.MyPlayerService
   at android.app.ForegroundServiceStartNotAllowedException$1.createFromParcel(ForegroundServiceStartNotAllowedException.java:54)
   at android.app.ForegroundServiceStartNotAllowedException$1.createFromParcel(ForegroundServiceStartNotAllowedException.java:50)
   at android.os.Parcel.readParcelable(Parcel.java:3345)
   at android.os.Parcel.createExceptionOrNull(Parcel.java:2432)
   at android.os.Parcel.createException(Parcel.java:2421)
   at android.os.Parcel.readException(Parcel.java:2404)
   at android.os.Parcel.readException(Parcel.java:2346)
   at android.app.IActivityManager$Stub$Proxy.setServiceForeground(IActivityManager.java:8040)
   at android.app.Service.startForeground(Service.java:733)
   at snow.player.PlayerService.startForeground(PlayerService.java:45)
   at snow.player.PlayerService.updateNotificationView(PlayerService.java:32)
   at snow.player.PlayerService$3.onPlaying(PlayerService.java:2)
   at snow.player.AbstractPlayer.notifyPlaying(AbstractPlayer.java:4)
   at snow.player.AbstractPlayer.play(AbstractPlayer.java:78)
   at snow.player.AbstractPlayer$7.onSeekComplete(AbstractPlayer.java:42)
   at snow.player.exo.ExoMusicPlayer$1.onPositionDiscontinuity(ExoMusicPlayer.java:19)
   at com.google.android.exoplayer2.ExoPlayerImpl.lambda$updatePlaybackInfo$13(ExoPlayerImpl.java:1)
   at com.google.android.exoplayer2.ExoPlayerImpl$$InternalSyntheticLambda$0$1d3756c78b6d6b7ece141d7c1e9a6465b69ea5798e59ea3803cb705ea4cacb60$1.invoke(ExoPlayerImpl.java:1)
   at com.google.android.exoplayer2.util.ListenerSet$ListenerHolder.invoke(ListenerSet.java:4)
   at com.google.android.exoplayer2.util.ListenerSet.lambda$queueEvent$0(ListenerSet.java:4)
   at com.google.android.exoplayer2.util.ListenerSet$$InternalSyntheticLambda$1$4aa6d67c50ced20c53fd0cecd314136314e77eb5e787a34f9137864aa48c8e5a$0.run(ListenerSet.java:4)
   at com.google.android.exoplayer2.util.ListenerSet.flushEvents(ListenerSet.java:66)
   at com.google.android.exoplayer2.ExoPlayerImpl.updatePlaybackInfo(ExoPlayerImpl.java:10)
   at com.google.android.exoplayer2.ExoPlayerImpl.handlePlaybackInfo(ExoPlayerImpl.java:9)
   at com.google.android.exoplayer2.ExoPlayerImpl$$InternalSyntheticLambda$1$c21d15d1115b763b806454db59b3e976fd0126920652a5d519869fbd815a1094$0.run$bridge(ExoPlayerImpl.java:9)
   at android.os.Handler.handleCallback(Handler.java:938)
   at android.os.Handler.dispatchMessage(Handler.java:99)
   at android.os.Looper.loopOnce(Looper.java:226)
   at android.os.Looper.loop(Looper.java:313)
   at android.app.ActivityThread.main(ActivityThread.java:8641)
   at java.lang.reflect.Method.invoke(Method.java)
   at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:567)
   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1133)`

MyPlayerService code is

 `public class MyPlayerService extends PlayerService {
  OkHttpDataSource.Factory OkhttpDataSourceFactory;
   @Override
  public void onCreate() {
    super.onCreate();
    SharedPreferences mPrefs = getSharedPreferences("FmRadio2", MODE_PRIVATE);

    //setMaxIDLETime(10);
}

@Nullable
@Override
public NotificationView onCreateNotificationView() {
    return new MyCustomNotificationView();
}

@Nullable
@Override
protected AudioManager.OnAudioFocusChangeListener onCreateAudioFocusChangeListener() {
    return new AudioManager.OnAudioFocusChangeListener() {
        @Override
        public void onAudioFocusChange(int focusChange) {
            Log.e("DEBUG--", "Audio Focus Changed: " + focusChange);
        }
    };
}

@NonNull
@Override
protected MusicPlayer onCreateMusicPlayer(@NonNull Context context, @NonNull MusicItem musicItem, @NonNull Uri uri) {
    String path = uri.getLastPathSegment();
    OkHttpClient.Builder builder = new OkHttpClient.Builder()
            .followRedirects(true)
            .followSslRedirects(true)
            .retryOnConnectionFailure(true)
            .connectTimeout(10, TimeUnit.SECONDS)
            .writeTimeout(10, TimeUnit.SECONDS)
            .readTimeout(10, TimeUnit.SECONDS);

    OkHttpClient okHttpClient = builder.build();
    
    OkhttpDataSourceFactory = new OkHttpDataSource.Factory(
            request -> {
                Request rq = new Request.Builder(request)
                        // Note: must add head: 'user-agent'
                        .addHeader("user-agent", Util.getUserAgent(context, "xxx-xxx"))
                        .build();
                return okHttpClient.newCall(rq);
            }
    );

    DefaultDataSource.Factory dataSourceFactory = new DefaultDataSource.Factory(this, OkhttpDataSourceFactory);
    ProgressiveMediaSource.Factory mProgressiveMediaSourceFactory = new ProgressiveMediaSource.Factory(dataSourceFactory);
    HlsMediaSource.Factory mHlsMediaSourceFactory = new HlsMediaSource.Factory(dataSourceFactory);

    if (path != null && path.endsWith(".m3u8")) {
        return new ExoMusicPlayer(context, mHlsMediaSourceFactory, uri);
    }else{
        return new ExoMusicPlayer(context, mProgressiveMediaSourceFactory, uri);
    }
}

}`

Note: branches vertion
https://github.com/jrfeng/snow/tree/upgrade-dependencies

Android 14 Error: One of RECEIVER_EXPORTED or RECEIVER_NOT_EXPORTED should be specified when a receiver isn't being registered exclusively for system broadcasts

I'm running in my Android 14 Emulator, and got this error when playing Playlist:

                 Process: com.mukhtarz.appquran, PID: 10142
                 java.lang.RuntimeException: Unable to create service com.mukhtarz.appquran.service.player.MyPlayerService: java.lang.SecurityException: com.mukhtarz.appquran: One of RECEIVER_EXPORTED or RECEIVER_NOT_EXPORTED should be specified when a receiver isn't being registered exclusively for system broadcasts
                     at android.app.ActivityThread.handleCreateService(ActivityThread.java:4663)
                     at android.app.ActivityThread.-$$Nest$mhandleCreateService(Unknown Source:0)
                     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2264)
                     at android.os.Handler.dispatchMessage(Handler.java:106)
                     at android.os.Looper.loopOnce(Looper.java:205)
                     at android.os.Looper.loop(Looper.java:294)
                     at android.app.ActivityThread.main(ActivityThread.java:8176)
                     at java.lang.reflect.Method.invoke(Native Method)
                     at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:552)
                     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:971)
                 Caused by: java.lang.SecurityException: com.mukhtarz.appquran: One of RECEIVER_EXPORTED or RECEIVER_NOT_EXPORTED should be specified when a receiver isn't being registered exclusively for system broadcasts
                     at android.os.Parcel.createExceptionOrNull(Parcel.java:3057)
                     at android.os.Parcel.createException(Parcel.java:3041)
                     at android.os.Parcel.readException(Parcel.java:3024)
                     at android.os.Parcel.readException(Parcel.java:2966)
                     at android.app.IActivityManager$Stub$Proxy.registerReceiverWithFeature(IActivityManager.java:5684)
                     at android.app.ContextImpl.registerReceiverInternal(ContextImpl.java:1852)
                     at android.app.ContextImpl.registerReceiver(ContextImpl.java:1792)
                     at android.app.ContextImpl.registerReceiver(ContextImpl.java:1780)
                     at android.content.ContextWrapper.registerReceiver(ContextWrapper.java:755)
                     at snow.player.PlayerService.initCustomActionReceiver(PlayerService.java:482)
                     at snow.player.PlayerService.onCreate(PlayerService.java:202)
                     at android.app.ActivityThread.handleCreateService(ActivityThread.java:4650)
                     at android.app.ActivityThread.-$$Nest$mhandleCreateService(Unknown Source:0) 
                     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2264) 
                     at android.os.Handler.dispatchMessage(Handler.java:106) 
                     at android.os.Looper.loopOnce(Looper.java:205) 
                     at android.os.Looper.loop(Looper.java:294) 
                     at android.app.ActivityThread.main(ActivityThread.java:8176) 
                     at java.lang.reflect.Method.invoke(Native Method) 
                     at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:552) 
                     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:971) 
                 Caused by: android.os.RemoteException: Remote stack trace:
                     at com.android.server.am.ActivityManagerService.registerReceiverWithFeature(ActivityManagerService.java:13908)
                     at android.app.IActivityManager$Stub.onTransact(IActivityManager.java:2570)
                     at com.android.server.am.ActivityManagerService.onTransact(ActivityManagerService.java:2720)
                     at android.os.Binder.execTransactInternal(Binder.java:1339)
                     at android.os.Binder.execTransact(Binder.java:1275)

I have followed the process from wiki from the beginning.

I have no errors when I tried on Android 13.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.