无法使用VLC for Android设置字幕

时间:2018-02-07 01:39:32

标签: android vlc vlc-android

在启动适用于Android的VLC的VideoPlayerActivity时,我无法设置字幕位置。我的目标是API 27并使用FileProvider来允许访问文件。

根据文档here,如果你设置了" subtitles_location"额外的,然后你可以提供字幕文件的路径。不幸的是,我似乎无法让它发挥作用。

我看到了"字幕"菜单项保持灰显状态,下载字幕似乎不会改变此状态。点击时,"选择字幕文件" VLC声明目录中没有字幕文件,URI的前缀是" content://"如预期的那样。

视频文件和字幕文件共享相同的父目录,并使用FileProvider提供。

如何在定位API> = 24时设置字幕文件?

更新

  • 似乎在点击字幕选择菜单项时,它会使用 视频文件的父目录。 This is seen here.
  • 想出来,请参阅下面的解决方案。

以下是我如何通过意图启动VideoPlayerActivity的一些代码段。

播放视频方式:

/**
 * Play a video using VLC media player. This method will play media by using
 * the VLC VideoPlayerActivity.
 *
 * @param activity         The current activity.
 * @param authority        The FileProvider authority.
 * @param vlcPackageName   The VLC package name.
 * @param vlcActivityName  The VLC activity name.
 * @param videoFile        The video file to play.
 * @param subtitlesFile    The subtitles file to play.
 * @param playbackPosition The playback position.
 * @param requestCode      The activity for result request code.
 */
public static void playVideo(
        AppCompatActivity activity,
        String authority,
        String vlcPackageName,
        String vlcActivityName,
        String vlcTitleExtra,
        String vlcPositionExtra,
        String vlcFromStartExtra,
        String vlcSubtitlesExtra,
        File videoFile,
        File subtitlesFile,
        long playbackPosition,
        int requestCode
) {
    Intent intent = new Intent(Intent.ACTION_VIEW);

    intent.setPackage(vlcPackageName);

    // Set component to VLC video player activity.
    intent.setComponent(new ComponentName(
            vlcPackageName,
            vlcActivityName
    ));

    // Set intent permission flags.
    intent.addFlags(Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION);
    intent.addFlags(Intent.FLAG_GRANT_PREFIX_URI_PERMISSION);
    intent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
    intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);

    // Set title and playback position.
    intent.putExtra(vlcTitleExtra, videoFile.getName());
    intent.putExtra(vlcPositionExtra, playbackPosition);
    intent.putExtra(vlcFromStartExtra, false);

    // Set video file location
    intent.setDataAndTypeAndNormalize(
            FileProvider.getUriForFile(
                    activity,
                    authority,
                    videoFile
            ),
            "video/*"
    );

    // Subtitles file provided, set location on intent.
    if (subtitlesFile != null) {
        intent.putExtra(
                vlcSubtitlesExtra,
                FileProvider.getUriForFile(
                        activity,
                        authority,
                        subtitlesFile
                )
        );
    }

    activity.startActivityForResult(intent, requestCode);
}

清单中的提供商定义

   <provider
        android:name="android.support.v4.content.FileProvider"
        android:authorities="com.masterwok.bitcast.fileprovider"
        android:exported="false"
        android:grantUriPermissions="true" >
        <meta-data
            android:name="android.support.FILE_PROVIDER_PATHS"
            android:resource="@xml/paths" />
    </provider>

@ xml / paths定义:

<?xml version="1.0" encoding="utf-8"?>
<paths>
    <external-path
        name="Download"
        path="Download/"/>
</paths>

1 个答案:

答案 0 :(得分:0)

我能够通过使用未记录的“item_location”额外定义来解决这个问题:here

当针对API&gt; = 24时,这解决了权限问题。发生的事情是VideoPlayerActivity正在尝试读取使用FileProvider提供的URI的父目录。如果我不得不猜测,我会说Android不允许这样做。

通过使用“item_location”extra传递URI,我们可以绕过这个限制。

我用来播放视频文件的方法现在如下:

[-3]