2015-01-22 3 views
0

나는 알림에서 사운드를 재생하기 위해 노력하고, 그래서 내가 URI를 구성하는 두 가지 방법을 시도 코드 왜 리소스 URI를 작성하는 두 가지 방법으로 Android에서 다른 결과를 얻을 수 있습니까?

Notification notification = new NotificationCompat.Builder(context) 
     .setSound(uri) 
     // ... more builder options 
     .build(); 

같은 있습니다. 첫번째

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

이고 둘째는 난이 각각의 기법에 의해 생성 된 URI를 인쇄하는 경우

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

는, I는 동일한 문자열 얻을이었다

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

그러나, 사운드 첫 번째 기법을 사용할 때 재생되지만 두 번째 기법을 사용할 때는 재생되지 않습니다. 왜 이런거야?

v4 지원 라이브러리가있는 Android 4.3 및 Android 4.4에서이 동작을 관찰했습니다.

+0

'uri1.equals (uri2)'의 결과는 무엇입니까? – HotIceCream

+0

'uri1.equals (uri2)'는'true'를 반환합니다. – dphilipson

+0

경로를 "//"로 설정하면 확실히 해킹이되며 Uri가 깨집니다. 그러나 그렇게하지 않고 "/"대신 "/"가되도록 구분 기호를 강제하지 않아도 작동하지 않습니다. 관련 클래스 중 하나에 버그가있는 것 같습니다. 그래도 실제로 어느 것을 알아 내지 못하니. UriBuilder는 괜찮아 보입니다. hmn. – icyerasor

답변

0

는 대신 //을 붙이는 당신의 URI에 올바른 권한을 설정해야합니다 : 나는 두 가지 방법이 동일한 문자열을 반환하고 동등한 비교 이후가 혼란 인정

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

을,하지만 나를 위해 그것을 해결거야.