Android Неявное намерение запускает медиаплеер, но медиапроигрыватель говорит: «Намерение не имеет значения» - PullRequest
0 голосов
/ 29 марта 2020

Я сделал приложение, которое позволяет пользователю выбрать файл 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. Теперь я получаю ошибку.

enter image description here

Из журнала,

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 в этой ссылке . Я думал, что если я начну действия с теми же флагами намерений, то разрешение останется в силе. Но это НЕ так!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...