2

Hy guys ;) I have a big question: How can i let a webview continue playing audio in background? Here is my code of MainActivity (there is useless code, i know, i'm adjusting it)

package com.radio.radiostar;

import android.app.AlertDialog;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.media.MediaPlayer;
import android.media.MediaPlayer.OnBufferingUpdateListener;
import android.media.MediaPlayer.OnPreparedListener;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.support.v4.app.NotificationCompat;
import android.support.v7.app.ActionBarActivity;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.webkit.WebSettings;
import android.webkit.WebSettings.PluginState;
import android.webkit.WebView;
import android.widget.Button;

import java.io.IOException;

    public class MainActivity extends ActionBarActivity implements OnClickListener {

    private final static String RADIO_STATION_URL = "";

    private Button buttonPlay;

    private Button buttonStopPlay;

    private MediaPlayer player;

    /**
     * Called when the activity is first created.
     */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        WebView wv = (WebView) findViewById(R.id.webView1);

        WebSettings webSettings = wv.getSettings();
        wv.getSettings().setJavaScriptEnabled(true);
        wv.getSettings().setAppCacheEnabled(true);
        webSettings.setBuiltInZoomControls(false);

        wv.loadUrl("http://www.ustream.tv/embed/679978?v=3&wmode=direct");

        initializeUIElements();

        initializeMediaPlayer();
    }

    private void initializeUIElements() {
        SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this);
        boolean initialDialogDisplayed = preferences.getBoolean("InitialDialog", false);
        if (!initialDialogDisplayed) {
            Editor editor = preferences.edit();
            editor.putBoolean("InitialDialog", true);
            editor.commit();

            // Display the dialog here
            AlertDialog.Builder builder = new AlertDialog.Builder(this);
            builder.setTitle(" Attenzione");
            builder.setMessage(" Benvenuti nell'App Radio Star! Questa app necessita di una connessione ad internet per riprodurre la diretta, basata sul sito web di telesardegnanetwork."
                    + "Abilitate quindi una rete WiFi, o una rete dati, prima di premere il tasto Play."
                    + "Grazie per l'attenzione! ")
                    .setPositiveButton("Okay", new DialogInterface.OnClickListener() {

                        public void onClick(DialogInterface dialog, int id) {
                        }
                    }).show();
        }
    }

    public void onClick(View v) {
        if (v == buttonPlay) {
            startPlaying();
            Context context = getApplicationContext();
            CharSequence text = "In Connessione...";
            int duration = android.widget.Toast.LENGTH_LONG;
            android.widget.Toast toast = android.widget.Toast.makeText(context, text, duration);
            toast.show();
            Intent intent = new Intent(this, MainActivity.class);
            PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_CANCEL_CURRENT);
            NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(this)
                    .setSmallIcon(R.drawable.ic_launcher)
                    .setContentTitle("Radio Star")
                    .setContentText("In Diretta")
                    .setContentIntent(pendingIntent);
            NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
            notificationManager.notify(0, mBuilder.build());

        }
        else if (v == buttonStopPlay) {
            stopPlaying();
            Intent svc = new Intent(this, BackgroundSoundService.class);
            startService(svc);
        }
    }

    private void startPlaying() {
        if (player.isPlaying()) {
            buttonPlay.setVisibility(View.INVISIBLE);
        }
        buttonStopPlay.setEnabled(true);
        buttonPlay.setEnabled(false);
        buttonPlay.setVisibility(View.INVISIBLE);

        player.prepareAsync();

        player.setOnPreparedListener(new OnPreparedListener() {
            public void onPrepared(MediaPlayer mp) {
                player.start();
            }
        });
    }

    private void stopPlaying() {
        if (player.isPlaying()) {
            player.stop();
            player.release();
            initializeMediaPlayer();
            NotificationManager notificationManager = (NotificationManager) getApplicationContext().getSystemService(NOTIFICATION_SERVICE);
            notificationManager.cancel(0);
        }

        buttonPlay.setEnabled(true);
        buttonStopPlay.setEnabled(false);

        buttonPlay.setVisibility(View.VISIBLE);
    }

    private void initializeMediaPlayer() {
        player = new MediaPlayer();
        try {
            player.setDataSource(RADIO_STATION_URL);
        }
        catch (IllegalArgumentException e) {
            e.printStackTrace();
        }
        catch (IllegalStateException e) {
            e.printStackTrace();
        }
        catch (IOException e) {
            e.printStackTrace();
        }

        player.setOnBufferingUpdateListener(new OnBufferingUpdateListener() {

            public void onBufferingUpdate(MediaPlayer mp, int percent) {
                Log.i("Buffering", "" + percent);
            }
        });
    }

    @Override
    public void onBackPressed() {
        moveTaskToBack(false);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        startActivity(new Intent(MainActivity.this, SecondActivity.class));   // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();
        if (id == R.id.action_settings) {
            return true;
        }
        return super.onOptionsItemSelected(item);
    }
}

Can someone maybe help me? Thanks guys ;)

beresfordt
  • 5,088
  • 10
  • 35
  • 43
Fabio Pinna
  • 75
  • 3
  • 9
  • And what is the problem? Please explain your issue in a better way. – joao2fast4u Mar 23 '15 at 22:14
  • 1
    @joao2fast4u Ustream don't provide a direct audio stream url (there is something about Oauth on a page about this, but i think it's complicated), so i must load the player as webview. The problem is that in this mode i have no background service (implemented with old method on this app) because webview have different rules (i suppose). So my question is how to let my app run in background when the ustream player is active ;) – Fabio Pinna Mar 24 '15 at 06:40

1 Answers1

1

I think for Android, app (your activity) get kill once it is not on the main screen. (Refer to the doc for more info about Android Life Cycle)

One way to run your app in background is to run it as Services.

Or you can send the URL back from the webView using this hack mentioned here:

1) catch the onJsAlert in the Android App.
2) then use webView.loadUrl("javascript:alert(functionThatReturnsMusicURL)") to trigger the JS in the web page to return your song address.

Then you can launch an intent to open the song in the default music player like this to "play it in the background":

Uri musicUri = Uri.parse("yourMusicURL");
Intent myIntent = new Intent(android.content.Intent.ACTION_VIEW); 
myIntent.setDataAndType(musicUri, "audio/*"); 
startActivity(intent);
Community
  • 1
  • 1
kaho
  • 4,746
  • 1
  • 16
  • 24
  • do you think that this will work also with ustream player? Because they don't provide any direct stream url – Fabio Pinna Mar 24 '15 at 06:42
  • the intent method would not work in this case. But you can still try to make a service to do it. – kaho Mar 24 '15 at 14:50