wie man eine uri einer bildressource in android bekommt

96

Ich muss die Absicht öffnen, ein Bild wie folgt anzuzeigen:

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

Das Problem ist, dass Uri uri = Uri.parse("@drawable/sample_1.jpg");das falsch ist.

user602874
quelle

Antworten:

138

Das Format ist:

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

[Paket] ist Ihr Paketname

[res id] ist der Wert der Ressourcen-ID, z. B. R.drawable.sample_1

Verwenden Sie zum Zusammennähen

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

Axarydax
quelle
3
Uri path = Uri.parse ("android.resource: //net.londatiga.android.twitpic/" + R.drawable.icon); String mpath = path.toString (); Ich bekomme keinen solchen Datei- oder Verzeichnisfehler, wenn ich das mache
Hemanth Kumar
4
Wenn ich versuche, ein Bild als E-Mail-Anhang zu senden, wird die Datei gesendet, jedoch ohne die Erweiterung .jpg. Das Bild ist also auf dem Empfänger-PC nicht gültig.
Ruben
@hemanthkumar Diese Antwort als Referenz anzeigen : stackoverflow.com/a/8476930/62921 Er erklärt, dass es außer auf Ihrem Computer keinen zeichnbaren Ordner gibt. Aus diesem Grund werden IDs verwendet und Ihr path.toString () funktioniert nicht.
ForceMagic
Das funktioniert bei mir nicht. Ich erhalte ActivityNotFoundException. (android.content.ActivityNotFoundException: Keine Aktivität für Intent gefunden {act = android.intent.action.VIEW dat = android.resource: //com.mypackage.myapp/2130837582}. LG E400 Android 2.3.6.
Lucio Crusca
@ LucioCrusca - vielleicht sollten Sie den Absichtstyp angeben - ist es JPEG oder PNG-Bild?
Axarydax
65

Hier ist eine saubere Lösung, die die android.net.UriKlasse über ihr BuilderMuster voll ausnutzt und wiederholtes Zusammensetzen und Zerlegen der URI-Zeichenfolge vermeidet, ohne sich auf fest codierte Zeichenfolgen oder Ad-hoc-Ideen zur URI-Syntax zu verlassen.

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
quelle
Das hat mein Problem gelöst. Meine Uri-Form war wie "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
quelle
9

Bei Fehlern geben Sie möglicherweise den falschen Paketnamen ein. Verwenden Sie einfach diese Methode.

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

Wo

public static final String ANDROID_RESOURCE = "android.resource://";
public static final String FORESLASH = "/";
Sandale
quelle
10
Hast du wirklich eine Konstante für einen Vorschlitz gemacht?
Sartheris Stormhammer
@ ArtherisStormhammer Ja :), obwohl ich normalerweise Systemkonstante für Foreslash verwende;)
Sandalone
4

Sie möchten den URI der Bildressource und R.drawable.goombsind eine Bildressource. Die Builder-Funktion erstellt den URI, nach dem Sie fragen:

String resourceScheme = "res";
Uri uri = new Uri.Builder()
  .scheme(resourceScheme)
  .path(String.valueOf(intResourceId))
  .build();
roide
quelle
Sie übergeben also so etwas wie "18" an den Pfad. Das scheint falsch
Nick Cardoso
@NickCardoso R.drawable.goomba ist das Drawable, das ich in meinem Ressourcenordner habe. Wenn der Wert 18 ist, ist die Zuordnung dann falsch?
Fahren Sie
Natürlich tut es das. developer.android.com/reference/android/net/… Die ID in der R-Datei muss verwendet werden, um einen echten Pfad aufzulösen.
Nick Cardoso
@ NickCardoso danke, aber es funktioniert nicht und es funktioniert perfekt. Das Schema kümmert sich um diesen Pfad, wie aus der Dokumentation hervorgeht, auf die Sie hingewiesen haben.
Fahren Sie
3

Basierend auf den obigen Antworten möchte ich ein Kotlin-Beispiel dazu geben, wie Sie einen gültigen Uri für jede Ressource in Ihrem Projekt erhalten. Ich denke, es ist die beste Lösung, weil Sie keine Zeichenfolgen in Ihren Code eingeben müssen und das Risiko eingehen, ihn falsch einzugeben.

    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
quelle