Autore Topic: WakeLock gestione Activity e streaming  (Letto 886 volte)

Offline gsources75

  • Utente normale
  • ***
  • Post: 327
  • Respect: +9
    • Google+
    • pepigno75
    • devandroid_it
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy Nexus S - Vodafone Smart -BB Bold- Iphone 4-
  • Play Store ID:
    Giuseppe+Sorce
  • Sistema operativo:
    Ubuntu-Windows Seven- Mac Lion
WakeLock gestione Activity e streaming
« il: 26 Luglio 2011, 11:07:12 CEST »
0
Non so se posso mettere tutto il codice ma se c'è bisogno ci tento...

Ok ho un problema.. sul WakeLock, il problema principale che non l'ho mai usato.

Ho creato uno streaming di una radio e ho usato un servizio remoto.

Cosi

Il file aidl

Codice (Java): [Seleziona]
interface IStreamingMediaPlayer {
     
    // Returns Currently Station Name
    String getStation();
    // Returns Currently Playing audio url
    String getUrl();
    // Check to see if service is playing audio
        boolean playing();
        //Start playing audio
        void startAudio();
        //Stop playing audio
        void stopAudio();

}
 


Il Service
Codice (Java): [Seleziona]
public class StreamingMediaPlayer extends Service  {

               
        private final IStreamingMediaPlayer.Stub ourBinder = new IStreamingMediaPlayer.Stub() {
                public String getStation() {
                        return station;
                }

                public String getUrl() {
                        return audiourl;
                }

                public boolean playing() {
                        return isPlaying();
                }

                public void startAudio() {
                        raiseThreadPriority();

                        Runnable r = new Runnable() {
                                public void run() {
                                        onStart(startingIntent, 0);
                                }
                        };
                        new Thread(r).start();

                }

                public void stopAudio() {

                        stop();
                }

        };
       

        @Override
        public void onCreate() {
                super.onCreate();
                context = this;
                uiHandler = new Handler();

        }

        @Override
        public void onStart(Intent intent, int startId) {
                super.onStart(intent, startId);


                processHasStarted = true;

                audiourl = InfoStreaming.CURRENT_URL;
                station = InfoStreaming.CURRENT_STATION;

               
                if (intent.getBooleanExtra(RadioActivity.REGULARSTREAM, false)) {
                        regularStream = true;
                }

                Log.i("radio", "Run startStreaming function");

                startStreaming(audiourl);

        }

        @Override
        public void onDestroy() {
                super.onDestroy();
        }

        @Override
        public IBinder onBind(Intent intent) {
                startingIntent = intent;
                context = this;

                return ourBinder;
        }

       
        public void startStreaming(final String mediaUrl) {    
                sendMessage(RadioActivity.CHECKRIORITY);
                sendMessage(RadioActivity.RAISEPRIORITY);              
                myplayer = new MyPlayeer();
                myplayer.playAsync(mediaUrl);
        }


        // Stop Audio
        public void stop() {   

                stopping = true;               
                try {
                        if (myplayer != null) {
                                myplayer.stop();
                                myplayer = null;
                        }

                        stream = null;

                        processHasStarted = false;
                        if (preparringthread != null) {
                                preparringthread.interrupt();
                        }
               
                        stopSelf();

                } catch (ArrayIndexOutOfBoundsException e) {
                        Log.i("radio", "error closing open connection");
                        sendMessage(RadioActivity.STOP);
                }
        }


        public boolean isPlaying() {
                return processHasStarted;
        }

        private synchronized void sendMessage(int m) {
                Intent i = new Intent(RadioActivity.tPLAY);

                i.putExtra(RadioActivity.MSG, m);
                context.sendBroadcast(i);

        }

        private void raiseThreadPriority() {
                Log.i("radio", "Start");
                Process.setThreadPriority(Process.THREAD_PRIORITY_AUDIO);
        }

        public void playerException(final Throwable t) {
                 Log.i("radio", "errore");
                uiHandler.post(new Runnable() {                

                        public void run() {
                               
                                Log.i("radio", "ERRORE playerException: "+t.toString());               
                                               
                        }
                });
        }

        public void playerPCMFeedBuffer(final boolean isPlaying,
                        final int audioBufferSizeMs, final int audioBufferCapacityMs) {

                uiHandler.post(new Runnable() {
                        public void run() {
                                // progress.setProgress(audioBufferSizeMs * progress.getMax()
                                // / audioBufferCapacityMs);
                                //Log.i("radio", "percentage :"+ (audioBufferSizeMs * 100 / audioBufferCapacityMs));
                               
                        }
                });
        }

        protected void showPlayStatus(String string) {
                // TODO Auto-generated method stub

        }
         public void playerStarted() {           
                 Log.i("radio", "playerStarted".toUpperCase());
                uiHandler.post( new Runnable() {
                    public void run() {
                        processHasStarted = true;
                        sendMessage(RadioActivity.START);
                        sendMessage(RadioActivity.STOPSPIN);
                    }
                });
            }

          public void playerStopped( final int perf ) {
                  Log.i("radio", "playerStopped".toUpperCase());
                uiHandler.post( new Runnable() {
                    public void run() {                
                        processHasStarted = false;
                        sendMessage(RadioActivity.STOP);
                    }
                });
            }

        @Override
        public boolean onUnbind(Intent intent) {
            stopSelf();
            return super.onUnbind(intent);
               
        }
}

La classe che lancia il servizio

Codice (Java): [Seleziona]
public class RadioActivity extends Activity implements Runnable,
       

        @Override
        public void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);

                setContentView(R.layout.main);
       
                maincontext = this;
                /* REGISTRO IL BROADCAST PER I MESSAGGI DAL SERVICE */
                ourintentfilter = new IntentFilter(RadioCapriActivity.tPLAY);
                try {
                        unregisterReceiver(messageReceiver);
                } catch (IllegalArgumentException e) {
                        Log.i("radio", "Does not look like we have a registered receiver: "
                                        + e.toString());
                }
                registerReceiver(messageReceiver, ourintentfilter);
                /* INIZIALIZZO LA UI */

               
                // Setup service connection
                Intent in = new Intent(maincontext, StreamingMediaPlayer.class);
                doNotStart = true;
                bindService(in, this, Context.BIND_AUTO_CREATE);
                if (savedInstanceState == null) {
                        Log.i("radio", "Bundle savedInstanceState is null.");
                        thread = new Thread(this);
                        thread.start();
                } else {

                        final Set<String> ourset = savedInstanceState.keySet();
                        String[] s = { "temp" };
                        final String[] ourstrings = ourset.toArray(s);
                        final int bundlesize = ourstrings.length;

                        InfoStreaming.CURRENT_STATION = savedInstanceState
                                        .getString(STATION);
                        InfoStreaming.CURRENT_URL = savedInstanceState.getString(URL);
                        currentRegularStream = savedInstanceState.getBoolean(REGULARSTREAM);
                        Log.i("radio", "currentStation: "+ InfoStreaming.CURRENT_STATION);
                        Log.i("radio", "currentURL: " + InfoStreaming.CURRENT_URL);
                        Log.i("radio", "currentRegularStream: " + currentRegularStream);
                       

                }

        }


        protected void playSound() {
                playPause.setEnabled(false);
                if (streamerBinder != null) {
                        boolean inplay = false;
                        try {
                                inplay = streamerBinder.playing();
                        } catch (RemoteException e) {
                                Log.i("radio", "errore in onClick sul play" + e.toString());
                        }
                        if (inplay) {
                                Log.i("radio", "radio già in play fermo l' audio");
                                stopplayer();
                        } else {

                                play(InfoStreaming.CURRENT_STATION, InfoStreaming.CURRENT_URL,
                                                currentRegularStream);
                        }
                } else {
                        play(InfoStreaming.CURRENT_STATION, InfoStreaming.CURRENT_URL,
                                        currentRegularStream);

                }

        }

        }

        @Override
        protected void onDestroy() {
                super.onDestroy();

        }

        @Override
        public void onServiceConnected(ComponentName className, IBinder service) {
                Log.i("radio", "onServiceConnected");
                streamerBinder = (IStreamingMediaPlayer.Stub) service;

                try {
                        if (streamerBinder.playing() == false && doNotStart == false) {
                                Intent i = new Intent(maincontext, StreamingMediaPlayer.class);

                                i.putExtra(RadioCapriActivity.URL, InfoStreaming.CURRENT_URL);
                                i.putExtra(RadioCapriActivity.STATION,
                                                InfoStreaming.CURRENT_STATION);
                                i.putExtra(RadioCapriActivity.REGULARSTREAM,
                                                currentRegularStream);
                                startService(i);

                        } else if (streamerBinder.playing()) {
                                Log.i("radio", "setup playing content on screen");
                                InfoStreaming.CURRENT_STATION = streamerBinder.getStation();
                                InfoStreaming.CURRENT_URL = streamerBinder.getUrl();
                                setplaystatus(true);
                        }
                        doNotStart = false;
                } catch (RemoteException e) {
                        Log.e("radio", "ServiceConnection.onServiceConnected", e);
                }
        }

        @Override
        public void onServiceDisconnected(ComponentName className) {
                streamerBinder = null;
        }

        // Thread process for grabbing data
        public void run() {
                handler.sendEmptyMessage(RadioCapriActivity.SPIN);
                handler.sendEmptyMessage(RadioCapriActivity.UPDATE);
        }

        private BroadcastReceiver messageReceiver = new BroadcastReceiver() {

                public void onReceive(Context context, final Intent intent) {

                        String temps = intent.getStringExtra(STATION);

                        String delrequest = intent.getStringExtra(DEL_REQUEST);

                        if (temps != null && delrequest == null) {

                                play(intent.getStringExtra(STATION),
                                                intent.getStringExtra(URL), false);

                        } else if (delrequest != null) {
                                String stationname = intent.getStringExtra(STATION);
                                String title = null;
                        } else {
                                Runnable r = new Runnable() {
                                        public void run() {
                                                int message = intent.getIntExtra(MSG, -1);
                                                if (message != -1) {
                                                        Log.d("radio", "Send status update");
                                                        handler.sendEmptyMessage(message);
                                                } else {
                                                        Log.d("radio", "NO update to Send: -1");
                                                }
                                        }
                                };
                                new Thread(r).start();
                        }

                }
        };

        // Play audio link
        public void play(final String ourstation, final String audiolink,
                        boolean regularStream) {

                InfoStreaming.CURRENT_STATION = ourstation;
                InfoStreaming.CURRENT_URL = audiolink;

                currentRegularStream = regularStream;

                if (streamerBinder != null) {
                        boolean p = false;
                        try {
                                p = streamerBinder.playing();
                        } catch (RemoteException e) {
                                Log.e("radio", e.toString());
                        }
                        if (p) {
                                Log.i("radio", "Stop player");
                                stopplayer();
                        }
                }

                Log.i("radio", "Turn off Notify");
                turnOffNotify();

                setBuffering(true);
                handler.sendEmptyMessage(RadioCapriActivity.SPIN);
                Intent i = new Intent(maincontext, StreamingMediaPlayer.class);
                i.putExtra(RadioCapriActivity.URL, audiolink);
                i.putExtra(RadioCapriActivity.STATION, ourstation);
                i.putExtra(RadioCapriActivity.REGULARSTREAM, regularStream);
                bindService(i, this, Context.BIND_AUTO_CREATE);

        }
        public Handler handler = new Handler() {
                @Override
                public void handleMessage(Message msg) {
                        Log.i("messaggio", "msg.what: " + msg.what);
                        if (msg.what == RadioCapriActivity.STOP) {
                                stoppedPlayer();
                        } else if (msg.what == RadioCapriActivity.START) {
                                setplaystatus(true);
                                turnOnNotify();
                        }   else if (msg.what == RadioCapriActivity.TROUBLEWITHAUDIO) {
                                stopplayer();

                                Intent i = new Intent(Intent.ACTION_SEND);
                                i.setType("text/plain");
                                i.putExtra(Intent.EXTRA_STREAM,
                                                new File(maincontext.getCacheDir(), "log.txt").toURI());
                                i.putExtra(Intent.EXTRA_SUBJECT, "myNPR Error");
                                startActivity(Intent.createChooser(i, "Send Error Log..."));

                                stopplayer();
                        } else if (msg.what == RadioCapriActivity.TROUBLEWITHRSSFEED) {
                                Log.i("radio", "Send screen message rss feed");
                        } else if (msg.what == RadioCapriActivity.RAISEPRIORITY) {
                                Log.i("radio", "Raise priority level for main process");

                                raiseThreadPriority();
                        } else if (msg.what == RadioCapriActivity.CHECKRIORITY) {
                                Log.i("radio", "Check priority level for main process");

                                checkThreadPriority();
                        } else if (msg.what == RadioCapriActivity.LOWERPRIORITY) {
                                Log.i("radio", "Lower priority level for main process");

                                lowerThreadPriority();
                        }
                }
        };

        public boolean isbundlenull() {
                if (b == null) {
                        return true;
                } else {
                        return false;
                }
        }

        protected void stoppedPlayer() {
                setplaystatus(false);          
                turnOffNotify();               

        }

        private void stopplayer() {
                try {
                        if (streamerBinder != null) {

                                streamerBinder.stopAudio();
                        }
                } catch (RemoteException e) {
                        Log.e("radio", e.toString());
                }

        }

        private void turnOnNotify() {

                String ns = Context.NOTIFICATION_SERVICE;
                NotificationManager nm = (NotificationManager) getSystemService(ns);           
                icon = R.drawable.processing2;
                CharSequence tickerText = InfoStreaming.CURRENT_STATION;
                long when = System.currentTimeMillis();
                Notification notification = new Notification(icon, tickerText, when);
                String contentTitle = InfoStreaming.CURRENT_STATION;
                String contentText = InfoStreaming
                                .getSubMessage(InfoStreaming.CURRENT_STATION);
                Intent notificationIntent = new Intent(maincontext,
                                RadioCapriActivity.class);

                PendingIntent contentIntent = PendingIntent.getActivity(this, 0,
                                notificationIntent, 0);

                notification.flags |= Notification.FLAG_ONGOING_EVENT
                                | Notification.FLAG_NO_CLEAR;

                notification.setLatestEventInfo(maincontext, contentTitle, contentText,
                                contentIntent);
                Log.i("radio", "APRO LA NOTIFICA");
                nm.notify(RadioCapriActivity.PLAYING_ID, notification);
        }

        private void turnOffNotify() {

                try {
                        unbindService(this);
                } catch (IllegalArgumentException e) {
                        Log.e("radio",
                                        "Does not look like we are bound: " + e.toString());
                }
                streamerBinder = null;
                handler.sendEmptyMessage(RadioCapriActivity.LOWERPRIORITY);
                String ns = Context.NOTIFICATION_SERVICE;
                NotificationManager nm = (NotificationManager) getSystemService(ns);
                nm.cancel(RadioCapriActivity.PLAYING_ID);
        }

        public void checkThreadPriority() {
        }

        public void raiseThreadPriority() {
                Process.setThreadPriority(Process.THREAD_PRIORITY_AUDIO);
        }

        public void lowerThreadPriority() {
                Process.setThreadPriority(Process.THREAD_PRIORITY_DEFAULT);
        }
        @Override
        public void onSaveInstanceState(Bundle instanceState) {
                instanceState.putString(STATION, InfoStreaming.CURRENT_STATION);
                instanceState.putString(URL, InfoStreaming.CURRENT_URL);
                instanceState.putBoolean(REGULARSTREAM, currentRegularStream);
                super.onSaveInstanceState(instanceState);
        }

        private void setplaystatus(boolean p) {
                Log.i("radio", "setplaystatus: " + p);
                playstatus = p;
                sound_in_play = p;
        soundPlayPause();

        }
}

Mi scuso forse per la poca chiarezza del codice ma ho dovuto eliminare tanti controlli

IL problema è che quando il cell va in stand bye, il suono continua a sentirsi ma l ' applicazione è chiusa e se si riapre si aggiunge un nuovo suono.

So che si usa il WakeLock ma avete qualche esempio da studiare?
La domanda stupida è quella che non si fa

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3489
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:WakeLock gestione Activity e streaming
« Risposta #1 il: 26 Luglio 2011, 11:22:16 CEST »
0
IL problema è che quando il cell va in stand bye, il suono continua a sentirsi ma l ' applicazione è chiusa e se si riapre si aggiunge un nuovo suono.

So che si usa il WakeLock ma avete qualche esempio da studiare?


Ok ma tu che comportamento vorresti avere? Una roba del genere?
L'activity va in background e il monitor è acceso -> continua la riproduzione
Il monitor si spegne -> si ferma la riproduzione per riprendere quando si riaccende

Offline gsources75

  • Utente normale
  • ***
  • Post: 327
  • Respect: +9
    • Google+
    • pepigno75
    • devandroid_it
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy Nexus S - Vodafone Smart -BB Bold- Iphone 4-
  • Play Store ID:
    Giuseppe+Sorce
  • Sistema operativo:
    Ubuntu-Windows Seven- Mac Lion
Re:WakeLock gestione Activity e streaming
« Risposta #2 il: 26 Luglio 2011, 11:24:39 CEST »
0
Si ho visto adesso lo Snippet, ho cercato la parola WakeLock nel forum ma l avevo scritto male.. le nottate e la fretta non fanno bene.

Ok il comportamento e che si spegne , lo streaming continua e l' activity rimane..., praticamente tutto uguale...

La domanda stupida è quella che non si fa

Offline junior87

  • Nuovo arrivato
  • *
  • Post: 27
  • Respect: 0
    • Mostra profilo
  • Sistema operativo:
    ubuntu win7
Re:WakeLock gestione Activity e streaming
« Risposta #3 il: 27 Ottobre 2011, 00:14:44 CEST »
0
ragazzi una domanda io sto sviluppando un app. ke praticamente quando è attiva premendo il tasto standby il monitor comtinua a visualizzare le immagini e il touch è disattivato... ora sto provando il tutto con l'emulatore con versione di android 4.0 ma quando premi il tasto standby il monitor si spegne, nonostante ho utilizzato il comando del wakelock:    miowakelock = pm.newWakeLock(PowerManager.SCREEN_BRIGHT_WAKE_LOCK,"TesiActivity" );           miowakelock.setReferenceCounted(false);
qualcuno m sa dare una mano e spiegarmi xkè il monitor m và in stadby???? :-X

Offline Verandi

  • Utente normale
  • ***
  • Post: 378
  • Respect: +75
    • Mostra profilo
  • Sistema operativo:
    Windows 7
Re:WakeLock gestione Activity e streaming
« Risposta #4 il: 27 Ottobre 2011, 14:02:56 CEST »
0
Non fare crossposting, avevi scritto già qui: Controllare il WakeLock del telefono - Android Developers Italia   ;-)

Citazione
If you hold a partial wakelock, the CPU will continue to run, irrespective of any timers and even after the user presses the power button. In all other wakelocks, the CPU will run, but the user can still put the device to sleep using the power button.

Quindi devi gestire:
- Schermo con il wakelock quando il telefono va in standby senza che l'utente abbia premuto il pulsante di standby
- Schermo quando l'utente preme il pulsante di standby. A te serve che il pulsante di standby venga disattivato. 

Offline junior87

  • Nuovo arrivato
  • *
  • Post: 27
  • Respect: 0
    • Mostra profilo
  • Sistema operativo:
    ubuntu win7
Re:WakeLock gestione Activity e streaming
« Risposta #5 il: 27 Ottobre 2011, 14:09:58 CEST »
0
allora io devo gestire ke premendo il tasto standby il monitor continua a riprodurre  l'immaggine o video ke c'erà e il touch venga disattivato... come devo fare????