新的KitKat URI不响应Intent.ACTION_VIEW

urS*_*Sus 11 android uri android-intent

由于KitKat已将URI从拾取器更改为喜欢的

 content://com.android.providers.media.documents/document/image:3951
Run Code Online (Sandbox Code Playgroud)

那时我的ACTION_VIEW意图都不再有用了.例如,当用户选择图像时,我会使用

public static void openImage(Fragment f, Uri uri) {
        Intent intent = new Intent(Intent.ACTION_VIEW);
        intent.setDataAndType(uri, "image/*");

        f.startActivity(intent);
    }
Run Code Online (Sandbox Code Playgroud)

和Android图库和Google+照片一起出现,但选中后,图库只显示空白屏幕,照片显示"未找到中等"

声音也一样,我习惯使用

public static void playSound(Fragment f, Uri uri) {
    Intent intent = new Intent(Intent.ACTION_VIEW);
    intent.setDataAndType(uri, "audio/*");

    f.startActivity(intent);
}
Run Code Online (Sandbox Code Playgroud)

用于在以前的版本中显示Google Play音乐,使用小白色播放对话框UI.使用新的URI,我得到一个例外,没有应用程序能够处理此意图.

//对于照片,有趣的是,当你在新的KK选择器UI中选择Gallery而不是Pictures时,它会返回有效的旧URI.

有任何想法吗?系统应用程序还没有为新的uris做好准备吗?我应该以某种方式将新的uris破解为旧的uris以使意图有效吗?或者我错过了什么?

谢谢!

Rom*_*iel 5

解决方案是将标志传递FLAG_GRANT_READ_URI_PERMISSION给intent(在KitKat及以上):

intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
Run Code Online (Sandbox Code Playgroud)

还要确保从ACTION_OPEN_DOCUMENT意图中检索此内容Uri,如下所述:https://stackoverflow.com/a/19874645/334209