Problem mit eigenem Service für Musik wiedergabe (auf 4.x)

  • Antworten:1
Kay J.
  • Forum-Beiträge: 59

27.08.2012, 08:40:21 via Website

Hallo
erstmal sorry fals der Titel bisschen doof gewählt ist, aber mir ist nix besseres eingefallen. :/

Ich baue grade an einer App zur Wiedergabe von (bestimmten) Shoutcast Streams. Für die Wiedergabe habe ich einen Service gestartet der auch an sich super funktioniert. Nur wenn ich unter 4.x (getestet erstmal nur mit 4.1) bei laufender Musik mit "zurück" bis auf den Homescreen gehe und dann über die "App History" meine App zur Seite rausschiebe, hört die Musik auf zu spielen... Und wenn ich über die Notification in meine App rein gehe stribt sie mit einer NPE im onStartCommand des Service weil scheinbar der Intent Parameter mit "null" kommt.

der Service wird mit folgendem code gestartet:
1Intent i = new Intent(context, PlaybackService.class);
2 i.putExtra("radio", station.getIndex());
3 if (streamType.equals(StreamType.MP3)) {
4 i.setAction(PlaybackService.SERVICE_STARTMP3);
5 } else {
6 i.setAction(PlaybackService.SERVICE_STARTAAC);
7 }
8 startService(i);

Der Code des Service sieht so aus
1package xx.xx.xx;
2
3import android.app.Notification;
4import android.app.NotificationManager;
5import android.app.PendingIntent;
6import android.app.Service;
7import android.content.Intent;
8import android.os.Bundle;
9import android.os.IBinder;
10
11import com.un4seen.bass.BASS;
12
13import xx.xx.xx.activities.MainActivity;
14
15public class PlaybackService extends Service {
16
17 private static final int NOTIFICATION_ID = 1;
18
19 public static final String SERVICE_STARTMP3 = "MP3";
20 public static final String SERVICE_STARTAAC = "AAC";
21 public static final String SERVICE_UPDATEINFO = "UPDATE";
22 public static final String SERVICE_STOP = "STOP";
23
24 private NotificationManager _notificationManager;
25 private ApplicationSingleton _singleton;
26 private Radio radioStation;
27 private String streamType;
28
29 @Override
30 public void onCreate() {
31 _notificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
32 _singleton = (ApplicationSingleton) this.getApplication();
33 _singleton.initBass();
34 }
35
36 @Override
37 public void onDestroy() {
38 super.onDestroy();
39 }
40
41 @Override
42 public int onStartCommand(Intent intent, int flags, int startId) {
43 Bundle infos = intent.getExtras();
44 if (!_singleton.isPlaying) {
45 radioStation = Radio.STATIONS.get(infos.getInt("radio"));
46 String radioName = radioStation.getRadioAsString();
47 if (intent.getAction().equals(SERVICE_STARTMP3)) {
48 streamType = StreamType.MP3;
49 } else if (intent.getAction().equals(SERVICE_STARTAAC)) {
50 streamType = StreamType.AAC;
51 }
52
53 Notification notification = new Notification(R.drawable.icon,
54 "Now playing " + radioName, System.currentTimeMillis());
55 Intent notificationIntent = new Intent(this, MainActivity.class);
56 notificationIntent.putExtra("radio", radioStation.getIndex());
57 notificationIntent.putExtra("streamType", streamType);
58 notificationIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP
59 | Intent.FLAG_ACTIVITY_SINGLE_TOP);
60
61 PendingIntent pendingIntent = PendingIntent.getActivity(this, 0,
62 notificationIntent, 0);
63 notification.setLatestEventInfo(this, radioName,
64 getString(R.string.tap_to_open), pendingIntent);
65
66 _notificationManager.notify(NOTIFICATION_ID, notification);
67
68 new Thread(new PlayStream()).start();
69 _singleton.isPlaying = true;
70
71 } else {
72 if (intent.getAction().equals(SERVICE_STOP)) {
73 BASS.BASS_StreamFree(_singleton.bassStreamHandle);
74 _notificationManager.cancel(NOTIFICATION_ID);
75 _singleton.isPlaying = false;
76 stopSelf();
77 }
78 }
79 return super.onStartCommand(intent, flags, startId);
80
81 }
82
83 @Override
84 public IBinder onBind(Intent arg0) {
85 return null;
86 }
87
88 private class PlayStream implements Runnable {
89 public void run() {
90 int handle = _singleton.bassStreamHandle;
91 BASS.BASS_StreamFree(handle);
92 String url = radioStation.getStreamURL(streamType);
93 int newHandle = BASS.BASS_StreamCreateURL(url, 0,
94 BASS.BASS_STREAM_BLOCK | BASS.BASS_STREAM_AUTOFREE, null,
95 null);
96 if (newHandle != 0) {
97 _singleton.bassStreamHandle = newHandle;
98 BASS.BASS_ChannelPlay(newHandle, false);
99 sendBroadcast(new Intent(MainActivity.INTENT_PLAYING));
100 }
101 }
102 }
103}

in der AndroidManifext.xml habe ich den Service mit
1<service android:name=".PlaybackService" android:exported="false" />
eingetragen.
SDK Level sind
1<uses-sdk android:minSdkVersion="10" android:targetSdkVersion="10" />

Hat jemand eine Idee was kaputt ist? Oder werden ggf mehr Infos benötigt?


Danke im vorraus <3


PS: Verbesserungsvorschläge sind auch gerne gesehen. ;)

Antworten
Kay J.
  • Forum-Beiträge: 59

29.08.2012, 08:04:41 via Website

Okay, inzwischen hat sich eine Lösung gefunden.

anstelle der notify() funktion des NotificationManager muss startForeground(NOTIFICATION_ID, notification); genommen werden. Damit klappts :)


Mfg

Antworten