尽管应用已关闭,WallpaperService仍使音乐在后台播放

时间:2018-09-30 18:03:17

标签: java android android-service exoplayer

在我的应用程序中,我想为用户提供使用WallpaeprService将动画设置为动态壁纸的选项,如果应用程序处于打开状态,我的应用程序还包括一个Radio播放器(在背景中播放),以便您可以导航到播放音乐时使用其他应用程序。

我的问题:

如果动态壁纸正在运行,并且用户尝试通过(滑动以退出/“最近的任务”)关闭应用,尽管应用已关闭,音乐仍会继续播放。

我试图停止这种音乐,但不起作用:

public class MainActivity extends AppCompatActivity implements NavigationView.OnNavigationItemSelectedListener {

    @SuppressLint({"CommitPrefEdits", "Assert"})
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        startService(new Intent(this, KillNotificationService.class));
        trackSelector = new DefaultTrackSelector();
        loadControl = new DefaultLoadControl();
        exoPlayer = ExoPlayerFactory.newSimpleInstance(new DefaultRenderersFactory(getApplicationContext()), trackSelector, loadControl);
        MusicButton.setVisibility(View.INVISIBLE);
        MusicButton.setOnCheckedChangeListener(new OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                if (Build.VERSION.SDK_INT > 15) {
                    if (started && MusicButton.isChecked()) {
                        started = false;
                        exoPlayer.setPlayWhenReady(false);
                        MusicButton.setChecked(true);
                        releaseAudioFocusForMyApp(MainActivity.this);
                    } else {
                        boolean gotFocus = requestAudioFocusForMyApp(MainActivity.this);
                        if (gotFocus) {
                            started = true;
                            exoPlayer.setPlayWhenReady(true);
                            MusicButton.setChecked(false);
                        }
                    }
                } else {
                    if (started && MusicButton.isChecked()) {
                        started = false;
                        mediaPlayer.pause();
                        MusicButton.setChecked(true);
                        releaseAudioFocusForMyApp(MainActivity.this);
                    } else {
                        boolean gotFocus = requestAudioFocusForMyApp(MainActivity.this);
                        if (gotFocus) {
                            started = true;
                            mediaPlayer.start();
                            MusicButton.setChecked(false);
                        }
                    }
                }
            }
        });



    private void playRadio(String url) {
        Uri audioUri = Uri.parse(url);
        DefaultHttpDataSourceFactory dataSourceFactory = new DefaultHttpDataSourceFactory("ExoPlayerDemo");
        ExtractorsFactory extractor = new DefaultExtractorsFactory();
        MediaSource audioSource = new ExtractorMediaSource.Factory(dataSourceFactory).setExtractorsFactory(extractor).createMediaSource(audioUri);
        exoPlayer.prepare(audioSource);
        prepared = true;
        exoPlayer.setPlayWhenReady(true);
        exoPlayer.addListener(new Player.EventListener() {
            @Override
            public void onTimelineChanged(Timeline timeline, @Nullable Object manifest, int reason) {

            }

            @Override
            public void onTracksChanged(TrackGroupArray trackGroups, TrackSelectionArray trackSelections) {

            }

            @Override
            public void onLoadingChanged(boolean isLoading) {

            }

            @Override
            public void onPlayerStateChanged(boolean playWhenReady, int playbackState) {
                if (isPreparing && playbackState == ExoPlayer.STATE_READY) {
                    MusicButton.setVisibility(View.VISIBLE);
                    MusicButton.setChecked(true);
                    isPreparing = false;
                    isReady = true;
                }

            }

            @Override
            public void onRepeatModeChanged(int repeatMode) {

            }

            @Override
            public void onShuffleModeEnabledChanged(boolean shuffleModeEnabled) {

            }

            @Override
            public void onPlayerError(ExoPlaybackException error) {

            }

            @Override
            public void onPositionDiscontinuity(int reason) {

            }

            @Override
            public void onPlaybackParametersChanged(PlaybackParameters playbackParameters) {

            }

            @Override
            public void onSeekProcessed() {

            }
        });

    }



    @Override
    protected void onResume() {
        super.onResume();
        try {
            MApplication.sBus.register(this);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    @Override
    protected void onStop() {
        super.onStop();
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        try {
            MApplication.sBus.unregister(this);
        } catch (Exception e) {
            e.printStackTrace();
        }
        MApplication.sBus.post(PlaybackEvent.PAUSE);
    }

    @Override
    protected void onStart() {
        super.onStart();
    }

    @Subscribe
    public void handlePlaybackEvent(PlaybackEvent event) {
        switch (event) {
            case PAUSE:
                if (Build.VERSION.SDK_INT > 15) {
                    if (exoPlayer.getPlayWhenReady()) {
                        exoPlayer.setPlayWhenReady(false);
                        MusicButton.setChecked(true);
                    }
                } else {
                    if (mediaPlayer.isPlaying()) {
                        mediaPlayer.pause();
                        MusicButton.setChecked(true);
                    }
                }

                break;
            case PLAY:
                if (Build.VERSION.SDK_INT > 15) {
                    if (!exoPlayer.getPlayWhenReady()) {
                        exoPlayer.setPlayWhenReady(true);
                        MusicButton.setChecked(false);
                    }
                } else {
                    if (!mediaPlayer.isPlaying()) {
                        mediaPlayer.start();
                        MusicButton.setChecked(false);
                    }
                }

                break;
        }
    }


    @Override
    public void onPause() {
        super.onPause();
    }

    }
}

1 个答案:

答案 0 :(得分:0)

通过检查动态壁纸是否在背景中运行来解决问题:

@Override
protected void onDestroy() {
    super.onDestroy();
    try {
        WallpaperManager wpm = WallpaperManager.getInstance(this);
        WallpaperInfo info = wpm.getWallpaperInfo();
        if (info != null && info.getPackageName().equals(this.getPackageName())) {
/*stop music*/
        } else {
            Log.d(TAG, "We're not running");
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
}