2014-06-10 7 views
16

Sto cercando di inserire un video nel MediaStore, allo stesso modo è possibile memorizzare un'immagine con questo metodo:Inserimento di un video in MediaStore

MediaStore.Images.Media.insertImage(getContentResolver(), imagePath, null, null) 

In mancanza di un metodo simile MediaStore.Video.Media, quello che ho cercato di fare era inserire un record in MediaStore.Video.Media.EXTERNAL_CONTENT_URI e quindi copiare il file alla destinazione, come illustrato di seguito:

ContentValues values = new ContentValues(); 
values.put(MediaStore.Video.Media.TITLE, "Title1"); 
values.put(MediaStore.Video.Media.MIME_TYPE, "video/mp4"); 
values.put(MediaStore.Video.Media.DATA, videoPath); 
Uri uri = cr.insert(MediaStore.Video.Media.EXTERNAL_CONTENT_URI, values); 

try { 
    OutputStream os = cr.openOutputStream(uri); 
    ... 
    ... 
} (FileNotFoundException e) { 
    cr.delete(uri, null, null); 
} 

il uri restituito viene non-null sotto forma di content://media/external/video/media/{id}, che sembra corretto.

Tuttavia, quando viene eseguito il numero cr.openOutputStream(uri);, viene emesso un numero FileNotFoundException.

Questo ultimo bit è simile a quello che viene fatto per Images.Media.insertImage guardando il suo codice sorgente.

Btw, ho l'autorizzazione WRITE_EXTERNAL_STORAGE. Inoltre, sto testando su 4.3 & 4.4.

+1

Ho lo stesso problema sul mio Nexus 5 con 4.4.4. – Erik

+1

eventuali soluzioni persone? – ARO

+1

hai trovato qualche soluzione? –

risposta

1

quello che si ottiene da questo pezzo di codice:

ContentValues values = new ContentValues(); 
values.put(MediaStore.Video.Media.TITLE, "Title1"); 
values.put(MediaStore.Video.Media.MIME_TYPE, "video/mp4"); 
values.put(MediaStore.Video.Media.DATA, videoPath); 
Uri uri = cr.insert(MediaStore.Video.Media.EXTERNAL_CONTENT_URI, values); 

è un pubblico Uri. Di più su si può trovare here, dove si può vedere, che dal momento che API 19 (KitKat) l'accesso a Media è cambiato.

Guardando il codice sorgente di Android è possibile vedere uno database video schema and columns. VideoColumns estendersi dalla MediaColumns, che ha la colonna:

MediaStore.MediaColumns.DATA 

descritto come:

Path to the file on disk.

Quindi, è necessario ottenere il vero Uri dal pubblico Uri.

Per questo eseguire il codice:

getDataColumn(context, uri, null, null); 

dove uri è il vostro pubblico Uri e l'aspetto funzione di getDataColumn come:

public static String getDataColumn(Context context, Uri uri, String selection, 
            String[] selectionArgs) { 

    Cursor cursor = null; 
    final String column = MediaStore.MediaColumns.DATA; 
    final String[] projection = { 
      column 
    }; 

    try { 
     cursor = context.getContentResolver().query(uri, projection, selection, selectionArgs, 
       null); 
     if (cursor != null && cursor.moveToFirst()) { 
      final int column_index = cursor.getColumnIndexOrThrow(column); 
      return cursor.getString(column_index); 
     } 
    } finally { 
     if (cursor != null) 
      cursor.close(); 
    } 
    return null; 
} 

Questo codice viene dal aFileChooser e la funzione getPath

Problemi correlati