Я сделал приложение, которое позволяет пользователю выбрать файл mp4, дату и время. После установки приложение запускает службу переднего плана, которая должна воспроизводить медиа-файл, используя неявное намерение, когда наступит время.
Код, позволяющий пользователю выбрать медиа-файл:
private void openFile() {
Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT);
intent.setType("video/mp4");
startActivityForResult(intent, GET_FILE);
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent resultData) {
if (requestCode == GET_FILE && resultCode == AppCompatActivity.RESULT_OK) {
// The resultData contains a URI for the document or directory that the user selected.
media_uri = resultData.getData();
Log.e("Activity_Files", "Received Uri: " + media_uri.toString());
}
Для Пример запуска на моем телефоне с API 23, из logcat я получаю
03-29 21:06:21.529 14630-14630/com.basulabs.mahalaya E/Activity_Files: Received Uri: content://com.android.externalstorage.documents/document/6333-6461%3AVID-20170319-WA0003.mp4
, который показывает, что Uri был успешно получен.
Теперь из службы переднего плана я воспроизводю медиа-файл.
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setDataAndType(media_uri, "video/*");
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
Log.e("Mahalaya Service", "Time up!");
if (intent.resolveActivity(getPackageManager()) != null) {
Log.e("Mahalaya Service", "Intent fired.");
startActivity(intent);
}
}
Снова из logcat:
03-29 21:07:00.038 14630-15146/com.basulabs.mahalaya E/Mahalaya Service: Time up!
03-29 21:07:00.048 14630-15146/com.basulabs.mahalaya E/Mahalaya Service: Intent fired.
На моем телефоне отображается список приложений, которые могут воспроизводить файл mp4. Я выбираю встроенный медиаплеер, который обычно может воспроизводить файлы mp4. Теперь я получаю ошибку.
Из журнала,
03-29 21:07:05.088 15199-15199/? E/CloudUtil: checkCloudAgentExistence() - NameNotFoundException
03-29 21:07:05.088 15199-15199/? E/MoviePlayer: initIntentInfo : LaunchType unknown!!! reset player info
03-29 21:07:05.088 15199-15199/? E/VUtils: resetPlayerInfo Normal List
03-29 21:07:05.178 15199-15199/? E/MoviePlayer: onResume. Intent is not vaild to play a video. finish()
Может кто-нибудь сказать мне, почему намерение не является действительным?
Обновление 1:
Я пробовал на эмуляторе с API 27, используя VL C для Android. Logcat выдает другую ошибку:
2020-03-30 00:17:07.420 23672-23689/? E/VLC/LibVLC/Util: WARNING: Can't find shared library
2020-03-30 00:17:10.791 23672-23691/? E/VLC/FileUtils: Permission is no longer valid
Обновление 2:
Я только что обнаружил ужасную проблему в своем приложении. Структура моего приложения следующая:
Activity1 -> Принимает медиа Uri, запускает Activity2
Activity2 -> Пользователь выбирает дата запускается Activity3
Activity3 -> пользователь выбирает время, запускает MyService
MyService -> приоритетный сервис для воспроизведения мультимедиа с использованием намерения в правильное время
Теперь при тестировании я обнаружил, что если Activity1 запускает MyService напрямую (я установил дату и время программно), мультимедиа может воспроизводиться правильно.
Но если Activity1 запускает Activity2, что, в свою очередь, запускает MyService напрямую (опять же, я установил время), медиа не может воспроизводиться !!
Помните, что я вызываю Activity2 с теми же флагами намерений, с которыми я вызываю MyService:
intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
intent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
intent.addFlags(Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION);
Это неизбежно проблема, обозначенная @CommonsWare в этой ссылке . Я думал, что если я начну действия с теми же флагами намерений, то разрешение останется в силе. Но это НЕ так!