为什么两种构建资源URI的方法在Android中会产生不同的结果?

为什么两种构建资源URI的方法在Android中会产生不同的结果?,android,uri,android-notifications,android-resources,Android,Uri,Android Notifications,Android Resources,我试图播放通知中的声音,所以我有如下代码 Notification notification = new NotificationCompat.Builder(context) .setSound(uri) // ... more builder options .build(); 我尝试了两种不同的构造uri的方法。第一个是 Uri uri = Uri.parse(String.format("android.resource://%s/%d"

我试图播放通知中的声音,所以我有如下代码

Notification notification = new NotificationCompat.Builder(context)
        .setSound(uri)
        // ... more builder options
        .build();
我尝试了两种不同的构造uri的方法。第一个是

Uri uri = Uri.parse(String.format("android.resource://%s/%d",
                                  context.getPackageName(),
                                  resourceId));
第二个是

Uri uri = new Uri.Builder().scheme("android.resource")
                           .path("//")
                           .appendPath(context.getPackageName())
                           .appendPath(Integer.toString(resourceId))
                           .build();
如果我打印这些技术生成的URI,我会得到一个相同的字符串:

android.resource://com.example.notification/2130968576
但是,当我使用第一种技术时,声音会播放,但当我使用第二种技术时,声音不会播放。为什么会这样


我在Android 4.3和Android 4.4以及v4支持库上观察到了这种行为。

您必须在uri中设置正确的权限,而不是预先设置
/

Uri uri = new Uri.Builder().scheme("android.resource")
                       .authority(context.getPackageName())
                       .path(Integer.toString(resourceId))
                       .build();

我承认这很混乱,因为这两个方法返回相同的字符串并比较相等,但这就是我修复它的原因。

uri1.equals(uri2)的结果是什么?
uri1.equals(uri2)
返回
true
。将路径设置为“/”肯定是一个难题,会破坏您的Uri。但即使不这样做,因此不强制方案分隔符为“/”而不是“/”,它也不起作用。似乎是其中一个相关类中的一个bug。我真的不知道是哪一个。看起来很好。。嗯。