cómo obtener un uri de un recurso de imagen en Android

96

Necesito abrir una intención para ver una imagen de la siguiente manera:

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

El problema es que Uri uri = Uri.parse("@drawable/sample_1.jpg");es incorrecto.

user602874
fuente

Respuestas:

138

El formato es:

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

[paquete] es el nombre de su paquete

[res id] es el valor del ID del recurso, por ejemplo, R.drawable.sample_1

para unirlo, use

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

Axarydax
fuente
3
Uri path = Uri.parse ("android.resource: //net.londatiga.android.twitpic/" + R.drawable.icon); String mpath = path.toString (); No obtengo ese error de archivo o directorio cuando estoy haciendo esto
hemanth kumar
4
cuando intento enviar una imagen como archivo adjunto de correo electrónico, está enviando el archivo pero sin la extensión .jpg. Entonces la imagen no es válida en el PC del destinatario.
ruben
@hemanthkumar Vea esta respuesta como referencia: stackoverflow.com/a/8476930/62921 Explica que no hay una carpeta que se pueda dibujar excepto en su máquina. Es por eso que usa ID y que su path.toString () no funciona.
ForceMagic
Esto no funciona para mi. Recibo ActivityNotFoundException. (android.content.ActivityNotFoundException: No se encontró actividad para manejar Intent {act = android.intent.action.VIEW dat = android.resource: //com.mypackage.myapp/2130837582}. LG E400 Android 2.3.6.
Lucio Crusca
@LucioCrusca - tal vez debería especificar el tipo de intención - ¿es una imagen jpeg o png?
Axarydax
65

Aquí hay una solución limpia que aprovecha completamente la android.net.Uriclase a través de su Builderpatrón, evitando la composición y descomposición repetidas de la cadena URI, sin depender de cadenas codificadas o ideas ad hoc sobre la sintaxis 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();
Uli
fuente
esto resolvió mi problema. Mi forma de uri era como "android.resource: //com.craiovadata.guessthecountry/drawable/sky"
Dan Alboteanu
56
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) );
    }
xnagyg
fuente
9

Para aquellos que tengan errores, es posible que estén ingresando el nombre del paquete incorrecto. Solo usa este método.

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

Dónde

public static final String ANDROID_RESOURCE = "android.resource://";
public static final String FORESLASH = "/";
sandalias
fuente
10
¿Realmente hiciste una constante para un preludio?
Sartheris Stormhammer
@SartherisStormhammer Sí :), aunque normalmente uso la constante del sistema para el destello;)
sandalone
4

Quiere el URI del recurso de imagen y R.drawable.goombes un recurso de imagen. La función Builder crea el URI que está solicitando:

String resourceScheme = "res";
Uri uri = new Uri.Builder()
  .scheme(resourceScheme)
  .path(String.valueOf(intResourceId))
  .build();
roide
fuente
Entonces estás pasando algo como "18" a la ruta. Eso parece incorrecto
Nick Cardoso
@NickCardoso R.drawable.goomba es el dibujable que tengo en mi carpeta de recursos. Si su valor es 18, ¿hace que la asignación sea incorrecta?
Roide el
Claro que lo hace. developer.android.com/reference/android/net/… El ID en el archivo R debe usarse para resolver una ruta real.
Nick Cardoso
@NickCardoso gracias pero no funciona y funciona perfectamente. El esquema se encarga de esa ruta como sugiere la documentación que señaló.
Roide
3

Basado en las respuestas anteriores, quiero compartir un ejemplo de kotlin sobre cómo obtener un Uri válido para cualquier recurso en su proyecto. Creo que es la mejor solución porque no tiene que escribir ninguna cadena en su código y se arriesga a escribirla incorrectamente.

    val resourceId = R.raw.scannerbeep // r.mipmap.yourmipmap; R.drawable.yourdrawable
    val uriBeepSound = Uri.Builder()
        .scheme(ContentResolver.SCHEME_ANDROID_RESOURCE)
        .authority(resources.getResourcePackageName(resourceId))
        .appendPath(resources.getResourceTypeName(resourceId))
        .appendPath(resources.getResourceEntryName(resourceId))
        .build()
Sergio
fuente