2014-06-10 13 views
16

Tôi đang cố gắng để chèn video vào MediaStore, giống như cách nó có thể lưu trữ hình ảnh sử dụng phương pháp này:Chèn video vào MediaStore

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

Kể từ khi không có phương pháp tương tự trên MediaStore.Video.Media, những gì tôi cố gắng làm là chèn một bản ghi vào MediaStore.Video.Media.EXTERNAL_CONTENT_URI và sau đó sao chép các tập tin đến đích, như hình dưới đây:

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

các uri trở là non-null theo hình thức content://media/external/video/media/{id}, có vẻ đúng.

Nhưng sau đó khi cr.openOutputStream(uri); được gỡ bỏ, hãy gửi FileNotFoundException.

Bit cuối cùng này tương tự như những gì được thực hiện cho Images.Media.insertImage xem mã nguồn của nó.

Btw, tôi có quyền WRITE_EXTERNAL_STORAGE. Ngoài ra, tôi đang thử nghiệm trên 4.3 & 4.4.

+1

Tôi gặp vấn đề tương tự trên Nexus 5 của mình với 4.4.4. – Erik

+1

mọi giải pháp mọi người? – ARO

+1

bạn có tìm thấy giải pháp nào không? –

Trả lời

1

Những gì bạn nhận được từ đoạn mã này:

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

là một công Uri. Thông tin thêm về có thể được tìm thấy here, nơi bạn có thể thấy, rằng kể từ API 19 (KitKat), quyền truy cập vào Media đã thay đổi.

Bằng cách xem mã nguồn của Android, bạn có thể thấy database video schema and columns. VideoColumns mở rộng từ MediaColumns, trong đó có các cột:

MediaStore.MediaColumns.DATA 

mô tả như:

Path to the file on disk.

Vì vậy, bạn phải có được thực sự Uri từ công chúng Uri.

Để này chạy mã:

getDataColumn(context, uri, null, null); 

nơi uri là bạn nào Uri và giao diện chức năng getDataColumn như:

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

Mã này xuất phát từ aFileChooser và chức năng getPath