Androidで画像リソースのURIを取得する方法


96

次のように画像を表示するには、インテントを開く必要があります。

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

問題はそれUri uri = Uri.parse("@drawable/sample_1.jpg");が正しくないことです。

回答:


138

形式は次のとおりです。

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

[package]はパッケージ名です

[res id]はリソースIDの値です。例:R.drawable.sample_1

一緒に縫うには、

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


3
Uriパス= Uri.parse( "android.resource://net.londatiga.android.twitpic/" + R.drawable.icon); 文字列mpath = path.toString(); これを実行すると、そのようなファイルまたはディレクトリエラーは発生しません
hemanth kumar

4
電子メールの添付ファイルとして画像を送信しようとすると、ファイルは送信されますが、.jpg拡張子は付きません。したがって、画像は受信者のPCでは有効ではありません。
ルーベン2013年

@hemanthkumar参照としてこの回答を参照してください:stackoverflow.com/a/8476930/62921彼は、あなたのマシン以外には描画可能なフォルダーがないと説明しています。そのため、IDを使用し、path.toString()は機能しません。
ForceMagic 2013

これは私にはうまくいきません。ActivityNotFoundExceptionが発生します。(android.content.ActivityNotFoundException:いいえ活動テントを処理することが見出さ{作用= android.intent.action.VIEW DAT = android.resource://com.mypackage.myapp/2130837582} LG E400アンドロイド2.3.6。。
ルチオCrusca

@LucioCrusca-インテントタイプを指定する必要があるかもしれません-それはjpegまたはpng画像ですか?
Axarydax 2014

65

これは、ハードコーディングされた文字列やURI構文に関するアドホックなアイデアに依存することなくandroid.net.UriBuilderパターンを介してクラスを完全に活用し、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();

これは私の問題を解決しました。私のuriの形は「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) );
    }

9

エラーがある場合は、間違ったパッケージ名を入力している可能性があります。この方法を使用してください。

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

どこ

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

10
あなたは本当に前髪の定数を作りましたか?
Sartheris Stormhammer 2015

@SartherisStormhammerはい:)、ただし、通常はスラッシュにシステム定数を使用します;)
sandalone

4

画像リソースのURIが必要でありR.drawable.goomb、画像リソースである。Builder関数は、要求しているURIを作成します。

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

つまり、パスに「18」のようなものを渡しています。それは正しくないようです
Nick Cardoso

@NickCardoso R.drawable.goombaは、リソースフォルダーにあるドローアブルです。その値が18の場合、割り当てが正しくなくなりますか?
16

もちろんそうです。developer.android.com/reference/android/net/…実際のパスを解決するには、RファイルのIDを使用する必要があります。
Nick Cardoso

@NickCardosoありがとうございますが、実際には機能しません。あなたが指摘したドキュメントが示唆するように、Schemeはそのパスを処理します。
16

3

上記の回答に基づいて、プロジェクト内の任意のリソースの有効なUriを取得する方法に関するkotlinの例を共有したいと思います。コードに文字列を入力する必要がなく、間違って入力するリスクがあるため、これが最良のソリューションだと思います。

    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()
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.