Gravar audio Android

Opa,

tenho uma atividade na qual o usuário pode escolher gravar um audio. Para isso, uso o gravador de audio nativo do Android.
Uso o seguinte metódo para iniciar a atividade de gravação de audio.

	private void lancaAudio() {
		Intent intent = new Intent();
		intent.setAction(MediaStore.Audio.Media.RECORD_SOUND_ACTION);
		try {
			startActivityForResult(intent, IDF_ATIVIDADE_AUDIO);
		} catch (ActivityNotFoundException e) {
			showToast("Nenhum aplicativo para gravação de audio foi encontrado!");
		}
	}

E uso esse metódo para gravar o audio na /data/data/…/files do meu aplicativo:


		private boolean gravaAudio(Intent intent, String nome) {
			FileOutputStream fos = null;
			FileInputStream fis = null;
			try {
				AssetFileDescriptor videoAsset = getContentResolver().openAssetFileDescriptor(intent.getData(), "r");
				fis = videoAsset.createInputStream();
				String pathAudio = getFilesDir() + "/" + nome + ".amr";

				File audio = new File(pathAudio);
				fos = new FileOutputStream(audio);

				byte[] buf = new byte[1024];
				int len;
				while ((len = fis.read(buf)) > 0) {
					fos.write(buf, 0, len);
				}
				return true;
			} catch (IOException io) {
				return false;
			}
		}

                //Obs: esse metódo é chamado apos o usuário inserir um nome para o audio. 

Até aqui tudo bem.

Fiz os testes usando um HTC e funcionou legal.

Mas agora estou usando um samsumg galaxy 5 e encontrei um problema.
Ele grava o audio normal, mas quando o usuário tenta ouvir o audio(também uso a app nativa do Android), ele não consegue encontrar a atividade que reproduz o arquivo.

Uso o metódo para abrir o arquivo:


	private void abrir(File file) {

		if (file.exists()) {
			String ext = getExtension(file.getName());

			String mime = MimeTypeMap.getSingleton().getMimeTypeFromExtension(ext);
			Intent intent = new Intent(Intent.ACTION_VIEW);
			intent.setDataAndType(Uri.fromFile(file), mime);
			try {
				startActivity(intent);
				return;
			} catch (ActivityNotFoundException e) {
			}
		}

		showToast("Impossível ao abrir esse arquivo!");

	}

A String mime retornada pelo metodo getMimeTypeFromExtension() é nula no Galaxy mas no HTC não.
Esse deve ser o problema.

Para resolver isso, preciso saber qual o tipo de audio que o aparelho cria o arquivo de audio.
No HTC ele grava audio no formato .amr e no Galaxy grava no formato .3gpp.

Observer que no meu metodo gravaAudio(), uso o seguinte código:

Tenho que alterar a string de extenão de acordo com a codificação do arquivo de audio para o metodo getMimeTypeFromExtension() funcionar na hora de visualizar o arquivo.

Resumindo:
Como sei a codificação do arquivo de audio retornado pela atividade de gravação de audio?

Muito Obrigado!

Oi,

Tem dois jeitos de se fazer isso:

  1. Dizer que o MIME é um audio:
intent.setDataAndType(Uri.fromFile(file), "audio/*");
  1. Implementar seu RECORDER e dizer qual será a extensão do seu arquivo. (.3gp é a recomendada pelo Android).

Exemplo no meu Blog: http://debugcodigos.blogspot.com/2011/09/como-gravar-som-pelo-microfone-record.html

Abraço.

Valeu pela resposta Felipe!

Mas ainda tenho problemas:

Não posso fazer isso, pois minha atividade(metodo abrir(File file)) abre todo tipo de arquivo(pdf, 3gp, txt, etc…). Por isso sou dependente da extensão do arquivo.

Não quero implementar mais uma atividade na minha App. Se o Android já oferece esse opção de compartilhar atividades, quero usa-la.
Mas se não existir uma forma de descobrir o tipo do arquivo de audio, vejo que será minha única opção.

Valeu!!

Tem outro jeito que vai resolver… :x

Porque você não da um:

// Nome do seu arquivo.
String nome = file.getName();
// A extensão sempre serão as ultimas 3 letras de um arquivo.
String extensao = nome.substring(nome.indexOf(".") + 1);

É meio XGH! kkkkkkkkkkkk :slight_smile:
Não me vem nada lógico na cabeça além disso.

Abraço

[quote=felipebonezi]Tem outro jeito que vai resolver… :x

Porque você não da um:

// Nome do seu arquivo.
String nome = file.getName();
// A extensão sempre serão as ultimas 3 letras de um arquivo.
String extensao = nome.substring(nome.indexOf(".") + 1);

É meio XGH! kkkkkkkkkkkk :slight_smile:
Não me vem nada lógico na cabeça além disso.

Abraço[/quote]

Opa, acho que você não entendeu meu problema.
Pegar a extensão de um arquivo criado não é problema. Isso eu estou fazendo no método abrir(File f), e funciona normal.

Eu preciso é saber qual extensão colocar no arquivo na hora de criá-ló, ou seja, quando recebo o áudio de gravação de áudio.
Olhe meu método gravarAudio(). Eu nomeio o arquivo de áudio lá, mas estou fazendo “hardcode”, inserindo a extensão .amr.

Preciso é saber a codificação do áudio gravado pela atividade do Android de gravação de áudio para atribuir a extensão correta.

Valeu d+

Saquei :wink:

Vou ver dar uma analisa melhor mais tarde, to no trabalho.

Pois eh…

consegui dar um “jeitinho”… :oops:

1 - Continuo gravando todo áudio que recebo na atividade como .amr

2 - Ao abrir um arquivo, verifico sua extensão em algumas listas de extensão que criei:

	private static String[] FORMATOS_AUDIO = new String[] { "MP3", "AMR" };
	private static String[] FORMATOS_VIDEO = new String[] { "MP4", "MPEG", "3GP", "3GPP" };
	private static String[] FORMATOS_IMAGENS = new String[] { "JPEG", "JPG", "PNG" };

	public static String mimeType(String extensao) {
		String extUpper = extensao.toUpperCase();

		if (ArrayUtils.contains(FORMATOS_IMAGENS, extUpper)) {
			return "image/*";
		} else if (ArrayUtils.contains(FORMATOS_VIDEO, extUpper)) {
			return "video/*";
		} else if (ArrayUtils.contains(FORMATOS_AUDIO, extUpper)) {
			return "audio/*";
		}
		return null;
	}

quando a extensão usada é .amr, o mimeType usado será “audio/*”.

Assim funcionou! Usei sua dica no primeiro post.

MAS, continuo gravando os áudios com a extensão .amr sempre, independente do formato que ele foi criado. :evil: :frowning:

Modifica para .3gp brother! :slight_smile: