让媒体播放器在屏幕关闭的情况下在后台工作

Jul*_*edo 5 java android background android-mediaplayer

我有一个带有媒体播放器的流媒体音频(来自服务器)。当我关闭屏幕并且系统进入睡眠模式时它起作用,但几分钟后手机停止音乐。当手机连接到电源(USB 电缆)时,不会发生这种情况。因此,系统必须由于电源管理或内存管理而使应用程序崩溃。

\n\n

服务等级:

\n\n
public class MyService extends Service {\n\n    PowerManager powerManager;\n    PowerManager.WakeLock wakeLock;\n    WifiManager.WifiLock wifiLock;\n\n    private MediaPlayer mediaPlayer;\n    @Nullable\n    @Override\n    public IBinder onBind(Intent intent) {\n       return null;\n    }\n\n    @Override\n    public int onStartCommand(Intent intent, int flags, int startId) {\n\n        powerManager = (PowerManager) getSystemService(Context.POWER_SERVICE);\n        wakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "My Lock");\n        wifiLock = ((WifiManager) getApplicationContext().getSystemService(Context.WIFI_SERVICE)).createWifiLock(WifiManager.WIFI_MODE_FULL, "mylock");\n\n    wakeLock.acquire();\n    wifiLock.acquire();\n\n        mediaPlayer = new MediaPlayer();\n mediaPlayer.setWakeMode(getApplicationContext(), PowerManager.PARTIAL_WAKE_LOCK);\n\n        mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);\n\n        try {\n            mediaPlayer.setDataSource("http://mediacontrol.jargon.com.ar:8168/;");\n        } catch (IOException e) {\n            e.printStackTrace();\n        }\n\n\n        mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {\n            @Override\n            public void onPrepared(MediaPlayer mp) {\n                mediaPlayer.start();\n            }\n        });\n        mediaPlayer.prepareAsync();\n        return START_REDELIVER_INTENT;\n    }\n\n    @Override\n    public void onDestroy() {\n        super.onDestroy();\n        mediaPlayer.stop();\n        mediaPlayer.release();\n        wakeLock.release();\n        wifiLock.release();\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

这是实现该服务的类:

\n\n
@Override\npublic View onCreateView(LayoutInflater inflater, ViewGroup container,\n                         Bundle savedInstanceState) {\n    // Inflate the layout for this fragment\n    setRetainInstance(true); // con esto retenemos los valores pero se elimina el view\n    View view = inflater.inflate(R.layout.fragment_blank_fragment4, container, false);\n\n    play = (ImageButton) view.findViewById(R.id.imageButton);\n    imagen=(ImageView) view.findViewById((R.id.imageView));\n\n   if(comenzar) {\n       play.setImageResource(R.drawable.play);\n\n           }\n   else {\n      play.setImageResource(R.drawable.stop);\n    }\n       play.setOnClickListener(new View.OnClickListener() {\n           public void onClick(View v) {\n               if (comenzar) {\n                  if(isConnectedMobile(getActivity())|| \nisConnectedWifi(getActivity())) {\n                       play.setImageResource(R.drawable.stop);\n\ngetActivity().getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);\n                   getActivity().startService(new Intent(getActivity(), MyService.class));\n                   showNotification();\n                   comenzar = false;\n                   release=true;\n               }\n               else\n               {\n                   AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());\n                   builder.setTitle("No hay conexi\xc3\xb3n a internet");\n                   builder.setPositiveButton("OK", new DialogInterface.OnClickListener() {\n                       public void onClick(DialogInterface dialog, int id) {\n                           dialog.cancel();\n                       }\n                   });\n\n                   AlertDialog dialog = builder.create();\n                   dialog.show();\n               }\n            } else {\n                play.setImageResource(R.drawable.play);\n\n                getActivity().stopService(new Intent(getActivity(), MyService.class));\n\n                comenzar = true;\n                NotificationManager mNotificationManager = (NotificationManager) getActivity().getSystemService(Context.NOTIFICATION_SERVICE);\n\n                //getActivity().getWindow().clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);                \n                release=false;\n    }\n        }\n\n    });\n    return view;\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

我还在清单中设置了此权限

\n\n
 <uses-permission android:name="android.permission.WAKE_LOCK" />\n <uses-permission android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS" />\n
Run Code Online (Sandbox Code Playgroud)\n\n

我无法很好地调试它,因为问题发生在移动设备未连接但音频崩溃时,然后我连接它,当我打开屏幕和停止后它会再运行一秒钟。

\n\n

我明白了:

\n\n
09-24 18:14:21.480 8539-8539/jaodev.utnfrp W/MediaPlayer: mediaplayer went away with unhandled events\n09-24 18:14:24.070 8539-8551/jaodev.utnfrp I/MediaHTTPConnection: proxyName: 0.0.0.0 0\n09-24 18:14:24.970 8539-8539/jaodev.utnfrp D/MediaPlayer: setSubtitleAnchor in MediaPlayer\n09-24 18:17:57.413 8539-8552/jaodev.utnfrp I/MediaHTTPConnection: proxyName: 0.0.0.0 0\n09-24 18:18:30.437 8539-8551/jaodev.utnfrp I/MediaHTTPConnection: proxyName: 0.0.0.0 0\n09-24 18:18:34.187 8539-9040/jaodev.utnfrp W/MediaPlayer: info/warning (703, 0)\n09-24 18:18:34.188 8539-9040/jaodev.utnfrp W/MediaPlayer: info/warning (701, 0)\n09-24 18:19:03.462 8539-9040/jaodev.utnfrp I/MediaHTTPConnection: proxyName: 0.0.0.0 0\n09-24 18:19:03.941 8539-9040/jaodev.utnfrp W/MediaHTTPConnection: readAt 1507328 / 32768 => java.net.ProtocolException\n09-24 18:19:04.202 8539-8551/jaodev.utnfrp W/MediaPlayer: info/warning (703, 0)\n09-24 18:21:51.201 8539-8544/jaodev.utnfrp I/art: Do partial code cache collection, code=40KB, data=62KB\n09-24 18:21:51.203 8539-8544/jaodev.utnfrp I/art: After code cache collection, code=40KB, data=62KB\n    Increasing code cache capacity to 256KB\n
Run Code Online (Sandbox Code Playgroud)\n