2011-07-19 9 views
5

Estoy tratando de invocar la grabadora de audio en Android 2.2.1 (dispositivo de Samsung Galaxy POP) usando el siguiente código:grabadora de audio y obtener el archivo resultante

private static final int ACTIVITY_RECORD_SOUND = 1; 
Intent intent = new Intent(MediaStore.Audio.Media.RECORD_SOUND_ACTION); 
startActivityForResult(intent, ACTIVITY_RECORD_SOUND); 

Esto invoca la grabadora con éxito. En mi resultado actividad hago lo siguiente:

protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
super.onActivityResult(requestCode, resultCode, data); 
    if (resultCode == Activity.RESULT_OK) { 
     switch (requestCode) { 
         case ACTIVITY_RECORD_SOUND: 
          data.getDataString(); 
         break; 
          } 
       } 
     } 

después de completar la grabación presiono en la grabadora de audio que devuelve el control al método onActivityResult como se esperaba, pero mi resultCode es siempre 0 (que es la actividad. RESULT_CANCELED) y mis datos son nulos. ¿Me estoy perdiendo algo aquí? Amablemente ayúdeme con esto. Esto funciona en el emulador pero no en el dispositivo. Gracias por adelantado.

+0

la grabadora de audio que debe ofrecer a utilizar realmente el registro que ha realizado, que es cuando debería ser devuelto a la onActivityResult. – njzk2

Respuesta

0

Finalmente encontré una solución para mi problema mediante el uso de FileObserver. Lo logré haciendo lo siguiente:

package com.pravaa.audiointent; 

import java.io.DataOutputStream; 
import java.io.File; 
import java.io.FileInputStream; 
import java.io.FileNotFoundException; 
import java.io.FileOutputStream; 
import java.io.IOException; 
import java.util.Enumeration; 
import java.util.Vector; 

import android.app.Activity; 
import android.content.Intent; 
import android.os.Bundle; 
import android.os.FileObserver; 
import android.provider.MediaStore; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.Button; 
import android.widget.LinearLayout; 
import android.widget.Toast; 

public class AudioActivity extends Activity implements OnClickListener { 
/** Called when the activity is first created. */ 
private Button sampleButton; 
private FileObserver mFileObserver; 
private Vector<String> audioFileNames; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    audioFileNames = new Vector<String>(); 
    LinearLayout finalContainer = new LinearLayout(this); 
    sampleButton = new Button(this); 
    sampleButton.setOnClickListener(this); 
    sampleButton.setText("Start Audio Intent"); 
    finalContainer.addView(sampleButton); 
    setContentView(finalContainer); 
    addObserver(); 

} 

private void addObserver() { 
    this.mFileObserver = new FileObserver("/sdcard/Sounds/") { 
     @Override 
     public void onEvent(int event, String path) { 
      if (event == FileObserver.CREATE) { 
       if (path != null) { 
        int index = path.indexOf("tmp"); 
        String tempFileName = (String) path.subSequence(0, 
          index - 1); 
        audioFileNames.add(tempFileName); 

       } 
      } else if (event == FileObserver.DELETE) { 
       if (path != null) { 
        int index = path.indexOf("tmp"); 
        String tempFileName = (String) path.subSequence(0, 
          index - 1); 
        if (audioFileNames.contains(tempFileName)) { 
         audioFileNames.remove(tempFileName); 
        } 
       } 

      } 
     } 
    }; 
} 

private void readFile(String fileName) { 

    File attachment = new File("/sdcard/Sounds/" + fileName); 
    if (attachment.exists()) { 
     FileInputStream fis; 
     try { 
      fis = new FileInputStream(attachment); 
      byte[] bytes = new byte[(int) attachment.length()]; 
      try { 
       fis.read(bytes); 
       fis.close(); 

       attachment.delete(); 

       saveMedia("Test" + fileName, bytes); 

      } catch (IOException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 

     } catch (FileNotFoundException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } 
} 

@Override 
protected void onResume() { 
    // TODO Auto-generated method stub 
    super.onResume(); 
    mFileObserver.startWatching(); 
} 

public void saveMedia(String fileName, byte[] data) { 

    String imagePath = "/sdcard/sam/"; 
    System.out.println("Inside Folder"); 


    File file = new File(imagePath, fileName); 
    System.out.println("File Created"); 

    FileOutputStream fileOutputStream = null; 
    try { 
     fileOutputStream = new FileOutputStream(file); 
     DataOutputStream dataOutputStream = new DataOutputStream(
       fileOutputStream); 
     System.out.println("Writting File"); 
     dataOutputStream.write(data, 0, data.length); 
     System.out.println("Finished writting File"); 
     dataOutputStream.flush(); 
     dataOutputStream.close(); 
    } catch (FileNotFoundException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
} 

public void onClick(View arg0) { 
    // TODO Auto-generated method stub 
    Intent intent = new Intent(MediaStore.Audio.Media.RECORD_SOUND_ACTION); 
    startActivityForResult(intent, 2); 
} 

@Override 
protected void onActivityResult(int requestCode, int resultCode, 
     Intent intent) { 
    // TODO Auto-generated method stub 
    if (requestCode == 2) { 
     if (mFileObserver != null) { 
      mFileObserver.stopWatching(); 
     } 
     Enumeration<String> audioFileEnum = audioFileNames.elements(); 
     while (audioFileEnum.hasMoreElements()) { 
      readFile((String) audioFileEnum.nextElement()); 
     } 
    } 
}} 
0

que estaba enfrentando el mismo problema .. Así que en lugar de utilizar una intención, que utiliza la clase MediaRecorder y sus métodos asociados como setAudioEncoder, setAudioSource, preparar, iniciar, detener, setOutputFormat y setOutputFile ... Funciona bien ahora ...

-4

Existe un problema conocido con los dispositivos Galaxy Android donde los resultados son nulos donde se espera que contengan una foto. Esto también podría aplicarse aquí. Ver http://kevinpotgieter.wordpress.com/2011/03/30/null-intent-passed-back-on-samsung-galaxy-tab/.

Una manera de resolver esto, es agregar

intent.putExtra(MediaStore.EXTRA_OUTPUT, someFileUri); 

a su intención, diciendo explícitamente la aplicación de destino donde almacenar el archivo resultante.

Echa un vistazo a este example si necesita ayuda para crear un buen archivo Uri.

+1

¿Has probado esto? porque lo intenté aquí y no parece tener un efecto. Creo que EXTRA_OUTPUT se ignora para las grabaciones de audio, solo tiene efecto para tomar fotos y grabar videos. Pero puedo estar equivocado. –

+0

@EmmanuelTouzery Usted no es. Eso es exactamente lo que se indica en la documentación: http://developer.android.com/reference/android/provider/MediaStore.html#EXTRA_OUTPUT – Pijusn

+0

esto no funciona con archivos de audio. – rcorbellini

0

También estoy de acuerdo con la mejor respuesta hasta el momento (votada por el propietario de la pregunta), pero no puede leer el archivo, ya que es una ruta diferente. Mi sugerencia es almacenar el nombre de archivo como una variable miembro y llamar getFilename() solo una vez.

2

Esto funciona para mí:

@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) 
    { 
     switch(requestCode) { 
     case Flashum.TAKE_MUSIC: 
     case Flashum.TAKE_VOICE: 
      if (resultCode == Activity.RESULT_OK) 
      { 
       Log.i(Flashum.LOG_TAG, "onActivityResult got new music"); 
       Bundle extras = data.getExtras(); 
       try { 
        Uri u = data.getData(); 
        String imageUri; 
        try { 
        imageUri = getRealPathFromURI(u); 
        } catch (Exception ex) { 
        imageUri = u.getPath(); 
        } 
        File file = new File(imageUri); 
        FragmentFlash fragmentFlash = (FragmentFlash)mTabsAdapter.getFragment("flash"); 
        if (fragmentFlash != null) 
        fragmentFlash.gotMusic(file.getPath()); 
       } catch (Exception ex) { 
        String s = ex.toString(); 
        Log.i(Flashum.LOG_TAG, "onActivityResult " + s); 
       } 
      } 
      else 
      { 
       Log.i(Flashum.LOG_TAG, "onActivityResult Failed to get music"); 
      } 
      break; 
     } 
    } 

    public String getRealPathFromURI(Uri contentUri) { 
     String[] proj = { MediaStore.Images.Media.DATA }; 
     Cursor cursor = managedQuery(contentUri, proj, null, null, null); 
     int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA); 
     cursor.moveToFirst(); 
     return cursor.getString(column_index); 
    } 
+0

Gracias ¡Su respuesta fue la única que me ayudó! – user1882196

Cuestiones relacionadas