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]"

[패키지]는 패키지 이름입니다.

[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-07-16

이것은 나를 위해 작동하지 않습니다. ActivityNotFoundException이 발생합니다. (android.content.ActivityNotFoundException : 인 텐트를 처리 할 활동이 없습니다 {act = android.intent.action.VIEW dat = android.resource : //com.mypackage.myapp/2130837582}. LG E400 Android 2.3.6.
Lucio Crusca

@LucioCrusca-의도 유형을 지정해야 할 수도 있습니다-jpeg 또는 png 이미지입니까?
Axarydax 2014

65

다음은 하드 코딩 된 문자열이나 URI 구문에 대한 임시 아이디어에 의존하지 않고 URI 문자열의 반복적 인 구성 및 분해를 피하면서 패턴을 android.net.Uri통해 클래스를 완전히 활용하는 깨끗한 솔루션입니다 Builder.

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"
댄 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
정말 foreslash에 상수를 만들었습니까 ??
Sartheris Stormhammer 2015 년

@SartherisStormhammer 예 :), 나는 보통 foreslash에 시스템 상수를 사용하지만;)
sandalone

4

이미지 리소스의 URI를 원하고 R.drawable.goomb이미지 리소스입니다. Builder 함수는 사용자가 요청하는 URI를 생성합니다.

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

그래서 당신은 경로에 "18"과 같은 것을 전달하고 있습니다. 그건 잘못된 것
닉 카르도소에게

@NickCardoso R.drawable.goomba는 내 리소스 폴더에있는 드로어 블입니다. 값이 18이면 할당이 잘못됩니까?
.08.09

물론 그렇습니다. developer.android.com/reference/android/net/… R 파일의 ID는 실제 경로를 확인하는 데 사용되어야합니다.
Nick Cardoso

@NickCardoso 감사하지만 그렇지 않으며 완벽하게 작동합니다. Scheme은 당신이 지적한 문서가 제안하는대로 그 경로를 처리합니다.
roide

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.