2011-02-04 10 views
72

muszę otworzyć intencję aby zobaczyć obraz w następujący sposób:jak uzyskać URI zasobu obrazu w android

Intent intent = new Intent(Intent.ACTION_VIEW); 
Uri uri = Uri.parse("@drawable/sample_1.jpg"); 
intent.setData(uri); 
startActivity(intent); 

Problemem jest to, że Uri uri = Uri.parse("@drawable/sample_1.jpg"); jest nieprawidłowy.

Odpowiedz

119

w formacie:

"android.resource://[package]/[res id]"

[pakiet] to nazwę pakietu

[Res id] jest wartość, identyfikator zasobów, np R.drawable.sample_1

zszyć je razem, użyj

Uri path = Uri.parse("android.resource://your.package.name/" + R.drawable.sample_1);

+0

Czy to działa u każdego? –

+4

otrzymał 21 przegranych, więc domyślam się, że tak – Axarydax

+0

Uri path = Uri.parse ("android.resource: //net.londatiga.android.twitpic/" + R.drawable.icon); \t Łańcuch mpath = ścieżka.toString(); Otrzymuję Brak takiego pliku lub błędu katalogu, gdy robię to –

9

Dla osób mających problem, może być wprowadzenie złą nazwę pakietu. Po prostu użyj tej metody.

public static Uri resIdToUri(Context context, int resId) { 
    return Uri.parse(Consts.ANDROID_RESOURCE + context.getPackageName() 
        + Consts.FORESLASH + resId); 
} 

Gdzie

public static final String ANDROID_RESOURCE = "android.resource://"; 
public static final String FORESLASH = "/"; 
+4

czy naprawdę zrobiłeś stałą dla foreslash? –

+0

@SartherisStormhammer Tak :), chociaż zwykle używam stałej systemowej dla foreslash;) – sandalone

43
public static Uri resourceToUri(Context context, int resID) { 
     return Uri.parse(ContentResolver.SCHEME_ANDROID_RESOURCE + "://" + 
       context.getResources().getResourcePackageName(resID) + '/' + 
       context.getResources().getResourceTypeName(resID) + '/' + 
       context.getResources().getResourceEntryName(resID)); 
    } 
3

Chcesz URI zasobu obrazu i R.drawable.goomb jest zasobem obrazu. Funkcja Builder tworzy URI, że jesteś z prośbą o:

String resourceScheme = "res"; 
Uri uri = new Uri.Builder() 
    .scheme(resourceScheme) 
    .path(String.valueOf(intResourceId)) 
    .build(); 
+0

Przesyłamy coś takiego jak "18" do ścieżki. To wydaje się nieprawidłowe –

+0

@NickCardoso R.drawable.goomba to zbiór, który mam w moim folderze zasobów. Jeśli ma wartość 18, czy przypisanie jest nieprawidłowe? – roide

+0

Oczywiście, że tak. https://developer.android.com/reference/android/net/Uri.Builder.html#path(java.lang.String) Identyfikator w pliku R musi być użyty do rozwiązania rzeczywistej ścieżki. –

31

Oto czyste rozwiązanie, które w pełni wykorzystuje klasę android.net.Uri poprzez jego Builder wzór, unikając powtarzającego składu i rozkładu ciąg URI, bez polegania na sprzęt komputerowy zakodowane ciągi lub pomysły ad hoc na temat składni URI.

Resources resources = context.getResources(); 
Uri uri = new Uri.Builder() 
    .scheme(ContentResolver.SCHEME_ANDROID_RESOURCE) 
    .authority(resources.getResourcePackageName(resourceId)) 
    .appendPath(resources.getResourceTypeName(resourceId)) 
    .appendPath(resources.getResourceEntryName(resourceId)) 
    .build(); 
Powiązane problemy