Guest User

Untitled

a guest
Jan 20th, 2018
99
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 19.48 KB | None | 0 0
  1. E/MediaPlayer: error (100, 0)
  2. 01-20 16:39:44.028 E/MediaPlayer: Error (100,0)
  3. 01-20 16:39:44.028 E/MediaPlayer: stop called in state 0
  4. 01-20 16:39:44.028 E/MediaPlayer: error (-38, 0)
  5.  
  6. E/AndroidRuntime: FATAL EXCEPTION: main
  7.  
  8.  
  9. Process: com.sterchodevlab.android.eplog, PID: 5949
  10. java.lang.RuntimeException: Error receiving broadcast Intent { act=com.sterchodevlab.android.eplog.PLAY flg=0x10 } in com.sterchodevlab.android.eplog.services.PlayService$6@fc0fe14
  11. at android.app.LoadedApk$ReceiverDispatcher$Args.run(LoadedApk.java:891)
  12. at android.os.Handler.handleCallback(Handler.java:739)
  13. at android.os.Handler.dispatchMessage(Handler.java:95)
  14. at android.os.Looper.loop(Looper.java:148)
  15. at android.app.ActivityThread.main(ActivityThread.java:5417)
  16. at java.lang.reflect.Method.invoke(Native Method)
  17. at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
  18. at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
  19. Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'boolean android.media.MediaPlayer.isPlaying()' on a null object reference
  20. at com.sterchodevlab.android.eplog.services.PlayService.playMusic(PlayService.java:157)
  21. at com.sterchodevlab.android.eplog.services.PlayService.access$600(PlayService.java:29)
  22. at com.sterchodevlab.android.eplog.services.PlayService$6.onReceive(PlayService.java:501)
  23. at android.app.LoadedApk$ReceiverDispatcher$Args.run(LoadedApk.java:881)
  24. at android.os.Handler.handleCallback(Handler.java:739) 
  25. at android.os.Handler.dispatchMessage(Handler.java:95) 
  26. at android.os.Looper.loop(Looper.java:148) 
  27.  
  28. package com.sterchodevlab.android.eplog.services;
  29.  
  30. import android.app.Service;
  31. import android.content.BroadcastReceiver;
  32. import android.content.Context;
  33. import android.content.Intent;
  34. import android.content.IntentFilter;
  35. import android.media.AudioManager;
  36. import android.media.MediaPlayer;
  37. import android.os.Binder;
  38. import android.os.IBinder;
  39. import android.telephony.PhoneStateListener;
  40. import android.telephony.TelephonyManager;
  41. import android.util.Log;
  42.  
  43. import com.sterchodevlab.android.eplog.broadcasts.ReceiverRegister;
  44. import com.sterchodevlab.android.eplog.intent_actions.MediaAction;
  45. import com.sterchodevlab.android.eplog.models.MusicItem;
  46. import com.sterchodevlab.android.eplog.preferences.AppPreferences;
  47. import com.sterchodevlab.android.eplog.preferences.MediaButtonsSetter;
  48. import com.sterchodevlab.android.eplog.preferences.PrefKeys;
  49. import com.sterchodevlab.android.eplog.random.CustomRandomEngine;
  50. import com.sterchodevlab.android.eplog.sort.SortMusicList;
  51. import com.sterchodevlab.android.eplog.storage.StorageUtil;
  52.  
  53. import java.io.IOException;
  54. import java.util.ArrayList;
  55.  
  56. public class PlayService extends Service implements MediaPlayer.OnErrorListener,
  57. MediaPlayer.OnCompletionListener,MediaPlayer.OnInfoListener,
  58. MediaPlayer.OnSeekCompleteListener,MediaPlayer.OnPreparedListener,
  59. MediaPlayer.OnBufferingUpdateListener,AudioManager.OnAudioFocusChangeListener,
  60. ReceiverRegister {
  61.  
  62.  
  63. public MediaPlayer backgroundPlayer;
  64. public AudioManager manager;
  65.  
  66. private ArrayList<MusicItem> audioList;
  67. private ArrayList<MusicItem> shuffleAudioList;
  68. private int audioIndex = -1;
  69. private MusicItem activeAudio;
  70.  
  71. private boolean isCall = false;
  72. private PhoneStateListener phoneStateListener;
  73. private TelephonyManager telephonyManager;
  74.  
  75. private final IBinder mBinder = new ServiceBinder();
  76. private int length = 0;
  77.  
  78.  
  79. public class ServiceBinder extends Binder {
  80.  
  81. public PlayService getService()
  82. {
  83. return PlayService.this;
  84. }
  85. }
  86.  
  87. public PlayService() {
  88. }
  89.  
  90. @Override
  91. public void onCreate() {
  92. super.onCreate();
  93. Log.i("on_create","OnCreate called");
  94.  
  95. callListener();
  96. registerCustomReceivers();
  97.  
  98. }
  99.  
  100. public void initMP(){
  101. Log.i("init","InitMediaPlayer");
  102. if(backgroundPlayer==null)
  103. backgroundPlayer = new MediaPlayer();
  104.  
  105. backgroundPlayer.setOnCompletionListener(this);
  106. backgroundPlayer.setOnErrorListener(this);
  107. backgroundPlayer.setOnPreparedListener(this);
  108. backgroundPlayer.setOnBufferingUpdateListener(this);
  109. backgroundPlayer.setOnSeekCompleteListener(this);
  110. backgroundPlayer.setOnInfoListener(this);
  111.  
  112. backgroundPlayer.reset();
  113.  
  114. backgroundPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
  115.  
  116. try {
  117. backgroundPlayer.setDataSource(activeAudio.getImage().toString());
  118. } catch (IOException e) {
  119. e.printStackTrace();
  120. stopSelf();
  121. }
  122. backgroundPlayer.prepareAsync();
  123.  
  124.  
  125. }
  126.  
  127. @Override
  128. public int onStartCommand( Intent intent, int flags, int startId) {
  129.  
  130. Log.i("startCommand","onStartCommand");
  131. StorageUtil storage = new StorageUtil(getApplicationContext());
  132. audioList = storage.loadAudio();
  133. audioIndex = storage.loadAudioIndex();
  134.  
  135. if (audioIndex != -1 && audioIndex < audioList.size()) {
  136.  
  137. activeAudio = audioList.get(audioIndex);
  138. } else {
  139.  
  140. stopSelf();
  141. }
  142.  
  143.  
  144. if (requestAudioFocus() == false) {
  145. stopSelf();
  146. }
  147.  
  148. try{
  149. initMP();
  150. }catch (NullPointerException e){
  151. e.printStackTrace();
  152. stopSelf();
  153. }
  154.  
  155. return super.onStartCommand(intent, flags, startId);
  156. }
  157.  
  158.  
  159. public void onPause(){
  160. Log.i("on_pause","OnPause");
  161. if(backgroundPlayer==null) return; //Костиль!!!!!!
  162. if (backgroundPlayer.isPlaying()) {
  163. backgroundPlayer.pause();
  164. length = backgroundPlayer.getCurrentPosition();
  165.  
  166. }
  167.  
  168. }
  169.  
  170. public void resumeMusic()
  171. {
  172. Log.i("resume","ResumeMusic");
  173. if(backgroundPlayer==null) initMP();
  174.  
  175. if (backgroundPlayer.isPlaying() == false) {
  176. backgroundPlayer.seekTo(length);
  177. backgroundPlayer.start();
  178. }
  179.  
  180. }
  181.  
  182. private void playMusic() {
  183. Log.i("play","PlayMusic");
  184. if (!backgroundPlayer.isPlaying()) {
  185. requestAudioFocus();
  186. backgroundPlayer.start();
  187. }
  188. }
  189.  
  190.  
  191. public void stopMusic()
  192. {
  193. Log.i("stop","StopMusic");
  194. if (backgroundPlayer == null) return;
  195.  
  196. if(backgroundPlayer.isPlaying())
  197. {
  198. backgroundPlayer.stop();
  199. backgroundPlayer.release();
  200. backgroundPlayer = null;
  201. }
  202. }
  203.  
  204. public boolean playOrNot(){
  205. return backgroundPlayer.isPlaying();
  206. }
  207.  
  208. private void skipToNext() {
  209.  
  210. if(new MediaButtonsSetter(getApplicationContext()).get(PrefKeys.SHUFFLE_KEY)){
  211. audioIndex= CustomRandomEngine.nextRandom(audioList.size());
  212. audioIndex--;
  213. }
  214.  
  215. if (audioIndex == audioList.size() - 1) {
  216. //if last in playlist
  217. audioIndex = 0;
  218. activeAudio = audioList.get(audioIndex);
  219. } else {
  220. //get next in playlist
  221. activeAudio = audioList.get(++audioIndex);
  222. }
  223.  
  224. //Update stored index
  225. new StorageUtil(getApplicationContext()).storeAudioIndex(audioIndex);
  226.  
  227. stopMusic();
  228. //stopSelf();
  229. initMP();
  230. }
  231.  
  232. private void skipToPrevious() {
  233.  
  234. if (audioIndex == 0) {
  235. //if first in playlist
  236. //set index to the last of audioList
  237. audioIndex = audioList.size() - 1;
  238. activeAudio = audioList.get(audioIndex);
  239. } else {
  240. //get previous in playlist
  241. activeAudio = audioList.get(--audioIndex);
  242. }
  243.  
  244. //Update stored index
  245. new StorageUtil(getApplicationContext()).storeAudioIndex(audioIndex);
  246.  
  247. stopMusic();
  248. //stopSelf();
  249.  
  250. initMP();
  251. }
  252.  
  253. private void refreshAudioIndex(){
  254. for(int i=0;i<audioList.size();i++){
  255. if(activeAudio==audioList.get(i)){
  256. audioIndex=i;
  257. new StorageUtil(getApplicationContext()).storeAudioIndex(audioIndex);
  258. }
  259. }
  260. }
  261.  
  262.  
  263. public boolean requestAudioFocus() {
  264. Log.i("request","RequestAudioFocus");
  265. manager = (AudioManager) getSystemService(AUDIO_SERVICE);
  266. int result = manager.requestAudioFocus(this, AudioManager.STREAM_MUSIC, AudioManager.AUDIOFOCUS_GAIN);
  267. if (result == AudioManager.AUDIOFOCUS_REQUEST_GRANTED) {
  268.  
  269. return true;
  270. }
  271.  
  272. return false;
  273. }
  274.  
  275. private boolean removeAudioFocus() {
  276. Log.i("remove","RemoveAudioFocus");
  277. if(manager!=null){
  278. if(AudioManager.AUDIOFOCUS_REQUEST_GRANTED ==
  279. manager.abandonAudioFocus(this)){
  280. return true;
  281. }
  282.  
  283. }
  284. return false;
  285. }
  286.  
  287.  
  288. @Override
  289. public void onDestroy() {
  290. Log.i("on_destroy","OnDestroy");
  291. super.onDestroy();
  292. if(backgroundPlayer != null)
  293. {
  294. try{
  295. backgroundPlayer.stop();
  296. backgroundPlayer.release();
  297. }finally {
  298. backgroundPlayer = null;
  299. }
  300. }
  301. removeAudioFocus();
  302.  
  303. if (phoneStateListener != null) {
  304. telephonyManager.listen(phoneStateListener, PhoneStateListener.LISTEN_NONE);
  305. }
  306.  
  307. unregisterReceiver(changeSourceofSound);
  308. unregisterReceiver(playNewAudio);
  309. unregisterReceiver(playNext);
  310. unregisterReceiver(playPrev);
  311. unregisterReceiver(play);
  312. unregisterReceiver(pause);
  313. unregisterReceiver(replay);
  314. unregisterReceiver(listUpdated);
  315.  
  316. }
  317.  
  318.  
  319. @Override
  320. public IBinder onBind(Intent intent) {
  321. return mBinder;
  322. }
  323.  
  324. @Override
  325. public boolean onUnbind(Intent intent) {
  326. return super.onUnbind(intent);
  327. }
  328.  
  329. @Override
  330. public boolean onError(MediaPlayer mp, int what, int extra) {
  331.  
  332. if(backgroundPlayer != null)
  333. {
  334. try{
  335. backgroundPlayer.stop();
  336. backgroundPlayer.release();
  337. }finally {
  338. backgroundPlayer = null;
  339. }
  340. }
  341.  
  342. return false;
  343. }
  344.  
  345. @Override
  346. public void onBufferingUpdate(MediaPlayer mp, int percent) {
  347.  
  348. }
  349.  
  350. @Override
  351. public void onCompletion(MediaPlayer mp) {
  352. MediaButtonsSetter checker=new MediaButtonsSetter(getApplicationContext());
  353.  
  354. if(checker.get(PrefKeys.REPEAT_ONCE_KEY)){
  355. sendBroadcast(new Intent(MediaAction.REPLAY));
  356. checker.set(PrefKeys.REPEAT_ONCE_KEY,false);
  357. sendBroadcast(new Intent(MediaAction.UPDATE_BOTTOM_BUTTONS));
  358.  
  359. }else if(checker.get(PrefKeys.REPEAT_KEY)){
  360.  
  361. sendBroadcast(new Intent(MediaAction.REPLAY));
  362. }else{
  363.  
  364. sendBroadcast(new Intent(MediaAction.COMPLETION));
  365. sendBroadcast(new Intent(MediaAction.PLAY_NEXT));
  366. }
  367.  
  368. }
  369.  
  370. @Override
  371. public void onAudioFocusChange(int focusChange) {
  372. Log.i("audiofocus_change","OnAudioFocusChange");
  373. switch (focusChange) {
  374.  
  375. case AudioManager.AUDIOFOCUS_GAIN:
  376. Log.i("audiofocus_gain","AUDIOFOCUS_GAIN");
  377. if (backgroundPlayer == null) return;
  378.  
  379. backgroundPlayer.setVolume(1.0f, 1.0f);
  380. break;
  381.  
  382. case AudioManager.AUDIOFOCUS_LOSS:
  383. Log.i("audiofocus_loss","AUDIOFOCUS_LOSS");
  384. if(backgroundPlayer==null) return;
  385. if (backgroundPlayer.isPlaying()){
  386. sendBroadcast(new Intent(MediaAction.PAUSE));
  387. }
  388.  
  389. break;
  390.  
  391. case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT:
  392. Log.i("audiofocus_loss_trans","AUDIOFOCUS_LOSS_TRANSIENT");
  393. if (backgroundPlayer.isPlaying()){
  394. sendBroadcast(new Intent(MediaAction.PAUSE));
  395. }
  396. break;
  397.  
  398. case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK:
  399. Log.i("audiofocus_loss_trans","AUDIOFOCUS_LOSS_TRANSIENT");
  400. if (backgroundPlayer.isPlaying()) backgroundPlayer.setVolume(0.1f, 0.1f);
  401. break;
  402. }
  403.  
  404. }
  405.  
  406.  
  407. @Override
  408. public boolean onInfo(MediaPlayer mp, int what, int extra) {
  409.  
  410. return false;
  411. }
  412.  
  413. @Override
  414. public void onPrepared(MediaPlayer mp) {
  415. sendBroadcast(new Intent(MediaAction.PREPARED));
  416. sendBroadcast(new Intent(MediaAction.UPDATE_SCREEN_DATA));
  417. new MediaButtonsSetter(getApplicationContext()).set(PrefKeys.IS_PLAYING,true);
  418. sendBroadcast(new Intent(MediaAction.UPDATE_PLAY_PAUSE_BUTTON));
  419. playMusic();
  420. }
  421.  
  422. @Override
  423. public void onSeekComplete(MediaPlayer mp) {
  424.  
  425. }
  426.  
  427.  
  428.  
  429. private void callListener(){
  430.  
  431. telephonyManager = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
  432.  
  433. phoneStateListener = new PhoneStateListener() {
  434. @Override
  435. public void onCallStateChanged(int state, String incomingNumber) {
  436. switch (state) {
  437.  
  438. case TelephonyManager.CALL_STATE_OFFHOOK:
  439. case TelephonyManager.CALL_STATE_RINGING:
  440.  
  441. if (backgroundPlayer != null) {
  442. sendBroadcast(new Intent(MediaAction.PAUSE));
  443. isCall = true;
  444. }
  445. break;
  446. case TelephonyManager.CALL_STATE_IDLE:
  447.  
  448. if (backgroundPlayer != null) {
  449. if (isCall) {
  450. isCall = false;
  451. boolean pausedUser=new MediaButtonsSetter(getApplicationContext())
  452. .get(PrefKeys.PAUSED_OF_USER);
  453.  
  454. boolean preferenceCall= AppPreferences.getDefault(getApplicationContext()
  455. ,PrefKeys.RESTORE_AFTER_CALL);
  456.  
  457. if(preferenceCall && !pausedUser){
  458. sendBroadcast(new Intent(MediaAction.PLAY));
  459. }
  460.  
  461. }
  462. }
  463. break;
  464. }
  465. }
  466. };
  467.  
  468. telephonyManager.listen(phoneStateListener,
  469. PhoneStateListener.LISTEN_CALL_STATE);
  470. }
  471.  
  472. private void shuffleList(){
  473. shuffleAudioList= SortMusicList.shuffle(audioList);
  474. }
  475.  
  476.  
  477. private BroadcastReceiver changeSourceofSound=new BroadcastReceiver() {
  478. @Override
  479. public void onReceive(Context context, Intent intent) {
  480. sendBroadcast(new Intent(MediaAction.PAUSE));
  481. }
  482. };
  483.  
  484.  
  485. private BroadcastReceiver playNewAudio = new BroadcastReceiver() {
  486. @Override
  487. public void onReceive(Context context, Intent intent) {
  488.  
  489. //Get the new media index form SharedPreferences
  490. Log.i("tag","Тут");
  491. audioIndex = new StorageUtil(getApplicationContext()).loadAudioIndex();
  492. if (audioIndex != -1 && audioIndex < audioList.size()) {
  493. //index is in a valid range
  494. activeAudio = audioList.get(audioIndex);
  495. } else {
  496. stopSelf();
  497. }
  498. initMP();
  499.  
  500. }
  501. };
  502.  
  503. ///The Broadcast receivers initialization
  504.  
  505. //The receiver created to play next track in playlist
  506. private BroadcastReceiver playNext = new BroadcastReceiver() {
  507. @Override
  508. public void onReceive(Context context, Intent intent) {
  509. skipToNext();
  510. sendBroadcast(new Intent(MediaAction.UPDATE_SCREEN_DATA));
  511. }
  512. };
  513.  
  514. //The receiver created to play previous track in playlist
  515. private BroadcastReceiver playPrev = new BroadcastReceiver() {
  516. @Override
  517. public void onReceive(Context context, Intent intent) {
  518.  
  519. skipToPrevious();
  520. sendBroadcast(new Intent(MediaAction.UPDATE_SCREEN_DATA));
  521. }
  522. };
  523.  
  524. private BroadcastReceiver play = new BroadcastReceiver() {
  525. @Override
  526. public void onReceive(Context context, Intent intent) {
  527. MediaButtonsSetter state= new MediaButtonsSetter(getApplicationContext());
  528. playMusic();
  529. //resumeMusic();
  530. state.set(PrefKeys.IS_PLAYING,true);
  531. state.set(PrefKeys.PAUSED_OF_USER,false);
  532. sendBroadcast(new Intent(MediaAction.UPDATE_PLAY_PAUSE_BUTTON));
  533. }
  534. };
  535.  
  536. private BroadcastReceiver pause = new BroadcastReceiver() {
  537. @Override
  538. public void onReceive(Context context, Intent intent) {
  539. MediaButtonsSetter state= new MediaButtonsSetter(getApplicationContext());
  540. onPause();
  541. state.set(PrefKeys.IS_PLAYING,false);
  542. sendBroadcast(new Intent(MediaAction.UPDATE_PLAY_PAUSE_BUTTON));
  543.  
  544. }
  545. };
  546.  
  547.  
  548. private BroadcastReceiver replay = new BroadcastReceiver() {
  549. @Override
  550. public void onReceive(Context context, Intent intent) {
  551. backgroundPlayer.pause();
  552. length=0;
  553. resumeMusic();
  554. MediaButtonsSetter setter=new MediaButtonsSetter(getApplicationContext());
  555. setter.set(PrefKeys.IS_PLAYING,true);
  556. sendBroadcast(new Intent(MediaAction.UPDATE_PLAY_PAUSE_BUTTON));
  557. }
  558. };
  559.  
  560. private BroadcastReceiver listUpdated = new BroadcastReceiver() {
  561. @Override
  562. public void onReceive(Context context, Intent intent) {
  563. // audioList.clear();
  564. audioList=new StorageUtil(getApplicationContext()).loadAudio();
  565. refreshAudioIndex();
  566. }
  567. };
  568.  
  569. /// Register receivers
  570.  
  571. @Override
  572. public void registerCustomReceivers() {
  573.  
  574. registerReceiver(changeSourceofSound, new IntentFilter(AudioManager.ACTION_AUDIO_BECOMING_NOISY));
  575. registerReceiver(playNewAudio, new IntentFilter(MediaAction.PLAY_NEW_AUDIO));
  576.  
  577. registerReceiver(playNext, new IntentFilter(MediaAction.PLAY_NEXT));
  578. registerReceiver(playPrev, new IntentFilter(MediaAction.PLAY_PREV));
  579.  
  580. registerReceiver(play, new IntentFilter(MediaAction.PLAY));
  581. registerReceiver(pause, new IntentFilter(MediaAction.PAUSE));
  582.  
  583. registerReceiver(replay, new IntentFilter(MediaAction.REPLAY));
  584.  
  585. registerReceiver(listUpdated, new IntentFilter(MediaAction.LIST_UPDATED));
  586. }
  587.  
  588. }
Add Comment
Please, Sign In to add comment