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

时间:2015-01-22 19:44:30

标签: 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",
                                  context.getPackageName(),
                                  resourceId));

,第二个是

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

如果我打印由这些技术生成的uris,我会得到一个相同的字符串:

android.resource://com.example.notification/2130968576

但是,当我使用第一种技术时会播放声音,但是当我使用第二种技术时声音不播放。这是为什么?

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

1 个答案:

答案 0 :(得分:0)

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

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

我承认它令人困惑,因为两种方法都返回相同的字符串并且比较相等,但这就是为我修复它的原因。