Gravar no cartão do android?

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

[code]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
  • 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();
}

}
[/code]

Outra classe que eu uso aqui envolvido também

[code]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;
}

}
[/code]

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.

Colocou a permissão no AndroidManifest.xml?

att,

[quote=Evandro_Contato]Colocou a permissão no AndroidManifest.xml?

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

att,
[/quote]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?

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.

O que estou precisando agora é saber como pego parte do txt, o texto ja estou pegando usando assim

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

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

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)

Algo + ou - assim

[code]String[] parte1 = conteudotexto.split(",");

e em seguida

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

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.

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;

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

Vejam o codigo

[code]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());
	}
}[/code]

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.

Bom pessoal ja resolvi o problema com ajuda de um colega de outro forum, e o codigo final ficou assim

[code]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());
	}
}

[/code]

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

Estiu chamando assim esta classe

[code]case R.id.playSound:
Thread threadLerArquivo = new Thread() {

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

Obrigado.