0

我制作了一个应用程序,让用户可以选择一个 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:

我尝试使用 VLC for Android 运行 API 27 的模拟器。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,而Activity2又直接启动MyService(我再次设置时间),媒体无法播放!!

请记住,我使用与调用 MyService 相同的意图标志调用 Activity2:

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在此链接中指出的问题。我认为如果我以相同的意图标志开始活动,那么许可将保持有效。但事实并非如此!

4

0 回答 0