【问题标题】:Android: Get video from Gallery uriAndroid:从库 uri 获取视频
【发布时间】:2016-12-18 13:28:23
【问题描述】:

我正在尝试从 Android 库中获取视频并获取完整路径,以便将视频上传到应用中...

我正在这样显示图库:

Intent intent = new Intent();
intent.setType("video/*");
intent.setAction(Intent.ACTION_GET_CONTENT);
activity.startActivityForResult(Intent.createChooser(intent, context.getResources().getString(R.string.popup_menu_share_video_title)), Const.PICK_VIDEO_REQUEST);

然后我提取 uri:

Uri selectedUri = data.getData();
String selectedPath = getRealPathFromURI(this, selectedUri);

并尝试获取路径:

public String getRealPathFromURI(Context context, Uri contentUri) {
    Cursor cursor = null;
    try {
        String[] proj = { MediaStore.Video.Media.DATA };
        cursor = context.getContentResolver().query(contentUri,  proj, null, null, null);
        int column_index = cursor.getColumnIndexOrThrow(MediaStore.Video.Media.DATA);
        cursor.moveToFirst();
        return cursor.getString(column_index);
    } finally {
        if (cursor != null) {
            cursor.close();
        }
    }
}

但我似乎无法找到路径...

如果我这样做,我可以看到所有视频:

public static void dumpVideos(Context context ) {
    Uri uri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI;
    String[] projection = { MediaStore.Video.Media.DATA };
    Cursor c = context.getContentResolver().query(uri, projection, null, null, null);
    int vidsCount = 0;
    if (c != null) {
        vidsCount = c.getCount();
        while (c.moveToNext()) {
            Log.d("VIDEO", c.getString(0));
        }
        c.close();
    }
    Log.d("VIDEO", "Total count of videos: " + vidsCount);
}

所以我想一定有一些真正简单的步骤,我错过了......

【问题讨论】:

    标签: android video android-intent android-gallery


    【解决方案1】:

    我正在尝试从 Android 图库中获取视频

    首先,没有“Android 图库”。有许多应用程序可能被视为“图库”应用程序。有数千种设备型号,除了用户安装的应用之外,它们还将附带各种各样的“图库”应用。

    其次,ACTION_GET_CONTENT 并不神奇地仅限于“图库”应用。任何应用程序都可以选择支持ACTION_GET_CONTENTvideo/*

    获取完整路径

    那是不可能的。您无法知道用户选择什么应用程序来处理您的ACTION_GET_CONTENT 请求。你无法知道你会得到什么样的Uri。您无法知道Uri 标识的内容将存储在哪里,因为它不必是您可以访问的文件系统上的文件。

    所以我可以在应用中上传视频

    ContentResolver 上使用openInputStream() 可在Uri 标识的内容上获得InputStream。然后,要么:

    • 直接使用该流与您首选的 HTTP 客户端 API 来上传内容,或者

    • 使用该流制作内容的本地文件副本,然后将该文件用于您首选的 HTTP 客户端

    并尝试获取路径:

    该代码最多只能在非常有限的情况下工作:

    • 用户选择处理你的ACTION_GET_CONTENT请求的应用恰好从MediaStore返回contentUri

    • 该内容恰好位于外部存储设备上,而不是可移动存储设备上

    由于这不会涵盖您的所有场景,因此请删除该代码。

    如果我这样做,我可以看到所有视频

    不,您可以获得一些视频的路径

    • 并非所有通过ACTION_GET_CONTENT 访问的视频都会为MediaStore 所知

    • 并非MediaStore 中的每个视频都在外部存储上,您可以通过文件系统 API 访问它

    【讨论】:

    • 虽然我很欣赏详细的解释,但这些都不是我想要完成的建议的解决方案。视频的上传已经开始工作,因为我已经在处理用户直接在应用程序中录制的视频。我只需要能够从设备中获取视频。我在 Stackoverflow 和各种博客上看到的所有提议的解决方案似乎都提出了我已经在做的事情,但是,我似乎无法从 uri 中获取视频......
    • @user969043:“我只需要能够从设备获取视频”——按照我的回答中的说明,在“使用openInputStream()... ”。或者,如果您想专门处理文件,请停止使用ACTION_GET_CONTENT,而改用文件浏览库。 “而且我在 Stackoverflow 和各种博客上看到的所有提议的解决方案似乎都提出了我已经在做的事情”——他们错了。你不能假设 ACTION_GET_CONTENT 中的 UriMediaStore 知道的东西,简单明了。
    【解决方案2】:

    您可以通过使用 ACTION_PICK 而不是 ACTION_GET_CONTENT 来解决此问题。我相信除非您需要从 Dropbox 等添加图片/视频的功能,否则不值得。如果您只需要从图库中获取内容,请使用以下代码:

     if (Build.VERSION.SDK_INT < 19) {
               final Intent photoPickerIntent = new Intent(Intent.ACTION_PICK);
               photoPickerIntent.setType("image/* video/*");
               startActivityForResult(photoPickerIntent, PICK_PHOTO_ACTIVITY_REQUEST_CODE);
     } else {
               final Intent photoPickerIntent = new Intent(Intent.ACTION_PICK);
               photoPickerIntent.setType("*/*");
               photoPickerIntent.putExtra(Intent.EXTRA_MIME_TYPES, new String[]{"image/*", "video/*"});
               startActivityForResult(photoPickerIntent, PICK_PHOTO_ACTIVITY_REQUEST_CODE);
     }
    

    我刚刚尝试了您使用 ACTION_PICK 发布的代码,它运行良好!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-12-19
      • 1970-01-01
      • 2017-10-21
      • 1970-01-01
      • 2016-01-21
      • 1970-01-01
      • 2013-07-20
      相关资源
      最近更新 更多