Как выбрать конкретные c видеофайлы для загрузки в галерею в Android Q? - PullRequest
0 голосов
/ 19 июня 2020

Записав видео с помощью mediaRecorder и Camera API, я пытаюсь сохранить видео в галерее пользователя (либо сохраняя его во внешние фильмы, каталог DCIM или другое).

К сожалению, код Я обнаружил, что из документации или StackOverflow, похоже, создают свои соответствующие URI без какой-либо ссылки на записанное видео или файл, в котором оно хранится. В частности, код, который я пытался использовать, выглядит следующим образом:

String videoFileName = "video_" + System.currentTimeMillis() + ".mp4";

    ContentValues valuesvideos;
    valuesvideos = new ContentValues();
    valuesvideos.put(MediaStore.Video.Media.RELATIVE_PATH, "Movies/" + "Folder");
    valuesvideos.put(MediaStore.Video.Media.TITLE, videoFileName);
    valuesvideos.put(MediaStore.Video.Media.DISPLAY_NAME, videoFileName);
    valuesvideos.put(MediaStore.Video.Media.MIME_TYPE, "video/mp4");
    valuesvideos.put(MediaStore.Video.Media.DATE_ADDED, System.currentTimeMillis() / 1000);
    valuesvideos.put(MediaStore.Video.Media.DATE_TAKEN, System.currentTimeMillis());
    valuesvideos.put(MediaStore.Video.Media.IS_PENDING, 1);
    ContentResolver resolver = context.getContentResolver();
    Uri collection = MediaStore.Video.Media.getContentUri(MediaStore.VOLUME_EXTERNAL_PRIMARY);
    Uri uriSavedVideo = resolver.insert(collection, valuesvideos);

    ParcelFileDescriptor pfd;

    try {
        pfd = context.getContentResolver().openFileDescriptor(uriSavedVideo,"w");

        assert pfd != null;
        FileOutputStream out = new FileOutputStream(pfd.getFileDescriptor());

// Get the already saved video as fileinputstream from here
            File storageDir = new File(context.getExternalFilesDir(Environment.DIRECTORY_PICTURES), "Folder");
            File imageFile = new File(storageDir, "testStorage");

            FileInputStream in = new FileInputStream(imageFile);


            byte[] buf = new byte[8192];
            int len;
            while ((len = in.read(buf)) > 0) {

                out.write(buf, 0, len);
            }
            out.close();
            in.close();
            pfd.close();

        } catch (Exception e) {

            e.printStackTrace();
        }

Код и ответы вокруг него, похоже, подразумевают, что, обратившись к MediaStore.VOLUME_EXTERNAL_PRIMARY, преобразователь может получить доступ к сохраненному видеофайлу, но я не вижу явной ссылки на Это. Перед записью видео я определяю файл, назначенный для mediaRecorder, как таковой:

static File getMediaFile(Context c) {

    File mediaStorageDir = c.getExternalFilesDir(null);
    String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());

    return new File(mediaStorageDir.getPath() + File.separator + "VID_" + timeStamp + ".mp4");

}

После остановки видео я получаю эту ошибку (ссылаясь на эту строку: Uri uriSavedVideo = resolver.insert(collection, valuesvideos);):

java .lang.UnsupportedOperationException: Неизвестный URI: content: // media / external_primary / video / media в android .database.DatabaseUtils.readExceptionFromParcel (DatabaseUtils. java .167) ...

Как правильно создать URI со ссылкой на сохраненное видео? Замена URI из файла Uri.fromFile(f); вместо uriSavedVideo тоже не работает.

1 Ответ

0 голосов
/ 23 июня 2020

Чтобы сохранить определенный c видеофайл в галерею, я передал файл в качестве параметра в new FileInputStream.

Во-вторых, как Android docs состояние:

Только ваше приложение может просматривать файл, пока ваше приложение не изменит значение IS_PENDING обратно на 0.

Итак, следуя совету пользователя @blackapps, я вручную изменил это штат. Измененный код ниже:

   private static void addToApi29Gallery(File file, Context context) {
    
            String videoFileName = "video_" + System.currentTimeMillis() + ".mp4";
    
            ContentValues valuesvideos;
            valuesvideos = new ContentValues();
            valuesvideos.put(MediaStore.Video.Media.RELATIVE_PATH, "Movies/" + "Trickshott");
            valuesvideos.put(MediaStore.Video.Media.TITLE, videoFileName);
            valuesvideos.put(MediaStore.Video.Media.DISPLAY_NAME, videoFileName);
            valuesvideos.put(MediaStore.Video.Media.MIME_TYPE, "video/mp4");
            valuesvideos.put(MediaStore.Video.Media.DATE_ADDED, System.currentTimeMillis() / 1000);
            valuesvideos.put(MediaStore.Video.Media.DATE_TAKEN, System.currentTimeMillis());
            valuesvideos.put(MediaStore.Video.Media.IS_PENDING, 1);
            ContentResolver resolver = context.getContentResolver();
            Uri collection = MediaStore.Video.Media.getContentUri(MediaStore.VOLUME_EXTERNAL_PRIMARY); //all video files on primary external storage
            Uri uriSavedVideo = resolver.insert(collection, valuesvideos);
    
            ParcelFileDescriptor pfd;
    
            try {
                pfd = context.getContentResolver().openFileDescriptor(uriSavedVideo,"w");
    
                assert pfd != null;
                FileOutputStream out = new FileOutputStream(pfd.getFileDescriptor());
    
    // Get the already saved video as fileinputstream from here    
FileInputStream in = new FileInputStream(file);
    
    
                byte[] buf = new byte[8192];
                int len;
                while ((len = in.read(buf)) > 0) {
    
                    out.write(buf, 0, len);
                }
                out.close();
                in.close();
                pfd.close();
                valuesvideos.clear(); 
valuesvideos.put(MediaStore.Video.Media.IS_PENDING, 0); 
                valuesvideos.put(MediaStore.Video.Media.IS_PENDING, 0); //only your app can see the files until pending is turned into 0
    
                context.getContentResolver().update(uriSavedVideo, valuesvideos, null, null);
    
            } catch (Exception e) {
    
                e.printStackTrace();
            }
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...