【问题标题】:data.getData() sometimes returns nulldata.getData() 有时返回 null
【发布时间】:2020-01-11 19:48:33
【问题描述】:

我正在从图库中选择一个视频文件,但在某些情况下data.getData() 返回 null。

我通过调用以下命令打开图库:

Intent intent;
if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
    intent = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Video.Media.EXTERNAL_CONTENT_URI);
} else {
    intent = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Video.Media.INTERNAL_CONTENT_URI);
}

intent.setType("video/*");
intent.setAction(Intent.ACTION_GET_CONTENT);
intent.putExtra("return-data", true);
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
startActivityForResult(intent, SELECT_VIDEO_REQUEST);

然后在onActivityResult我首先检查data.getData()是否为空,如果是我显示Toast消息:

if (data.getData() != null) {
    //Do stuff
}else{
    //Display Toast
}

在看到this blog post之后,我已经实现了上述。

一些用户联系我说他们经常收到Toast 消息。

谁能告诉我为什么data.getDataMediaStore选择视频文件时返回null?


编辑 1:

经过更多研究,我找到了this answer。所以我将我的startActivityForResult Intent 更改为以下内容:

startActivityForResult(Intent.createChooser(new Intent().
    setAction(Intent.ACTION_GET_CONTENT).
    setType("video/mp4"), "Select Video"),
    SELECT_VIDEO_REQUEST);

我仍然不确定这是否会解决我的问题,因为根据该答案"The protocol for ACTION_PICK requires you to supply a Uri indicating the collection you are picking from" 我做得正确。我首先检查是否安装了 SD 卡并相应地更改 Uri android.provider.MediaStore.Video.Media.EXTERNAL_CONTENT_URI

This answer 也暗示了下面的"you will find support of ACTION_PICK spotty and inconsistent"

如果有人能为我提供一个信息丰富的答案,我将非常感激为什么我的实施在某些情况下会失败,以及新的实施是否能解决我遇到的问题?

【问题讨论】:

  • @AbhishekKumar 请查看您提供的链接,然后查看我的实现 - intent.setAction(Intent.ACTION_GET_CONTENT);

标签: java android


【解决方案1】:

试试这个代码,它在我的设备上运行良好

 Intent videopicker = new Intent(Intent.ACTION_GET_CONTENT);
            videopicker.setType("*/*");
            videopicker.putExtra(Intent.EXTRA_MIME_TYPES,"video/*");
            startActivityForResult(videopicker, VIDEOPICK);

onActivityResult

 @Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    try {
        if (resultCode == RESULT_OK) {
            if (requestCode == VIDEOPICK) {
               Uri selectedvideo = data.getData();
               String videopath = selectedvideo.getPath();
                File file = new File(videopath);
                Log.e("path",file.getAbsolutePath());
            }
        }

    }catch (Exception e){

    }
}

【讨论】:

    【解决方案2】:

    那么如果你的android版本是7.0及以上你需要设置fileprovider.xml你在你的实现中使用过吗?

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-23
    相关资源
    最近更新 更多