2014-06-10 10 views
16

Próbuję wstawić wideo do MediaStore, w ten sam sposób jest to możliwe do przechowywania obrazu za pomocą tej metody:Wstawianie wideo do Mediastore

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

Ponieważ nie ma podobna metoda na MediaStore.Video.Media, co ja próbowałem zrobić to wstawić rekord do MediaStore.Video.Media.EXTERNAL_CONTENT_URI a następnie skopiować plik do miejsca docelowego, jak pokazano poniżej:

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); 
} 

uri zwrócony jest non-null w postaci content://media/external/video/media/{id}, co wydaje się poprawne.

Ale kiedy zostanie spełniony cr.openOutputStream(uri);, zostanie zgłoszony FileNotFoundException.

Ten ostatni bit jest podobny do tego, co robi się dla Images.Media.insertImage patrząc na jego kod źródłowy.

Przy okazji mam pozwolenie na WRITE_EXTERNAL_STORAGE. Ponadto testuję na 4.3 & 4.4.

+1

Mam ten sam problem na moim Nexusie 5 z 4.4.4. – Erik

+1

rozwiązania ludzie? – ARO

+1

znalazłeś jakieś rozwiązanie? –

Odpowiedz

1

Co masz z tego kawałka kodu:

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); 

jest publiczną Uri. Więcej informacji na ten temat można znaleźć pod adresem here, gdzie można zobaczyć, że od czasu API 19 (KitKat) zmieniono dostęp do Media.

Patrząc na kod źródłowy Androida, można było zobaczyć database video schema and columns. VideoColumns rozciągają się od MediaColumns, który ma kolumnę:

MediaStore.MediaColumns.DATA 

opisany jako:

Path to the file on disk.

Więc trzeba uzyskać prawdziwe Uri z publicznego Uri.

Aby to wykonać kod:

getDataColumn(context, uri, null, null); 

gdzie uri jest publicznie widoczny Uri a funkcja getDataColumn wyglądać następująco:

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; 
} 

Ten kod pochodzi aFileChooser i funkcji getPath

Powiązane problemy