Gravar no cartão do android?

7 respostas
C

Boa noite, estou tentando gravar um texto no cartão do android, mais não esta funcionando.

A classe que eu estou usando para gravar
package br.com.couldsys.drumspro;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.IOException;

import android.os.Environment;

/**
 * Gravar e Ler Arquivo Texto no SD do SmartPhone<br>
 * Os Arquivos serão gravados no cartão na Pasta "Android/data/seuPacote/cache"
 * assim quando desinstalar a Aplicação o conteudo será removido
 * 
 * @author Felipe Cobello
 * 
 */

public class WriteAndRead {

	private File regFile;

	/**
	 * Cria uma Nova Instancia da Classe
	 * 
	 * @param packageName
	 *            Nome do Pacote Principal
	 * @param fileName
	 *            Nome do arquivo que sera criado
	 * @throws IOException
	 */
	public WriteAndRead(String packageName, String fileName) throws IOException {
		regFile = new File(Environment.getExternalStorageDirectory().getPath()
				+ "/Android/data/" + packageName + "/cache/" + fileName);
		if (!regFile.getParentFile().exists())
			regFile.mkdirs();
		if (!regFile.exists())
			regFile.createNewFile();
	}

	/**
	 * Grava o Arquivo
	 * 
	 * @param texto
	 *            Texto a ser gravado no Arquivo
	 * @throws IOException
	 */
	public void writeFile(String texto) throws IOException {
		FileOutputStream file;

		if (regFile.canWrite()) {
			file = new FileOutputStream(regFile);
			file.write(texto.getBytes());
			file.close();
		}
	}

	/**
	 * Lê o arquivo
	 * 
	 * @return Conteudo do Arquivo
	 * @throws IOException
	 */
	public String readFile(String texto) throws IOException {
		StringBuilder retorno = new StringBuilder();
		FileReader reader;
		BufferedReader br;
		String line;

		reader = new FileReader(regFile);
		br = new BufferedReader(reader);
		while ((line = br.readLine()) != null)
			retorno.append(line);
		br.close();
		reader.close();
		return retorno.toString();
	}

}
Outra classe que eu uso aqui envolvido também
package br.com.couldsys.drumspro;

import java.util.Calendar;


public class RecordSound {

	static long tempoInicio = 0;
	static long tempoDecorrido = 0;
	static String listaTempo;

	// Método de retorno milisegundos calcula milisegundos
	public static long MilliSeconds() {
		// get Calendar instance
		Calendar now = Calendar.getInstance();

		return now.getTimeInMillis();

	}

	// Calcula o tempo para gravar o index do sound
	public static void Calculate_Time(int indexClick) {
		tempoDecorrido = (MilliSeconds() - tempoInicio); 
		listaTempo = listaTempo + String.valueOf(tempoDecorrido) + " - "
				+ String.valueOf(indexClick) + ";";
	}

	// Utilizamos este método num botão record
	public static void Start_Time() {
		// pega o tempo do milisegundos inicial
		tempoInicio = RecordSound.MilliSeconds();
		// limpa a string para não ficar lixo
		listaTempo = "";
	}

	// Utilizamos este método num botão stop
	public static String Stop_Time() {
		// zera o tempo do milisegundos
		tempoInicio = 0;
		return listaTempo;
	}

}

E aonde estou chamando

case R.id.pauseSound:
			// chama o método stop da classe RecordSound
			String arquivo = RecordSound.Stop_Time();
			System.out.println("Codigos gravados.:"+arquivo); // pra ver no log
			WriteAndRead objGravar;
			try {
				System.out.println("Entrou no objGravar"); // pra ver no log
				objGravar = new WriteAndRead("br.com.couldsys.drumspro",
						"GravaSound.txt");
				System.out.println("Caminho do arquivo.:"+objGravar); // pra ver no log
				objGravar.writeFile(arquivo);
			} catch (IOException e) {
				e.printStackTrace();
			}
			break;
		}
Coloquei alguns logs pra ver até aonde vai e pelo visto não entra aqui
objGravar = new WriteAndRead("br.com.couldsys.drumspro",
						"GravaSound.txt");

Mais não esta criando a pasta no PATH do android

Obrigado.

7 Respostas

E

Colocou a permissão no AndroidManifest.xml?

att,

C

Evandro_Contato:
Colocou a permissão no AndroidManifest.xml?

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

att,

Era isso mesmo, tinha esquecido de dar permissão. Muito obrigado amigo.

Mais uma coisa que não estou entendendo, no LogCat esta trazendo o que quero gravar, igual mostra nesta linha

System.out.println("Codigos gravados.:"+arquivo); // pra ver no log

Mais na pasta do path aparece o GravaSound.txt só que nada dentro, esta vazio. Falta mais alguma coisa ainda?

C

Engraçado, mudei o codigo

try { objGravar = new WriteAndRead( "br.com.couldsys.drumspro", "GravaSound.TXT");

colocanco TXT em maiusculo e funcionou, será que tem que ser desta forma?

Da forma anterior txt (minusculo) estava criando como uma pasta.

C
O que estou precisando agora é saber como pego parte do txt, o texto ja estou pegando usando assim
arq = new File(Environment.getExternalStorageDirectory(),
                    lstrNomeArq);
            BufferedReader br = new BufferedReader(new FileReader(arq));

            // pega o conteudo do arquivo texto
            conteudotexto = br.readLine();

O texto pode variar, mais tem duas separação, o primeiro numero é separado do segundo numero por um "-" (traço) que depois é separado por uma "," (Virgula)

549-8,1019-9,1404-3,1764-3,2208-10,2593-5,2938-9,3264-6,3700-0,4174-7,4585-8,4840-2,5192-9,5540-10,5932-0,

Algo + ou - assim
String[] parte1 = conteudotexto.split(",");

e em seguida

String[] parte2 = parte1[0].split("-");

A regra que estou tentando fazer é: Rodar dentro de um while o metodo de milisegundos que fiz e postei aqui no forum e comparar com a primeira parte do texto

Tipo
[color=#0000BF]Se valor_milissegundos for igual a primeira parte do numero do texto então
--->entra e roda a função playSound(com o segundo numero do texto);
------>vai para o proximo numero do texto no loop, captura o segundo numero do texto e compara com o milissegundos, se for igual entra no bloco IF e captura o segundo numero apos o traço, e assim por diante, até chegar ao final do texto.[/color]

Espero que tenha entendido minha duvida e alguém mostre o caminho como fazer isso.

Obrigado.

C

Poxa é tão dificil de fazer isso em java?

Se eu postar o código feito em delphi será que alquem sabe converter para java? É que eu sou muito fraco em java, mais estou me esforçando para aprender.

Desculpe postar o codigo em delphi mais é a unica forma que da pra eu mostrar o que preciso em forma de codigo, e talvez alguém aqui saiba programar nas duas linguas e converte pra mim o que estou querendo.

Segue o exemplo

procedure TForm1.Button1Click(Sender: TObject); var Lista: TStringList; i, Tempo, TempoAnt: integer; begin Lista := TStringList.Create; try Lista.CommaText := StringReplace('549-8,1019-9,1404-3,1764-3,2208-10,2593-5,2938-9,' + '3264-6,3700-0,4174-7,4585-8,4840-2,5192-9,5540-10,' + '5932-0', '-', '=', [rfReplaceAll]); //aqui é o que esta no arquivo txt no caso bsuca o valor de lá é só um exemplo Tempo := 0; //zero a variavel for i := 0 to Lista.Count - 1 do //faço um loop de tudo que contem na lista TXT begin TempoAnt := Tempo; //a variavel tempant recebe a variavel tempo Tempo := StrToInt(Lista.Names[i]) - TempoAnt; //Sleep(10); Showmessage(Lista.Values[Lista.Names[i]]); //aqui mostra o segundo numero end; finally Lista.Free; end; end;

A

Pessoal, eu quase consegui fazer o que eu quero, mais ainda não esta certo

Vejam o codigo
private void LerArquivo() {
		String lstrNomeArq;
		File arq;

		try {
			// pega o nome do arquivo a ser lido
			lstrNomeArq = "/Android/data/br.com.couldsys.drumspro/cache/GravaSound.rt";

			// limpa a caixa de texto que irá receber os dados do arquivo
			String conteudoTexto = null;

			arq = new File(Environment.getExternalStorageDirectory(),
					lstrNomeArq);
			BufferedReader br = new BufferedReader(new FileReader(arq));

			// pega o conteudo do arquivo texto
			conteudoTexto = br.readLine();			
			String[] parte1 = conteudoTexto.split(",");
			tempoInicio = RecordSound.MilliSeconds(); //aqui a variavel recebe o valor do milissegundo
			// chama o método start da classe RecordSound
			tempoDecorrido = (RecordSound.MilliSeconds() - tempoInicio); //variavel recebe o calculo  
			int i = 0;
                        //faço um while 
			while (i < parte1.length) { 
				String[] parte2 = parte1[i].split("-");
				System.out.println(parte2[1]); // ver o log

				int capturaTempo = Integer.parseInt(parte2[0]); // converte
																// para
																// int
				int capturaIndex = Integer.parseInt(parte2[1]); // converte
																// para
																// int
				System.out.println("Tempos " + tempoDecorrido + " = "
						+ capturaTempo);
                                /*Aqui é que ta o negocio, quero comparar a variavel tempoDecorrido com capturaTempo, e se for igual executa o playSound e vai para o proximo no while. */

				if (tempoDecorrido == capturaTempo) {
					vsm.playSound(capturaIndex);
					i = i + 1;
				} else { //se não o tempoDecorrido muda para o proximo e começa de novo.
					tempoDecorrido = (RecordSound.MilliSeconds() - tempoInicio);
				} 
                               //aqui nesta linha é meu problema, quero algo para quando terminar o texto sair do while, ai tive esta idéia ai, mais não esta funcionando corretamente.
				if (tempoDecorrido > capturaTempo) {
					break;
				}

			}

		} catch (Exception e) {
			trace("Erro : " + e.getMessage());
		}
	}

Outra coisa, alguém sabe informar se preciso colocar este codigo numa thread? Se tiver, poderia alguém mostrar como é feito? Sou muito novato na linguagem java.

Obrigado.

C
Bom pessoal ja resolvi o problema com ajuda de um colega de outro forum, e o codigo final ficou assim
public static void LerArquivo() {
		String lstrNomeArq;
		File arq;

		try {
			// pega o nome do arquivo a ser lido
			lstrNomeArq = "/Android/data/br.com.couldsys.drumspro/cache/GravaSound.rtx";

			// limpa a caixa de texto que irá receber os dados do arquivo
			String conteudoTexto = null;

			arq = new File(Environment.getExternalStorageDirectory(),
					lstrNomeArq);
			BufferedReader br = new BufferedReader(new FileReader(arq));

			// pega o conteudo do arquivo texto
			conteudoTexto = br.readLine();
			System.out.println("Conteudo do texto " + conteudoTexto); // pra ver
																		// no
			// log
			String[] parte1 = conteudoTexto.split(",");
			tempoInicio = RecordSound.MilliSeconds();
			// chama o método start da classe RecordSound
			tempoDecorrido = (RecordSound.MilliSeconds() - tempoInicio);
			int i = 0;
			while (i < parte1.length) {
				String[] parte2 = parte1[i].split("-");
				System.out.println(parte2[1]); // ver o log

				int capturaTempo = Integer.parseInt(parte2[0]); // converte
																// para
																// int
				int capturaIndex = Integer.parseInt(parte2[1]); // converte
																// para
																// int
				tempoDecorrido = (RecordSound.MilliSeconds() - tempoInicio);
				System.out.println("Tempos " + tempoDecorrido + " = "
						+ capturaTempo);		
				
                if (tempoDecorrido >= capturaTempo) {
                   DrumsProActivity.vsm.playSound(capturaIndex);
                   i++;
                }

			}

		} catch (Exception e) {
			trace("Erro : " + e.getMessage());
		}
	}

Mais ainda tenho uma ultima duvida
Se eu quiser rodar este laço repetidas vezes como devo fazer?

Estiu chamando assim esta classe
case R.id.playSound:
			Thread threadLerArquivo = new Thread() {

				public void run() {
					PlaySound.tempoInicio = 0; // zera a variavel
					PlaySound.LerArquivo();
				}
			};
			threadLerArquivo.start();
			break;

Obrigado.

Criado 5 de outubro de 2012
Ultima resposta 12 de out. de 2012
Respostas 7
Participantes 3