2011-02-14 26 views
5

Utilizo la clase de intento MediaStore.ACTION_VIDEO_CAPTURE para capturar el video, el video almacenado en la ubicación predeterminada (galería), quiero almacenar el video en una ubicación específica con un nombre específico.Android MediaStore.ACTION_VIDEO_CAPTURE, ruta de acceso externa?

Yo uso MediaStore.EXTRA_MEDIA_TITLE y MediaStore.EXTRA_MEDIA_OUTPUT pero no obtengo el video en la ubicación correcta, al menos necesito la ruta del video grabado.

Gracias de antemano.

Respuesta

10

La solución de Zelimir no funciona en mi caso (los videos estaban en el lugar correcto pero tenían un tamaño de cero bytes). Así que me he encontrado otra solución:

protected void onActivityResult(int requestCode, int resultCode, Intent intent) { 
    super.onActivityResult(requestCode, resultCode, intent); 

    if (resultCode != RESULT_OK) return; 

    try { 
    AssetFileDescriptor videoAsset = getContentResolver().openAssetFileDescriptor(intent.getData(), "r"); 
    FileInputStream fis = videoAsset.createInputStream(); 
    File tmpFile = new File(Environment.getExternalStorageDirectory(),"VideoFile.3gp"); 
    FileOutputStream fos = new FileOutputStream(tmpFile); 

    byte[] buf = new byte[1024]; 
    int len; 
    while ((len = fis.read(buf)) > 0) { 
     fos.write(buf, 0, len); 
    }  
    fis.close(); 
    fos.close(); 
    } catch (IOException io_e) { 
    // TODO: handle error 
    } 

}

El MediaStore.EXTRA_OUTPUT y el Uri no son necesarios en este caso.

+0

el "intento" en el intent.getData() da una excepción de puntero nulo ... ¿tiene alguna idea de por qué podría estar ocurriendo? –

+1

@ShailAdi Probablemente ya haya resuelto esto, pero para cualquier otra persona que vea esto: la intención será nula cuando especifique 'MediaStore.EXTRA_MEDIA_OUTPUT'. Si desea utilizar este método, elimine 'MediaStore.EXTRA_MEDIA_OUTPUT' al crear la solicitud de intento. – Scutterman

0

Trick es insertar los medios de comunicación en base de datos antes de la grabación:

String fileName = "captureTemp.mp4"; 
ContentValues values = new ContentValues(); 
values.put(MediaStore.Video.Media.TITLE, fileName); 
cameraVideoURI = getContentResolver() 
    .insert(MediaStore.Video.Media.EXTERNAL_CONTENT_URI, values); 

Intent intent = new Intent(MediaStore.ACTION_VIDEO_CAPTURE); 
intent.putExtra(MediaStore.EXTRA_OUTPUT, cameraVideoURI); 
intent.putExtra(MediaStore.EXTRA_VIDEO_QUALITY, 0); 
intent.putExtra(MediaStore.EXTRA_SIZE_LIMIT, MAXIMUM_VIDEO_SIZE);    
startActivityForResult(intent, CAPTURE_VIDEO_INTENT); 

y luego onActivityResult() Uso guardados cameraVideoUri para hacer referencia a vídeo grabado:

String[] projection = 
    { MediaStore.Video.Media.DATA, MediaStore.Video.Media.SIZE }; 
Cursor cursor = managedQuery(cameraVideoURI, projection, null, null, null); 
int column_index_data = 
    cursor.getColumnIndexOrThrow(MediaStore.Video.Media.DATA); 
int column_index_size = 
    cursor.getColumnIndexOrThrow(MediaStore.Video.Media.SIZE); 
cursor.moveToFirst(); 
String recordedVideoFilePath = cursor.getString(column_index_data); 
int recordedVideoFileSize = cursor.getInt(column_index_size); 
+1

Esto no funcionó para mí. Sí hizo * algo *; en lugar de simplemente ignorar el parámetro 'EXTRA_OUTPUT', como normalmente lo hace, creó un archivo de longitud cero con el (nombre correcto) en la carpeta'/sdcard/video' a pesar de que especifique un nombre de ruta completo como '/ sdcard/some-existing-dir/newfile.3gp'. La documentación completa y correcta de esta API seguramente sería útil. –

Cuestiones relacionadas