4 de setembro de 2011

Como gravar som pelo microfone (Record Audio) - Android

Oi pessoal,

Depois de algumas dificuldades de pesquisas no google para saber como gravar audio pelo microfone do android, resolvi pesquisar no site do android developers e descobri como fazer-lo!

Basicamente, se você não tem um celular android para teste, a princípio, você pensa que o emulador não suporta o hardware de microfone do seu computador (FOI O QUE EU PENSEI!), mas depois de umas fuçadinhas descobri que ele suporta sim (COM UM DELAY HORRIVEL). Para ativar, você deve ir em sua listas de AVD, criar ou editar uma AVD, na aba HARDWARE, clique em NEW e procure por AUDIO RECORDING SUPPORT. Pronto!

Mas vamos ao que interessa...
O Android possui uma função que facilita e muito a gravação, o MediaRecorder(), tanto usado para gravação de audio ou vídeo, dependendo de sua configuração.

Crie uma classe com os atributos e métodos:
String path
MediaRecorder mr = new MediaRecorder();

public void start();
public void stop();

    1. Construtor:   Neste construtor estamos inicializando com o local aonde o arquivo será salvo.

    2. Inicializando:


    3. Finalizando:


Acho que deu para entender mais ou menos, né? Uma imagem que resume bem o que quero mostrar aqui é a que se encontra no site do android developer.



OBS: NÃO SE ESQUEÇA DE PASSAR O CAMINHO CORRETAMENTE DO SD CARD, UM MÉTODO PARA SABER QUAL É O "PATH" PODE SER USANDO Environment.getExternalStorageDirectory().getAbsolutePath() RETORNANDO UMA STRING, DAI É SÓ CONCATENAR COM O NOME DO SEU ARQUIVO DE AUDIO.


Bem, espero ajudar! =)

Nosso amigo João, lembro que temos que colocar no AndroidManifest.xml as seguintes permissões:
( uses-permission android:name="android.permission.RECORD_AUDIO"/ )
( uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/ )


Abraços,

Felipe Bonezi

14 comentários:

  1. Oi Felipe,

    Sou novo tanto no android quanto no Java. Atualmente venho tentado gravar sons do microfone e não tenho conseguido de jeito nenhum. o programa sempre fecha logo depois de abrir e dá a mensagem: "O Aplicativo (xxxx.xxx.xx.xxx) parou inesperadamente. tente novamente". Ja fiz vários códigos tentando e nada, inclusive ja copiei e colei seu código que voce postou no GUJ e dá exatamente a mesma coisa. (tive que apagar uns overrides pra compilar, será que tem relação? desculpe a pergunta, comecei no java tem 2 dias...)

    Testei no emulador e no celular, ativei gravaçao de audio e reprodução. Voce tem alguma idéia do que pode ser isso?

    Quando não uso esses recursos de som, consigo compilar numa boa e rodar os programas.

    abraço!

    ResponderExcluir
  2. Oi,

    Tenta fazer do seguinte método:
    1. Cria uma classe AudioHelper -> Nela você vai implementar um construtor que inicializa um Objeto do tipo AudioRecorder, também criará dois métodos (start() e stop()).
    2. Em start(), você prepara todo o processo de gravação [COMO TEM NO BLOG].
    3. Em stop, você prepara todo o processo de parada de gravação [COMO TEM NO BLOG].
    4. Em sua Activity, no onCreate(), você irá instânciar sua classe AudioHelper, e para melhor entendimento colocará um BUTTON que inicializa a gravação ao clica-lo. Quando eu clicar, uma new Thread() será inicializada aonde você dará um AudioHelper.start();[no caso, o nome da variável que vc instanciou]. Como isso terá que ser em um try{}catch(...){}, coloque embaixo do do catch um finally que irá automaticamente chamar o método AudioHelper.stop() dentro de um HANDLER;

    Ou seja,

    try{
    } catch(...) {
    } finally {
    new Handler.post(... {
    public run(){
    AudioHelper.stop();
    }
    });
    }

    P.S.: Se você é novo no Android/Java não deve ter entendido alguns termos, mas tudo bem... A lógica é essa.

    Qualquer coisa, posta aew.

    ResponderExcluir
  3. Oi Felipe.

    Obrigado, Arranjei um Deitel e to aqui traduzindo o que voce disse.

    Qualquer coisa te perturbo de novo.

    Valeu!

    ResponderExcluir
  4. Pode pertubar cara, estou aqui para ajudar! :)

    Thread() -> tarefa síncrona com a thread principal.

    Handler() -> Método utilizado principalmente para atualizar a view caso precise.

    Abraço!

    ResponderExcluir
  5. Oi Felipe,

    Muito obrigado pelas dicas, andei estudando um pouco e acho que entendi o que voce sugeriu pra eu fazer. não coloquei o handler ainda e não tenho certeza se o thread tá certo.

    colei aqui http://pastebin.com/VVX4KvkF o código que estou tentando.

    só de tentar mr.setAudioSource ele já da pau.

    Parece que ele não tá inicializando o MediaRecorder, ou estou tentando isso no lugar errado.

    É ali mesmo no inicio da classe Audiohelper, já tentei dentro do construtor e deu pau tambem.

    Abraço!

    ResponderExcluir
  6. Retire o final do AudioHelper.
    Inicialize o MediaRecorder no construtor do AudioHelper.
    A linha 175, path = Enviroment.get...() + "/teste.3gp"; -> Esqueceu de colocar a '/'.
    Retire a Thread que inicializa a gravação no AudioHelper e a coloque na sua Activity para iniciar a gravação de lá.

    ResponderExcluir
  7. Fiz isso e continua dando problema.

    Na verdade já fiz outras 300 coisas tentando também, hehehehe.

    fiz um teste bem besta aqui, só deixando executar a primeira linha de configuração mr.setAudioSource(MediaRecorder.AudioSource.MIC) e já da problema.

    to achando que o erro é outra coisa que não seja código, tipo, na hora de criar o projeto.

    ja testei em 3 computadores, no meu celular e nada.

    Acho que vou comprar um iphone, heheheheh

    tem algum lugar que eu possa ver algum log de erro? pq a unica informaçao que tenho é "O Aplicativo (xxxx.xxx.xx.xxx) parou inesperadamente. tente novamente"

    Abraço e obrigado.

    ResponderExcluir
  8. Saca como fez meu AudioHelper -> http://pastebin.com/UArQ6BMU

    -
    Tem sim po, vai na aba DDMS >> CLICA NO SEU DEVICE >> LOG CAT >> PROCURA LA NO FINAL AS LINHAS DE ERRO EM VERMELHO.

    Se puder, posta aqui.

    ResponderExcluir
  9. Felipe,

    como eu te disse antes, eu sou bem iniciante e não sabia que tinha que colocar isso aqui no AndroidManifest.xml




    o programa rodou aqui sem o erro agora, vou procurar onde foi parar o arquivo.

    Valeu mesmo pela atenção, daqui a pouco venho com outra dúvida besta. hehehe

    ResponderExcluir
  10. o navegador "integrou" o código, troquei < por ( pra aparecer

    ( uses-permission android:name="android.permission.RECORD_AUDIO"/ )
    ( uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/ )

    ResponderExcluir
  11. Bem lembrado, esqueci disso!

    Vou editar o post! Obrigado! :)

    ResponderExcluir
  12. Olá Felipe Bonezi,
    Esta ótima a explicação, obrigada pela ajuda.

    Queria te perguntar se você sabe ou tem uma ideia de como eu posso converter esse arquivo .3gp para .mp3 ou .wav, estou em busca dessa solução e não consegui ainda, até tentei ver se tinha essa possibilidade de conversão no php, mas foi sem sucesso por enquanto.

    Obrigada

    ResponderExcluir
  13. Taiana,
    Eu lembro que em um app que participei na produção utilizavamos um código php para fazer esta conversão.

    Da uma pesquisada maior que você encontra.
    3gp é o padrão Android, por conta de problemas de patentes não é utilizado o .mp3

    Espero ter ajudado

    ResponderExcluir