【问题标题】:Making application work normally when user turns off screen android当用户关闭屏幕android时使应用程序正常工作
【发布时间】:2017-12-21 12:21:55
【问题描述】:

我正在开发一个媒体播放器应用程序。

问题:如何让媒体播放器(应用程序)正常工作而不会因关闭屏幕而出现问题? 问题: loadInBackground() 返回 uri 但屏幕关闭时未调用 onLoadFinished。

几句话可以更好地解释麻烦:

媒体播放器包含加载歌曲的Loader 和加载相关建议的另一个Loader。我还实现了 play_next() 的方法,它依赖于媒体播放器的侦听器完成(右上角的按钮)。

媒体播放器在我创建的服务类中初始化,因此用户可以搜索新歌曲,并使用按钮准备next_song()(并且播放继续,因为我每次都连接到服务Activity 是加载并从服务媒体播放器返回,以便我可以为onFinish 方法附加侦听器。

困扰我的是,当用户关闭屏幕时,活动进入空闲状态(来自 android 监视器 - 日志猫的状态)并且一旦处于空闲状态(又名 关闭屏幕 ) 如果歌曲结束,它将开始新的意图,即媒体播放器开始初始化和自动播放歌曲。它在屏幕打开时工作,但如果它进入空闲状态则不起作用。

如果我打开屏幕,我会得到这样的活动:

小粉红点是进度条。所以活动试图刷新自己? 在onCreate() 方法中,我调用start_loader,它使用Loader 进行初始化和处理。

我看过一些电源管理器工具,并看到了有关它的不良 cmets,这意味着电池使用情况,但我确实尝试过,并且从 log cat 中它再次进入空闲状态(如果重要的话)。

请帮忙,也许我会覆盖 onPause() Activity 和 onResume()

我还从 loadInBackground() 收到消息,它是歌曲的 uri,从那里冻结不会继续。

【问题讨论】:

    标签: android android-activity android-mediaplayer android-lifecycle


    【解决方案1】:

    你需要创建Service 在后台运行。所以当你播放歌曲时不要停止,如果你保持屏幕关闭。Service in Android

    上面的链接完美地描述了服务。

    服务示例...

    import android.app.Service;
    import android.content.BroadcastReceiver;
    import android.content.Context;
    import android.content.Intent;
    import android.content.IntentFilter;
    import android.content.SharedPreferences;
    import android.content.res.Configuration;
    import android.media.MediaPlayer;
    import android.net.Uri;
    import android.os.Build;
    import android.os.IBinder;
    import android.support.annotation.RequiresApi;
    import android.util.Log;
    import android.widget.Toast;
    
    import com.example.divyesh.musiclite.Pojos.SongsList;
    
    import java.io.File;
    import java.io.IOException;
    
    /**
     * Created by Divyesh on 11/18/2017.
     */
    
    public class MediaSongServiece extends Service {
        SongsList s;
        private static Boolean destroy = false;
        private String TAG = "HELLO";
        private MusicIntentReceiver reciever;
        private SharedPreferences prefrence;
        private static MediaPlayer player;
        private int thisStartId = 1;
        private String ss[];
        SharedPreferences.Editor editor;
    
        public IBinder onBind(Intent arg0) {
    
            return null;
        }
    
        public static void requestPlayMedia() {
            player.start();
        }
    
        public void requestPauseMedia() {
            player.pause();
        }
    
        @Override
        public void onCreate() {
            super.onCreate();
            reciever = new MusicIntentReceiver();
            IntentFilter filter = new IntentFilter(Intent.ACTION_HEADSET_PLUG);
            registerReceiver(reciever, filter);
            Log.d("service", "onCreate");
        }
    
        @Override
        public void onTaskRemoved(Intent rootIntent) {
            super.onTaskRemoved(rootIntent);
            stopSelf();
        }
    
        @Override
        public boolean onUnbind(Intent intent) {
            stopSelf(thisStartId);
            return super.onUnbind(intent);
        }
    
        public void onStart(Intent intent, int startId) {
            if (intent.equals(null)) {
                stopSelf();
            }
            if (destroy == false) {
                thisStartId = startId;
                ss = intent.getExtras().getStringArray("getArray");
                Log.e(TAG, "onStart: " + ss[0] + ss[1] + "    path" + ss[5]);
                s = new SongsList();
                s.setAll(ss);
                if (player != null) {
                    player.stop();
                    player.reset();
                    try {
                        player.setDataSource(getApplicationContext(), Uri.fromFile(new File(s.getPath())));
                        player.prepare();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                    player.setLooping(true);
                    player.setVolume(100, 100);
                    player.start();
    
                    Log.e(TAG, "onStart: m= is  not null" + player.isPlaying());
                } else {
    
                    player = MediaPlayer.create(getApplicationContext(), Uri.fromFile(new File(s.getPath())));
                    player.setLooping(true);
                    player.setVolume(100, 100);
                    player.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
                        @Override
                        public void onPrepared(MediaPlayer mediaPlayer) {
                            mediaPlayer.start();
    
                        }
                    });
                    Log.e(TAG, "onStart: m= is  null WE created new player");
                }
            } else {
                Log.e(TAG, "onelse destroy ");
                recover();
            }
        }
    
        private void recover() {
            destroy = false;
            prefrence = getSharedPreferences("SongPrefrence", Context.MODE_PRIVATE);
    
            for (int i = 0; i <= 5; i++) {
                ss[i] = prefrence.getString("" + i, "");
            }
            String currentPose = prefrence.getString("current_pos", "");
    
            Log.e(TAG, "recover: Shared Daata is" + ss[5] + "_______" + currentPose);
    
        }
    
        @Override
        public void onDestroy() {
    
            unregisterReceiver(reciever);
            player.stop();
            player.release();
            stopSelf(thisStartId);
    
        }
    
    
        @Override
        public void onLowMemory() {
    
        }
    
        @Override
        public void onConfigurationChanged(Configuration newConfig) {
            super.onConfigurationChanged(newConfig);
            if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
                prefrence = getSharedPreferences("SongPrefrence", Context.MODE_PRIVATE);
                editor = prefrence.edit();
                destroy = true;
            }
            if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT) {
                prefrence = getSharedPreferences("SongPrefrence", Context.MODE_PRIVATE);
                editor = prefrence.edit();
                destroy = true;
            }
        }
    
        @RequiresApi(api = Build.VERSION_CODES.M)
        private void saveData() {
            player.pause();
            for (int i = 0; i < ss.length; i++) {
                editor.putString("" + i, ss[i]);
            }
            editor.putString("current_pos", "" + player.getCurrentPosition());
            editor.commit();
        }
    
        public class MusicIntentReceiver extends BroadcastReceiver {
            public String TAG = "ss";
    
            @Override
            public void onReceive(Context context, Intent intent) {
                if (intent.getAction().equals(Intent.ACTION_HEADSET_PLUG)) {
                    int state = intent.getIntExtra("state", -1);
                    switch (state) {
                        case 0:
                            Log.d(TAG, "Headset is unplugged");
                            Toast.makeText(context, " Headset is unpluged ", Toast.LENGTH_SHORT).show();
                            Log.e(TAG, "onReceive: " + " is play song " + player.isPlaying());
                            break;
                        case 1:
                            Log.d(TAG, "Headset is plugged");
                            break;
                        default:
                            Log.d(TAG, "I have no idea what the headset state is");
                    }
                }
            }
        }
    }
    

    【讨论】:

    • 是的,我确实使用了服务,因为我提到了它的好处,但是您能更具体地说明要实现哪些功能吗?新服务,与媒体播放器服务分离?
    • 等一下,我可以向您展示正在使用的媒体播放器的演示。作为你可以实现你的方式。
    • 那将是完美的:D
    • 对你有没有帮助?
    • 试图找出你的代码,到目前为止,我注意到你正在调用恢复方法,如果景观改变(将 bool 设置为 true)但你喜欢歌曲列表?好像您正在尝试保存该相关术语的状态?如果是这样,我的问题实际上是相反的,当媒体播放器结束时,它会启动新的意图(加载)并停止。当我打开屏幕时,它会继续加载播放器,自动播放和加载相关
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多