Jul*_*edo 5 java android background android-mediaplayer
我有一个带有媒体播放器的流媒体音频(来自服务器)。当我关闭屏幕并且系统进入睡眠模式时它起作用,但几分钟后手机停止音乐。当手机连接到电源(USB 电缆)时,不会发生这种情况。因此,系统必须由于电源管理或内存管理而使应用程序崩溃。
\n\n服务等级:
\n\npublic 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}\nRun 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}\nRun 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" />\nRun Code Online (Sandbox Code Playgroud)\n\n我无法很好地调试它,因为问题发生在移动设备未连接但音频崩溃时,然后我连接它,当我打开屏幕和停止后它会再运行一秒钟。
\n\n我明白了:
\n\n09-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\nRun Code Online (Sandbox Code Playgroud)\n