Java 如何从UsbStorageProvider文档uri获取视频缩略图

Java 如何从UsbStorageProvider文档uri获取视频缩略图,java,android,android-contentprovider,usb-otg,Java,Android,Android Contentprovider,Usb Otg,问题的根源是来自和UsbStorageProvider的UsbFile 我尝试从uri.getPath()->/document/usb1002:/GOPR04252.MP4中提取视频帧 像 ImageUtils.getVideoThumbnail(documentUri.getPath(),size.x,size.y) 方法自 但它返回null。为什么以及如何修复它??还有别的办法解决这个问题吗 或 检查注释的getUsbPath方法调用 如何实现返回该文件路径的getUsbPath(UsbF

问题的根源是来自和UsbStorageProvider的
UsbFile

我尝试从uri.getPath()->/document/usb1002:/GOPR04252.MP4中提取视频帧

ImageUtils.getVideoThumbnail(documentUri.getPath(),size.x,size.y)

方法自

但它返回null。为什么以及如何修复它??还有别的办法解决这个问题吗

检查注释的
getUsbPath
方法调用

如何实现返回该文件路径的getUsbPath(UsbFile)方法


假设,如果我们将
UsbFile
转换为
File
documentUri
转换为
File

在示例文字中为USB OTG实现视频缩略图

但它返回null。为什么

您正在传入一个随机字符串,该字符串是通过对没有
文件
方案的
Uri
调用
getPath()
获得的。这类似于在指向此网页的
Uri
上调用
getPath()
,然后想知道为什么您的硬盘驱动器没有位于
/questions/42783353/自定义提供程序Uri to path或usbfile to file path
的文件

如何实现返回该文件路径的getUsbPath(UsbFile)方法

按照中的说明将该文件的内容复制到您控制的文件中(例如,
getCacheDir()


或者,找到一些只与
InputStream
一起工作的API,并将
UsbFileInputStream

@pskink交给它。这将在外部环境下工作,我有docId usb1002:/GOPR0462.MP4和docRootId=“usb1002”但是getThumbnail需要长id。请检查它的文档OK,然后尝试
MediaMetadataRetriever
它有
setDataSource(上下文上下文,Uri)
方法,以便work@pskink无法设置uri。它说java.lang.RuntimeException:setDataSource失败:status=0xFFFFFFASO正如@commonware所说,您必须复制该文件的内容“
somewhere@pskink哪个最适合USB视频资源管理器。或者mjdev:libaums.你是对的。我想我应该使用
InputStream is=newusbfileinputstream(usbFile)谢谢这意味着当我在exo player和Android VideoView中使用usbFile播放视频而不复制内容时,我将面临问题。您有什么建议?@Qamar:您可以尝试将
Uri
StorageProvider
传递到第三方应用程序。或者,您必须使用HTTP库集成,记住这会带来安全后果。内容位于与Android设备连接的OTG USB中。为什么集成HTTP库plz解释我的知识。顺便说一句,所有视频都使用本机USB explorer播放。仅供参考。我只开发内置图像查看器和视频播放器的USB媒体资源管理器。@Qamar:“所有视频都使用本机USB资源管理器播放”--系统通过
内容提供商
提供这些内容,并且系统比您更好地访问可移动存储。“为什么要集成HTTP库”--您可以复制视频,以
内容提供商的身份尝试库的
存储提供商
,也可以通过嵌入式Web服务器将视频提供给播放机(同样具有安全性分支)。您没有许多选项既可用于所选库,也可用于媒体播放器。
public static Bitmap getVideoThumbnail(String path, int mMaxWidth, int mMaxHeight){
        Bitmap.Config mDecodeConfig = Bitmap.Config.RGB_565;
        ImageView.ScaleType mScaleType = ImageView.ScaleType.CENTER_CROP;

        File bitmapFile = new File(path);
        Bitmap bitmap = null;

        if (!bitmapFile.exists() || !bitmapFile.isFile()) {
            return bitmap;
        }
....
}
//row.add(Document.COLUMN_PATH, getUsbPath(file));