我制作了一个应用程序,让用户可以选择一个 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在此链接中指出的问题。我认为如果我以相同的意图标志开始活动,那么许可将保持有效。但事实并非如此!