Моя первоначальная попытка выглядела так
Код: Выделить всё
Intent intent = new Intent();
intent.setType("video/*");
intent.setAction(Intent.ACTION_GET_CONTENT);
startActivityForResult(Intent.createChooser(intent, "Select Video"), REQUEST_TAKE_GALLERY_VIDEO);
Когда выбирается файл, хранящийся локально, я получаю Uri, который выглядит следующим образом:
Код: Выделить всё
content://media/picker_get_content/0/com.android.providers.media.photopicker/media/1000004435
Код: Выделить всё
String[] projection = {MediaStore.Images.Media.DATA};
Cursor cursor = managedQuery(selectedImageUri, projection, null, null, null);
startManagingCursor(cursor);
int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
cursor.moveToFirst();
File videoFile = new File(cursor.getString(column_index));
Uri fileUri = FileProvider.getUriForFile(this, "{yourpackagename}.fileprovider", videoFile);
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setDataAndType(fileUri, "video/*");
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
startActivity(intent);
В такой ситуации я сначала получаю экран ниже, а видео загружается:

В зависимости от размера видео приложение может зависать в этом всплывающем окне очень долго, прежде чем оно вернется к onActivityResult, и если видео очень длинное, я получаю сообщение о том, что файл не может быть использован.
Когда приложение возвращается к onActivityResult, результирующий Uri выглядит так: content://media/picker_get_content/0/com.google.android.apps.photos.cloudpicker/media/d88dd574-2790-4025 -939a-51ba0b62d8bb-1_all_38433
и благодаря этому я могу использовать Uri для запуска видео так же, как и раньше.
Проблема:
Я пытаюсь исключить этот период ожидания загрузки и просто получить ссылку на видео и иметь возможность запускать его для потоковой передачи так же, как при выборе видео из галереи, не хранящееся локально, оно запускается почти сразу, и вы не можете сказать, что оно не хранится на диске.
Что я пробовал:
Поскольку загрузка происходит до того, как приложение возвращается в onActivityResult, я подумал, что можно избежать этого, используя Intent.setAction(Intent.ACTION_PICK);
code> вместо Intent.setAction(Intent.ACTION_GET_CONTENT);.
Когда я переключился на это и выбрал файл, хранящийся не локально, он возвращается к onActivityResult немедленно, но приложение все равно зависает, прежде чем управление будет возвращено пользователю. Результирующий Uri выглядит следующим образом: content://com.google.android.apps.photos.contentprovider/0/2/mediakey%3A%2Flocal%253A0db79025-b636-4c2d-85f1-f2b13a9a6bac/ORIGINAL/NONE/video%2Fmpeg/2041542951. .
и когда я пытаюсь запустить его через приложение, как и раньше, происходит сбой.
Код: Выделить всё
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.herculestournamettracker/com.example.herculestournamettracker.TournamentSelectionScreen}: java.lang.NullPointerException: Attempt to invoke virtual method 'java.util.Iterator java.util.ArrayList.iterator()' on a null object reference
есть ли способ заставить пользователя выбрать видео и, не загружая его, сохранить Uri или ссылку на него, чтобы позже запустить? и если видео не хранится локально, запустите его для потоковой передачи из Интернета и работайте так же, как при выборе видео, не хранящегося локально, из галереи.
Надеюсь, я объяснил это ясно .
Спасибо
Подробнее здесь: https://stackoverflow.com/questions/787 ... ownloading