来自媒体商店的Android视频文件路径将显示为空

时间:2016-10-20 17:58:23

标签: android video null uri mediastore

我正在尝试获取视频缩略图的视频文件的路径。在我根据这里的一些解决方案进行修改之后,我不确定为什么它仍然是空的。 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;
}

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

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

1 个答案:

答案 0 :(得分:2)

  

并召集视频库

不,它没有。它允许用户从任何支持ACTION_GET_CONTENT的活动中选择MIME类型为video/*的活动。您获得的Uri可以来自任何内容,不一定是“图库”应用,也不一定是指向文件的应用。 Uri可以指向:

  • 外部存储上的文件,您可以直接阅读
  • 可移动存储上的文件,您无法访问
  • 其他应用程序的内部存储上的文件
  • 数据库中BLOB列的内容
  • 必须动态解密的东西
  • 设备上尚不存在且需要下载的内容
  • 等等
  

获取视频文件路径的方法

对于内容的大小和“显示名称”,您可以可靠地从query()获得的唯一值是OpenableColumns

您需要:

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

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

  • 使用ContentResolveropenInputStream()获取内容的InputStream,然后使用该流制作自己的文件,其中包含内容中字节的副本,因此,您可以将自己的文件与需要文件的缩略图引擎一起使用,或者

  • 请勿使用ACTION_GET_CONTENT,而是通过向MediaStore询问所有视频来呈现您自己的“选择器”用户界面,因为您可以从MediaStore获取这些视频的缩略图(见this sample app