¿Cómo mostrar un SplashScreen para decir que la aplicación está “cargando”?

publicado por: Anonymous

Necesito mostrar un progressbar estilo loading, me explico:

EL primer activity que se lanza es un splashscreen, luego de este viene un activity en donde automáticamente comienza a funcionar la clase mplayer con una url externa. Sucede que tarda un tiempo variable (según estado de la red y otras condiciones) en aparecer el segundo activity y en ese lapsus muestra una pantalla negra. Es en ese momento que deseo agregar un loadig por mientras se obtiene la información de la url externa de la clase mplayer.

Muestro el código del layout de mi activity donde tengo el player.

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/LinearLayout1"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.example.streamingcoop.MainActivity">

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

    <TextView
        android:id="@+id/txt_noticias"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="NOTICIAS"
        android:textSize="@dimen/abc_action_bar_progress_bar_size" />

</LinearLayout>

<TableLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_weight="1">

    <TableRow
        android:id="@+id/tableRow1"
        android:layout_weight="1"
        android:gravity="center"
        android:paddingLeft="20dp"
        android:paddingRight="20dp">

        <LinearLayout
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:layout_weight="1"
            android:orientation="vertical">

            <Button
                android:id="@+id/button1"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:text="Deportes" />

            <Button
                android:id="@+id/button2"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:text="Política" />
        </LinearLayout>

    </TableRow>

    <ProgressBar
        android:id="@+id/mi_loading"
        android:layout_width="748dp"
        android:layout_height="102dp"
        android:indeterminate="false" />

    <TableRow
        android:id="@+id/tableRow2"
        android:layout_weight="1"
        android:gravity="center"
        android:paddingBottom="10dp"
        android:paddingLeft="20dp"
        android:paddingRight="20dp"
        android:paddingTop="20dp">

        <LinearLayout
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:layout_weight="1"
            android:gravity="center"
            android:orientation="vertical"
            android:paddingLeft="20dp">

            <Button
                android:id="@+id/button3"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:text="Economía" />

            <Button
                android:id="@+id/button4"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:singleLine="false"
                android:text="Entretención" />

        </LinearLayout>

    </TableRow>
</TableLayout>

<RelativeLayout
    android:id="@+id/reproductor"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_gravity="bottom"
    android:orientation="vertical">

    <ImageButton
        android:id="@+id/stop"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:src="@android:drawable/ic_media_pause" />

    <ImageButton
        android:id="@+id/play"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_gravity="bottom"
        android:src="@android:drawable/ic_media_play"
        android:visibility="invisible"
        android:layout_alignParentTop="true"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true" />

</RelativeLayout>

Muestro el código del activity donde está el player.

public class MainActivity extends Activity implements OnClickListener {
    static MediaPlayer mPlayer;
    ImageButton buttonPlay;
    ImageButton buttonStop;
    String url = "url";
    Button btn_politica, btn_deportes, btn_espectaculo, btn_entretencion;
    ProgressBar progressbar;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //setContentView(R.layout.splash);//analiza el archivo XML, traduce a objetos cada componente,
        //le asigna los atributos, establece contenedores y todas las relaciones
        //padre e hijo necesarias.

        progressbar = (ProgressBar) findViewById(R.id.mi_loading);
       // progressbar_splash=(ProgressBar) findViewById(R.id.mi_loading_splash);
        progressbar.setVisibility(View.VISIBLE);

        //Bloque de codigo para el streaming al cargar el activity
        mPlayer = new MediaPlayer();
        mPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
        mPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
            @Override
            public void onPrepared(MediaPlayer mp) {
                progressbar.setVisibility(View.INVISIBLE);
               // progressbar_splash.setVisibility(View.INVISIBLE);
                 //Toast.makeText(getApplicationContext(), "Ya cargó!!", Toast.LENGTH_LONG).show();


            }
        });
        try {
            mPlayer.setDataSource(url);
        } catch (IllegalArgumentException e) {
            Toast.makeText(getApplicationContext(), "You might not set the URI correctly!", Toast.LENGTH_LONG).show();
        } catch (SecurityException e) {
            Toast.makeText(getApplicationContext(), "You might not set the URI correctly!", Toast.LENGTH_LONG).show();
        } catch (IllegalStateException e) {
            Toast.makeText(getApplicationContext(), "You might not set the URI correctly!", Toast.LENGTH_LONG).show();
        } catch (IOException e) {
            e.printStackTrace();
        }
        try {
            mPlayer.prepare();

        } catch (IllegalStateException e) {
            Toast.makeText(getApplicationContext(), "You might not set the URI correctly!", Toast.LENGTH_LONG).show();
        } catch (IOException e) {
            Toast.makeText(getApplicationContext(), "You might not set the URI correctly!", Toast.LENGTH_LONG).show();
        }
        mPlayer.start();
        //Finaliza bloque de codigo para cargar el streaming al inicio de la aplicacion+

        initialize();

        //Bloque de codigo para el streaming al presionar play
        buttonPlay = (ImageButton) findViewById(R.id.play);
        buttonPlay.setOnClickListener(new OnClickListener() {

            public void onClick(View v) {
                mPlayer = new MediaPlayer();
                mPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
                mPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
                    @Override
                    public void onPrepared(MediaPlayer mp) {
                    progressbar.setVisibility(View.INVISIBLE);

                      //Toast.makeText(getApplicationContext(), "Cargandooooooo", Toast.LENGTH_LONG).show();

                    }
                });
                try {
                    mPlayer.setDataSource(url);
                } catch (IllegalArgumentException e) {
                    Toast.makeText(getApplicationContext(), "You might not set the URI correctly!", Toast.LENGTH_LONG).show();
                } catch (SecurityException e) {
                    Toast.makeText(getApplicationContext(), "You might not set the URI correctly!", Toast.LENGTH_LONG).show();
                } catch (IllegalStateException e) {
                    Toast.makeText(getApplicationContext(), "You might not set the URI correctly!", Toast.LENGTH_LONG).show();
                } catch (IOException e) {
                    e.printStackTrace();
                }
                try {
                    mPlayer.prepare();
                    // progressbar = (ProgressBar) findViewById(R.id.mi_loading);
                    //progressbar.setVisibility(View.GONE);
                } catch (IllegalStateException e) {
                    Toast.makeText(getApplicationContext(), "You might not set the URI correctly!", Toast.LENGTH_LONG).show();
                } catch (IOException e) {
                    Toast.makeText(getApplicationContext(), "You might not set the URI correctly!", Toast.LENGTH_LONG).show();
                }
                mPlayer.start();
                // progressbar.setVisibility(View.INVISIBLE);
                buttonPlay.setVisibility(View.INVISIBLE);
                buttonStop.setVisibility(View.VISIBLE);

            }
        });

        //Bloque de codigo para el streaming al presionar pause
        buttonStop = (ImageButton) findViewById(R.id.stop);
        buttonStop.setOnClickListener(new OnClickListener() {

            public void onClick(View v) {
                // TODO Auto-generated method stub
                if (mPlayer != null && mPlayer.isPlaying()) {
                    mPlayer.stop();
                    //buttonPlay.setEnabled(true);
                    buttonPlay.setVisibility(View.VISIBLE);
                    buttonStop.setVisibility(View.INVISIBLE);
                   // progressbar.setVisibility(View.INVISIBLE);
                }
            }
        });
    }

    private void initialize() {
        btn_deportes = (Button) findViewById(R.id.button1);
        btn_deportes.setOnClickListener(this);

        btn_politica = (Button) findViewById(R.id.button2);
        btn_politica.setOnClickListener(this);

        btn_espectaculo = (Button) findViewById(R.id.button3);
        btn_espectaculo.setOnClickListener(this);

        btn_entretencion = (Button) findViewById(R.id.button4);
        btn_entretencion.setOnClickListener(this);
    }
    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.button1:
                startActivity(new Intent(this, Activity_Noticias_Deportes.class));
                break;
            case R.id.button2:
                startActivity(new Intent(this, Activity_Noticias_Politica.class));
                break;
            case R.id.button3:
                startActivity(new Intent(this, Activity_Noticias_Economia.class));
                break;
            case R.id.button4:
                startActivity(new Intent(this, Activity_Noticias_Entretencion.class));
                break;
        }
    }
    protected void onDestroy() {
        super.onDestroy();
        // TODO Auto-generated method stub
        if (mPlayer != null) {
            mPlayer.release();
            mPlayer = null;
        }
    }
}

Muestro el código del primer Activity, el Splash

public class Splash extends Activity {
private AlertDialog.Builder mBuilderWait;
private static final long SPLASH_SCREEN_DELAY = 2000;

@Override
protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);

    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
    requestWindowFeature(Window.FEATURE_NO_TITLE);
    setContentView(R.layout.splash);
   // progressbar = (ProgressBar) findViewById(R.id.mi_loading);
   // lanzarthread();
    TimerTask task = new TimerTask() {
        @Override
        public void run() {
            // Start the next activity


            Intent mainIntent = new Intent().setClass(
                    Splash.this, MainActivity.class);
            startActivity(mainIntent);

            // Close the activity so the user won't able to go back this
            // activity pressing Back button
            finish();
        }
    };
    // Simulate a long loading process on application startup.
    Timer timer = new Timer();
    timer.schedule(task, SPLASH_SCREEN_DELAY);
}
private void lanzarthread() {
    Thread timer = new Thread() {
        public void run() {
            try {
                sleep(2000); //se duerme por 2 segundos
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();//muestra error de ejecucion en consola
            } finally {//pase lo que pase debe saltar a la siguiente pantalla.
                Intent intent = new Intent(Splash.this, MainActivity.class); //instanciamos el objeto Intent y lo inicializamos desde splash hasta MainActivity
                startActivity(intent);
            }
        }

    };
    timer.start();
}

}

solución

Simplemente podrías agregar un progressBar en tu Activity, por ejemplo:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".SplashScreenActivity" >

                    <ProgressBar 
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_centerInParent="true" />

</RelativeLayout>

y cuando tu video/mp3 este listo por medio del listener setOnPreparedListener() has el progressBar invisible:

mediaPlayer.setOnPreparedListener(new OnPreparedListener(){

    @Override
        public void onPrepared(MediaPlayer mp) {
            progressBar.setVisibility(View.INVISIBLE); // esconde el progressBar.
        }
    });

En el caso de tu ejemplo creas varias instancias de MediaPlayer lo cual es incorrecto, puedes tener sola una instancia durante la vida de la actividad, ve este ejemplo :

  progressbar.setVisibility(View.VISIBLE);

            try {
                //Bloque de codigo para el streaming al cargar el activity
                mPlayer = new MediaPlayer();
                mPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
                mPlayer.setDataSource(url);
                mPlayer.prepare();
            } catch (IOException e) {
                Log.e("ERROR",e.getMessage());
                Toast.makeText(getApplicationContext(), "Ocurrio un ERROR!!", Toast.LENGTH_LONG).show();
            }

            mPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
                @Override
                public void onPrepared(MediaPlayer mp) {
                    progressbar.setVisibility(View.INVISIBLE);
                    Toast.makeText(getApplicationContext(), "Ya cargó!!", Toast.LENGTH_LONG).show();
                    progressbar.setVisibility(View.INVISIBLE);
                    mPlayer.start();
                }
            });

Esto sería tu código corregido:

public class VideoActivity extends Activity implements View.OnClickListener {

        static MediaPlayer mPlayer;
        ImageButton buttonPlay;
        ImageButton buttonStop;
        String url = "http://programmerguru.com/android-tutorial/wp-content/uploads/2013/04/hosannatelugu.mp3";
        Button btn_politica, btn_deportes, btn_espectaculo, btn_entretencion;
        ProgressBar progressbar;

        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            //setContentView(R.layout.splash);//analiza el archivo XML, traduce a objetos cada componente,
            //le asigna los atributos, establece contenedores y todas las relaciones
            //padre e hijo necesarias.

            progressbar = (ProgressBar) findViewById(R.id.mi_loading);
            // progressbar_splash=(ProgressBar) findViewById(R.id.mi_loading_splash);
            progressbar.setVisibility(View.VISIBLE);

            try {
                //Bloque de codigo para el streaming al cargar el activity
                mPlayer = new MediaPlayer();
                mPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
                mPlayer.setDataSource(url);
                mPlayer.prepare();
            } catch (IOException e) {
                Log.e("ERROR",e.getMessage());
                Toast.makeText(getApplicationContext(), "Ocurrio un ERROR!!", Toast.LENGTH_LONG).show();
            }

            mPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
                @Override
                public void onPrepared(MediaPlayer mp) {
                    progressbar.setVisibility(View.INVISIBLE);
                    Toast.makeText(getApplicationContext(), "Ya cargó!!", Toast.LENGTH_LONG).show();
                    Log.i("VIDEO", "ProgressBar Invisible!");
                    progressbar.setVisibility(View.INVISIBLE);
                    mPlayer.start();
                }
            });
            //Finaliza bloque de codigo para cargar el streaming al inicio de la aplicacion+
            initialize();
            //Bloque de codigo para el streaming al presionar play
            buttonPlay = (ImageButton) findViewById(R.id.play);
            buttonPlay.setOnClickListener(new View.OnClickListener() {
                public void onClick(View v) {
                    if (mPlayer != null && !mPlayer.isPlaying()) {
                        try {
                            Log.i("INFO", "ProgressBar Visible! =) ");
                            // Aquí se hace el progressBar visible y cuando                      este preparado el video para reproducción se ejectua onPrepared() que hace el progressBar invisible.
                            progressbar.setVisibility(View.VISIBLE);
                            mPlayer.prepare();
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                        buttonPlay.setVisibility(View.INVISIBLE);
                        buttonStop.setVisibility(View.VISIBLE);
                    }

                }
            });

            //Bloque de codigo para el streaming al presionar pause
            buttonStop = (ImageButton) findViewById(R.id.stop);
            buttonStop.setOnClickListener(new View.OnClickListener() {

                public void onClick(View v) {
                    if (mPlayer != null && mPlayer.isPlaying()) {
                        mPlayer.stop();
                        buttonPlay.setVisibility(View.VISIBLE);
                        buttonStop.setVisibility(View.INVISIBLE);
                    }
                }
            });
        }

        private void initialize() {
            btn_deportes = (Button) findViewById(R.id.button1);
            btn_deportes.setOnClickListener(this);

            btn_politica = (Button) findViewById(R.id.button2);
            btn_politica.setOnClickListener(this);

            btn_espectaculo = (Button) findViewById(R.id.button3);
            btn_espectaculo.setOnClickListener(this);

            btn_entretencion = (Button) findViewById(R.id.button4);
            btn_entretencion.setOnClickListener(this);
        }

        @Override
        public void onClick(View v) {
            switch (v.getId()) {
                case R.id.button1:
                    startActivity(new Intent(this, Activity_Noticias_Deportes.class));
                    break;
                case R.id.button2:
                    startActivity(new Intent(this, Activity_Noticias_Politica.class));
                    break;
                case R.id.button3:
                    startActivity(new Intent(this, Activity_Noticias_Economia.class));
                    break;
                case R.id.button4:
                     startActivity(new Intent(this, Activity_Noticias_Entretencion.class));
                    break;
            }
        }

        protected void onDestroy() {
            super.onDestroy();
            if (mPlayer != null) {
                mPlayer.release();
                mPlayer = null;
            }
        }
    }

Recuerda el permiso

 <uses-permission android:name="android.permission.INTERNET"/>

ya que estas cargando tu recurso desde internet.

Respondido por: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *