媒体商店的Android视频文件路径为空

媒体商店的Android视频文件路径为空,android,video,null,uri,mediastore,Android,Video,Null,Uri,Mediastore,我正在尝试获取视频缩略图的视频文件路径。我不知道为什么在我基于这里的一些解决方案进行修改后它仍然是空的。android的版本是6.0.1 用户单击浮动操作按钮,并调用视频库 FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.addNote); fab.setOnClickListener(new View.OnClickListener() { @Override pub

我正在尝试获取视频缩略图的视频文件路径。我不知道为什么在我基于这里的一些解决方案进行修改后它仍然是空的。android的版本是6.0.1

用户单击浮动操作按钮,并调用视频库

FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.addNote);
    fab.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Intent intent = new Intent();
            intent.setType("video/*");
            intent.setAction(Intent.ACTION_GET_CONTENT);
            startActivityForResult(Intent.createChooser(intent, "Select Video"), REQUEST_TAKE_GALLERY_VIDEO);
        }
    });
当用户从“多媒体资料”中选择所需的视频时,该视频将转到活动中,并将对其进行排序

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (resultCode == RESULT_OK) {

        Uri uri = data.getData();
        Log.d(TAG, "Uri: " + uri);

        Log.d(TAG, "Uri authority: " + uri.getAuthority());

        String filemanagerstring = uri.getPath();
        Log.d(TAG, "filemanagerstring: " + filemanagerstring);

        String selectedImagePath = getPath(uri);
        Log.d(TAG, "selectedImagePath: " + selectedImagePath);
    }
}
获取视频文件路径的方法

public String getPath(Uri uri) {

    Cursor cursor = this.getContentResolver().query(uri, null, null, null, null);
    int idx = 0;

    //Source not from device capture or selection
    if (cursor == null) {
        return uri.getPath();
    } else {
        cursor.moveToFirst();
        idx = cursor.getColumnIndex(MediaStore.Video.VideoColumns.DATA);
        if (idx == -1) {
            Log.d(TAG, "uri path: " + path);
            return uri.getPath();
        }
    }
    String path =  cursor.getString(idx);
    Log.d(TAG, "path: " + path);
    cursor.close();
    return path;
}
Uri: content://com.android.providers.media.documents/document/video%3A6174
Uri authority: com.android.providers.media.documents
filemanagerstring: /document/video:6174
**uri path: 16842794**
selectedImagePath: /document/video:6174

结果:我得到了null(-1)和uri的路径,这不是正确的路径。我需要视频文件的完整路径

public String getPath(Uri uri) {

    Cursor cursor = this.getContentResolver().query(uri, null, null, null, null);
    int idx = 0;

    //Source not from device capture or selection
    if (cursor == null) {
        return uri.getPath();
    } else {
        cursor.moveToFirst();
        idx = cursor.getColumnIndex(MediaStore.Video.VideoColumns.DATA);
        if (idx == -1) {
            Log.d(TAG, "uri path: " + path);
            return uri.getPath();
        }
    }
    String path =  cursor.getString(idx);
    Log.d(TAG, "path: " + path);
    cursor.close();
    return path;
}
Uri: content://com.android.providers.media.documents/document/video%3A6174
Uri authority: com.android.providers.media.documents
filemanagerstring: /document/video:6174
**uri path: 16842794**
selectedImagePath: /document/video:6174
并召集了一个视频库

不,没有。它允许用户从支持MIME类型的
video/*
ACTION\u GET\u CONTENT
的任何活动中进行选择。您返回的
Uri
可以来自任何东西,不一定是“多媒体资料”应用程序,也不一定是指向文件的应用程序。
Uri
可以指向:

  • 外部存储器上的文件,可以直接读取
  • 可移动存储上无法访问的文件
  • 某个其他应用程序的内部存储上的文件
  • 数据库中
    BLOB
    列的内容
  • 必须在飞行中解密的东西
  • 设备上尚不存在且需要下载的内容
  • 等等
获取视频文件路径的方法

您可以从
query()
中可靠地返回的唯一值是内容大小和“显示名称”的
OpenableColumns

您需要:

  • 使用接受
    内容
    Uri
    作为参数的缩略图引擎,或

  • 使用
    ContentResolver
    openInputStream()
    获取内容上的
    InputStream
    ,然后使用接受
    InputStream
    作为参数的缩略图引擎,或

  • 使用
    ContentResolver
    openInputStream()
    获取内容上的
    InputStream
    ,然后使用该流创建包含内容字节副本的您自己的文件,这样您就可以将您自己的文件与需要文件的缩略图引擎一起使用,或者

  • 不要使用
    ACTION\u GET\u CONTENT
    ,而是通过询问所有视频的
    MediaStore
    来呈现您自己的“选择器”用户界面,因为您可以从
    MediaStore
    获取这些视频的缩略图(请参阅)

并召集了一个视频库

不,没有。它允许用户从支持MIME类型的
video/*
ACTION\u GET\u CONTENT
的任何活动中进行选择。您返回的
Uri
可以来自任何东西,不一定是“多媒体资料”应用程序,也不一定是指向文件的应用程序。
Uri
可以指向:

  • 外部存储器上的文件,可以直接读取
  • 可移动存储上无法访问的文件
  • 某个其他应用程序的内部存储上的文件
  • 数据库中
    BLOB
    列的内容
  • 必须在飞行中解密的东西
  • 设备上尚不存在且需要下载的内容
  • 等等
获取视频文件路径的方法

您可以从
query()
中可靠地返回的唯一值是内容大小和“显示名称”的
OpenableColumns

您需要:

  • 使用接受
    内容
    Uri
    作为参数的缩略图引擎,或

  • 使用
    ContentResolver
    openInputStream()
    获取内容上的
    InputStream
    ,然后使用接受
    InputStream
    作为参数的缩略图引擎,或

  • 使用
    ContentResolver
    openInputStream()
    获取内容上的
    InputStream
    ,然后使用该流创建包含内容字节副本的您自己的文件,这样您就可以将您自己的文件与需要文件的缩略图引擎一起使用,或者

  • 不要使用
    ACTION\u GET\u CONTENT
    ,而是通过询问所有视频的
    MediaStore
    来呈现您自己的“选择器”用户界面,因为您可以从
    MediaStore
    获取这些视频的缩略图(请参阅)


“我需要视频文件的完整路径”-不,您需要视频缩略图。不必有“完整路径”,因为不必有文件,更不用说可以在文件系统上访问的文件了。这个
Uri
来自哪里?这个Uri来自Uri=data.getData();在onActivityResult中。用户将从多媒体资料中选择视频(如果这是您想要知道的)。谢谢你的快速回复!触发此调用的
onActivityResult()
调用是什么?我在最初的帖子中添加了更多信息。“我需要视频文件的完整路径”-不,您需要视频缩略图。不必有“完整路径”,因为不必有文件,更不用说可以在文件系统上访问的文件了。这个
Uri
来自哪里?这个Uri来自Uri=data.getData();在onActivityResult中。用户将从多媒体资料中选择视频(如果这是您想要知道的)。谢谢你的快速回复!触发activityResult()调用的
startActivityForResult()
调用是什么?我在最初的帖子中添加了一些更多的信息。我需要消化这些信息。我会提前把这个标记为答案。谢谢。我决定使用第四个选项作为解决此问题的最简单方法。与我一直使用的解决方案相比,这个解决方案看起来非常简单