Olá Gente, Estou com uma dúvida que com certeza é boba mas eu não estou conseguindo implementar.
Estou desenvolvendo um player de vídeo no android, porém eu fiz praticamente todo o código em um único arquivo.
Agora quero melhorar a estrutura do sistema e separar as funções em arquivos separados e só chama-las quando precisar.
Por exemplo:
* 01 - No código da activity principal está o codigo que oculta a barra de navegação,
* 02 - existe outro que cria os diretórios que o programa irá usar,
* 03 - outro define o endereço da playlist e verifica se ela existe além de copiar seu conteúdo
para uma lista que será usada pelo player.
* 04 - em outro código inicia a reprodução dos vídeos.
Gostaria de separar estas funções mas não estou conseguindo, o máximo que consegui foi
chamar a activity da splashscreen, mas não estou conseguindo chamar a que oculta a barra
de navegação, a tela da uma piscada e o app não é executado.
Vamos começar pelo código que oculta a barra de navegação? depois vamos para os demais,
talvez nem precise, e eu já consiga entender como fazer com a ajuda de vocês.
Abaixo vou postar 04 códigos:
01 - o ORIGINAL onde tudo funciona mas está no mesmo arquivo.
02 - o NOVO onde estou separando e já consigo chamar a splash screen, mas quando chama
a parte que oculta a barra de navegação da erro.
03 - Código da SplashScreen chamada pelo novo código (02).
04 - Código para ocultar a barra.
Obrigado a quem puder ajudar.
01 - o ORIGINAL onde tudo funciona mas está no mesmo arquivo.
```
package delai.org.delaitvplayer;
import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.io.FileReader;
import java.util.ArrayList;
import java.util.List;
import android.media.MediaPlayer;
import android.os.Bundle;
import android.os.Environment;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.view.Gravity;
import android.view.View;
import android.widget.VideoView;
import android.widget.Toast;
//import android.net.Uri;
//import android.view.Menu;
//import android.widget.MediaController;
public class MainActivity extends Activity
{
// Estas variáveis são usadas pelo VidewView.
private VideoView video;
private List<String> list;
private int count = 1;
// Esta linha é necessária para que a linha "getWindow()..." oculte a barra de navegação
// Quando esta Activity for aberta.
@SuppressLint({ "NewApi", "InlinedApi" })
@Override
public void onCreate(Bundle b)
{
super.onCreate(b);
/** OCULTANDO A BARRA DE NAVEGAÇÃO DO TABLET - INICIO
* ------------------------------------------------------------*/
/* Esta linha faz com que a barra de navegação do tablet seja ocultada logo que
* esta Activity é iniciada,
* No emulador com android 2.2 o app travou por causa dela */
getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_HIDE_NAVIGATION);
/** OCULTANDO A BARRA DE NAVEGAÇÃO DO TABLET - FIM
* ------------------------------------------------------------*/
/* As barras de status e de título foram removidas diretamente no arquivo "Manifest",
* foi add a linha: "android:theme="@android:style/Theme.NoTitleBar.Fullscreen"
* na Activity do reprodutor de vídeos, a mesma onde está o "SurfaceView", pois só assim
* a parte de baixo da tela que não foi preenchida pelo vídeo ficou escura.
* Quando utilizei o outro método adicionando os comandos aqui o fundo ficava branco. */
/** CRIANDO AS PASTAS DO APP - INICIO
* ------------------------------------------------------------*/
// Necessita importar "import android.os.Environment"
// Necessita adicionar permissão abaixo no android manifest:
/** --------------------------------------------------------------------------------
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
------------------------------------------------------------------------------------- */
// Cria pasta "dtvplayer" no SD card "memória interna",
new File(Environment.getExternalStorageDirectory(), "dtvplayer" ).mkdir();
// Cria pasta "videos" dentro da pasta "dtvplayer"
new File("mnt/sdcard/dtvplayer/", "videos" ).mkdir();
// Cria pasta "files" dentro da pasta "dtvplayer"
new File("mnt/sdcard/dtvplayer/", "files" ).mkdir();
/** CRIANDO AS PASTAS DO APP - FIM
* ------------------------------------------------------------*/
/** DEFININDO ENDEREÇO DO ARQUIVO PLAYLIST.TXT - INICIO
* ------------------------------------------------------------*/
/* Instanciando o objeto do tipo File, aqui é definido onde está
localizada a playlist.txt e o nome do objeto que contém o
endereço, neste caso o objeto se chama "playList". */
File playList = new File("mnt/sdcard/dtvplayer/files/","playlist.txt");
/** DEFININDO ENDEREÇO DO ARQUIVO PLAYLIST.TXT - FIM
* ------------------------------------------------------------*/
// VERIFICANDO SE O ARQUIVO PLAYLIST EXISTE
// Se o arquivo "playlist.txt" existir...
if (playList.exists())
{
// Segue tentando copiar o conteúdo dele para a string list.
/** PASSANDO A PLAYLIST DO ARQUIVO TXT PARA A STRING LIST - INICIO
* ------------------------------------------------------------*/
// Criando a lista
list = new ArrayList<String>();
// As classes FileReader e BuferedReader servem para ler arquivos de texto.
FileReader fr = null;
try
{
// Construtor que recebe o objeto do tipo File "playList" contendo
// o endereço do arquivo "playlist.txt".
fr = new FileReader(playList);
// Construtor que recebe o objeto do tipo FieReader "fr".
BufferedReader br = new BufferedReader(fr);
// Laço "while" que vai copiar os dados do arquivo de texto para a lista.
// Enquanto houver mais linhas para ler...
while (br.ready())
{
// A proxima linha será lida...
String linha = br.readLine();
// E o conteúdo adicionado na lista "list" a partir da 2ª posição,
// como a lista inicia em "0" a 2ª posição é "1", a 3ª é "2", assim por diante.
list.add(linha);
}// FIM DO WHILE
// Fechando os recursos FileReader e BuferedReader.
br.close();
fr.close();
}
catch (IOException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
/** PASSANDO A PLAYLIST DO ARQUIVO TXT PARA A STRING LIST - FIM
* ------------------------------------------------------------*/
/** INICIANDO A REPRODUÇÃO DOS VÍDEOS - INÍCIO
* ------------------------------------------------------------*/
// Instanciando o player.
video = new VideoView(this);
setContentView(video);
// Executando o reprodutor de vídeo pela primeira vez.
callVideo();
/** INICIANDO A REPRODUÇÃO DOS VÍDEOS - FIM
* ------------------------------------------------------------*/
/** LISTENER PARA EFETUAR O LOOP - INICIO
* ------------------------------------------------------------*/
video.setOnCompletionListener(
new MediaPlayer.OnCompletionListener()
{
// Assim que o vídeo for concluido.
public void onCompletion(MediaPlayer mp)
{
// Não sei para que server este código, perguntar thiengo.
// if(mp != null) { mp.reset(); }
// O reprodutor de vídeo será executado novamente.
callVideo();
}// FIM DO PUBLIC VOIDON COMPLETION(MEDIAPLAYER MP)
}// FIM DO NEW MEDIAPLAYER.ONCOMPLETIONLISTENER
);// FIM DO VIDEO.SETONCOMPLETIONLISTENER
/** LISTENER PARA EFETUAR O LOOP - FIM
* ------------------------------------------------------------*/
} // FIM DO IF(!PLAYLIST.EXISTS()) "Se arquivo playlist.txt existir"
// Caso não exista o arquivo playlist.txt...
else
{
// Exibe mensagem informando...
Toast.makeText(getApplicationContext(), "ARQUIVO ''playlist.txt'' NÃO ENCONTRADO" , Toast.LENGTH_LONG).show();
// E encerra o programa.
finish();
}
} //FIM DO PUBLIC VOID ONCREATE...
/** REPRODUTOR DE VÍDEO - INICIO
* ------------------------------------------------------------*/
/* Necessário para acessar o endereços do sdcard e ocultar a barra
* de navegação sempre que um novo vídeo se inicia */
@SuppressLint({ "SdCardPath", "NewApi", "InlinedApi" })
private void callVideo()
{
// Reprodutor é finalizado para começar o novo vídeo.
video.stopPlayback();
// A String videoDir recebe o endereço da pasta dos vídeos.
String videosDir = "/mnt/sdcard/dtvplayer/videos/";
// A String VideoName recebe o nome do próximo vídeo que será
// reproduzido baseado no count que representa a posição atual
// da lista.
String videoName = list.get(count);
// VERIFICA SE A LINHA ATUAL DA LISTA É NULA OU VAZIA.
// Enquanto a linha estiver NULL ou VAZIA...
while(videoName == null || videoName.trim().equals(""))
{
// Exibe uma mensagem informando que a linha está vazia ou nula.
// Criei um Toast personalizado para ficar no canto inferior esquerdo da tela.
Toast customToast = new Toast(getBaseContext());
customToast = Toast.makeText(getBaseContext(), "LINHA " + count + " VAZIA", Toast.LENGTH_LONG);
customToast.setGravity(Gravity.BOTTOM|Gravity.LEFT, 0, 0);
customToast.show();
//Incrementa "1" ao contador...
count++;
// videoName recebe o nome do próximo vídeo, correspondente a posição atual do "count".
videoName = list.get(count);
}
// VERIFICAR SE O VÍDEO EXISTE.
// Cria um objeto File contendo o endereço do vídeo atual.
File file = new File(videosDir + videoName);
// Enquanto o vídeo não existir...
while (!file.exists())
{
// Exibe uma mensagem informando qual o arquivo não existe.
// Criei um Toast personalizado para ficar no canto inferior esquerdo da tela.
Toast customToast = new Toast(getBaseContext());
customToast = Toast.makeText(getBaseContext(), "ARQUIVO NÃO ENCONTRADO: " + videoName , Toast.LENGTH_LONG);
customToast.setGravity(Gravity.BOTTOM|Gravity.LEFT, 0, 0);
customToast.show();
//Incrementa "1" ao contador...
count ++;
// videoName recebe o nome do próximo vídeo, correspondente a posição atual do "count".
videoName = list.get(count);
// Objeto "file" recebe o endereço completo do próximo vídeo para nova verificação...
file = new File(videosDir + videoName);
}
// APÓS GARANTIDO QUE NÃO HÁ LINHA VAZIA E O ARQUIVO EXISTE O CÓDIGO SEGUE PARA REPRODUÇÃO.
// As Strings "videoDir" e "videoName" são unidas para indicar
// o caminho completo do próximo vídeo a ser reproduzido.
video.setVideoPath(videosDir + videoName);
// É iniciada a reprodução do vídeo constante no VideoPath.
video.start();
// Verifica se a lista chegou ao fim.
if(count+1 < list.size())
{
// se não, add "1" ao contador.
count++;
}// FIM DO IF
else
{
// Se chegou ao fim, volta o contador para a primeira posição da lista.
// para reproduzir desde o início novamente.
count = 1;
}// FIM DO ELSE
/* Esta linha faz com que a barra de navegação do tablet seja ocultada
* sempre que um vídeo novo se inicia */
getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_HIDE_NAVIGATION);
}// FIM DO PRIVATE VOID CALLVIDEO
/** REPRODUTOR DE VÍDEO - FIM
* ------------------------------------------------------------*/
}// FIM DO PUBLIC CLASS MAINACTIVITY...
```
02 - o NOVO onde estou separando e já consigo chamar a splashscreen, mas quando chama
a parte que oculta a barra de navegação da erro.
```
package delai.org.delaitvplayer;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
public class ActivityPrincipal extends Activity
{
/* Esta classe "ActivityPrincipal" é classe inicial do app, ela é executada antes de
* todas e é ela que vai chamar as demais.
* Ela é agora a classe principal, pois é a primeira a ser executada, então devem
* ser modificadas algumas linhas no Manifest, adicionando esta activity como principal
* mas mantendo as antigas classes no manifest, ficou assim: */
/** ACTIVITY PRINCIPAL (ActivityPrincipal.java):
---------------------------------------------------------------------------
<activity
android:name="delai.org.delaitvplayer.ActivityPrincipal"
android:label="@string/app_name"
android:screenOrientation="landscape"
android:configChanges="orientation"
android:theme="@android:style/Theme.NoTitleBar.Fullscreen" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
---------------------------------------------------------------------------
<activity
android:name="delai.org.delaitvplayer.SplashScreen"
android:label="@string/app_name"
android:screenOrientation="landscape"
android:configChanges="orientation"
android:theme="@android:style/Theme.NoTitleBar.Fullscreen" />
---------------------------------------------------------------------------
<activity android:name="delai.org.delaitvplayer.MainActivity"
android:label="@string/app_name"
android:screenOrientation="landscape"
android:configChanges="orientation"
android:theme="@android:style/Theme.NoTitleBar.Fullscreen"/>
-------------------------------------------------------------------------- */
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
/** CHAMANDO A ACTIVITY QUE OCULTA A BARRA DE NAVEGAÇÃO - INICIO
--------------------------------------------------------------*/
Intent i1 = new Intent(ActivityPrincipal.this, OcultaBarraNavegacao.class);
startActivity(i1);
/** CHAMANDO A ACTIVITY QUE OCULTA A BARRA DE NAVEGAÇÃO - FIM
*-------------------------------------------------------------*/
/** CHAMANDO A ACTIVITY SPLASHSCREEN - INICIO
* ------------------------------------------------------------*/
Intent i2 = new Intent(ActivityPrincipal.this, SplashScreen.class);
startActivity(i2);
/** CHAMANDO A ACTIVITY SPLASHSCREEN - FIM
*-------------------------------------------------------------*/
} //FIM DO PUBLIC VOID ON CREATE...
} //FIM DO PUBLIC CLASS ACTIVITYPRINCIPAL...
```
03 - Código da SplashScreen chamada pelo novo código (02).
```
package delai.org.delaitvplayer;
import android.app.Activity;
import android.os.Bundle;
import android.view.MotionEvent;
public class SplashScreen extends Activity
{
private Thread mSplashThread;
private boolean mblnClicou = false;
/* Esta classe "SplashScreen" é da tela de apresentação do app, ela vai ficar sendo
* exibida enquanto o programa é iniciado e executa tarefas de segundo plano.
* Ela também foi adicionada no manifest e ficou assim: */
/** ACTIVITY SPLASH SCREEN:
---------------------------------------------------------------------------
<activity
android:name="delai.org.delaitvplayer.SplashScreen"
android:label="@string/app_name"
android:screenOrientation="landscape"
android:configChanges="orientation"
android:theme="@android:style/Theme.NoTitleBar.Fullscreen" />
---------------------------------------------------------------------------*/
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_splashscreen);
/** EXIBINDO A TELA DE SPLASH E CHAMANDO A PRINCIPAL - INICIO
*------------------------------------------------------------*/
// Thread para mostrar uma tela de Splash
mSplashThread = new Thread()
{
@Override
public void run()
{
/* try {
synchronized(this)
{
Espera por 2 segundos ou sai quando o usuário tocar na tela.
wait(3000);
mblnClicou = true;
}
}// FIM DO TRY SYNCRHONIZED
catch(InterruptedException ex)
{
}// FIM DO CATCH SYNCHRONIZED */
if (mblnClicou)
{
// Fechar a tela de Splash.
finish();
/* Carrega a classe MainActivity (que exibe os vídeos)
Intent i = new Intent();
i.setClass(SplashScreen.this, MainActivity.class);
startActivity(i); */
}// FIM DO IF(MBINCLICOU)
}// FIM DO PUBLIC VOID RUN
}; // FIM DO MSPLASTHREAD...
mSplashThread.start();
}// FIM DO PUBLIC VOID ON CREATE...
@Override
public void onPause()
{
super.onPause();
// Garante que quando o usuário clicar no botão "Voltar" o sistema deve finalizar a thread
mSplashThread.interrupt();
}// FIM DO PUBLIC VOID ONPAUSE
@Override
public boolean onTouchEvent(MotionEvent event)
{
if (event.getAction() == MotionEvent.ACTION_DOWN)
{
// O método abaixo está relacionado a thread de splash
synchronized(mSplashThread)
{
mblnClicou = true;
// O método abaixo finaliza o comando wait
// Mesmo que ele não tenha terminado sua espera
mSplashThread.notifyAll();
}// FIM DO SYNCHRONIZED(MSPLASHTHREAD)
}// FIM DO IF(EVENT.GERACTION()...
return true;
}// FIM DO PUBLIC BOOLEAN ONTOUCHEVENT...
/** EXIBINDO A TELA DE SPLASH E CHAMANDO A PRINCIPAL - FIM
*------------------------------------------------------------*/
}// FIM DO PUBLIC CLASS SPLASHSCREEN...
```
04 - Código para ocultar a barra.
```
package delai.org.delaitvplayer;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
public class OcultaBarraNavegacao extends Activity
{
/* Esta Activity "OcultaBarraNavegacao" vai ocultar a barra inferior de navegacao
* do dispositivo. ela também deve ser adicionana no manifest logo abaixo das
* activitys que já estão lá como SplashScreen, ActivityPrincipal etc. ficou assim: */
/** ACTIVITY OcutarBarraNavegacao:
---------------------------------------------------------------------------
<activity
android:name="delai.org.delaitvplayer.OcultarBarraNavegacao"
android:label="@string/app_name"
android:screenOrientation="landscape"
android:configChanges="orientation"
android:theme="@android:style/Theme.NoTitleBar.Fullscreen" />
-------------------------------------------------------------------------- */
// Esta linha é necessária para que a linha "getWindow()..." abaixo funcione e oculte a barra de navegação
@SuppressLint({ "NewApi", "InlinedApi" })
@Override
public void onCreate(Bundle savedInstanceState)
{
/** OCULTANDO A BARRA DE NAVEGAÇÃO DO TABLET OU ANDROID MINI PC - INICIO
*------------------------------------------------------------*/
/* Esta linha faz com que a barra de navegação do tablet seja ocultada logo que
* esta Activity é iniciada,
* No emulador com android 2.2 o app travou por causa dela */
getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_HIDE_NAVIGATION);
/** OCULTANDO A BARRA DE NAVEGAÇÃO DO TABLET OU ANDROID MINI PC - FIM
*------------------------------------------------------------*/
}// FIM DO PUBLIC VOID ON CREATE...
}// FIM DO PUBLIC CLASS OCULTABARRANAVEGACAO...
Pergunta
lgdelai
Link para o comentário
Compartilhar em outros sites
0 respostass a esta questão
Posts Recomendados
Participe da discussão
Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.