cách lấy một tài nguyên hình ảnh trong android


96

Tôi cần mở một ý định để xem một hình ảnh như sau:

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

Vấn đề là điều đó Uri uri = Uri.parse("@drawable/sample_1.jpg");không chính xác.

Câu trả lời:


138

Định dạng là:

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

[gói] là tên gói của bạn

[res id] là giá trị của ID tài nguyên, ví dụ: R.drawable.sample_1

để ghép nó lại với nhau, sử dụng

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


3
Đường dẫn Uri = Uri.parse ("android.resource: //net.londatiga.android.twitpic/" + R.drawable.icon); String mpath = path.toString (); Tôi nhận được Không có tập tin hoặc thư mục lỗi khi tôi đang làm điều này
Hemanth kumar

4
khi tôi cố gắng gửi hình ảnh dưới dạng tệp đính kèm email, nó đang gửi tệp nhưng không có phần mở rộng .jpg. Vì vậy, hình ảnh không hợp lệ trong máy tính người nhận.
ruben

@hemanthkumar Xem câu trả lời này như một tài liệu tham khảo: stackoverflow.com/a/8476930/62921 Anh ấy giải thích rằng không có thư mục nào có thể vẽ được ngoại trừ trên máy của bạn. Đó là lý do tại sao nó sử dụng ID và path.toString () của bạn không hoạt động.
ForceMagic,

Điều này không làm việc cho tôi. Tôi nhận được ActivityNotFoundException. (android.content.ActivityNotFoundException: Không tìm thấy Hoạt động nào để xử lý Intent {act = android.intent.action.VIEW dat = android.resource: //com.mypackage.myapp/2130837582}. LG E400 Android 2.3.6.
Lucio Crusca

@LucioCrusca - có thể bạn nên chỉ định loại ý định - đó là hình ảnh jpeg hay png?
Axarydax

65

Đây là một giải pháp hoàn toàn tận dụng android.net.Urilớp thông qua Buildermẫu của nó , tránh việc thành phần lặp lại và phân hủy chuỗi URI, mà không dựa vào các chuỗi được mã hóa cứng hoặc ý tưởng đặc biệt về cú pháp 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();

điều này đã giải quyết vấn đề của tôi. Hình dạng bồn tiểu của tôi giống như "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

Đối với những người gặp lỗi, bạn có thể nhập sai tên gói. Chỉ cần sử dụng phương pháp này.

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

Ở đâu

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

10
bạn đã thực sự tạo ra một hằng số cho một dự báo trước ??
Sartheris Stormhammer

@SartherisStormhammer Có :), mặc dù tôi thường sử dụng hệ thống liên tục cho foreslash;)
sandalone

4

Bạn muốn URI của tài nguyên hình ảnh và R.drawable.goomblà tài nguyên hình ảnh. Hàm Builder tạo URI mà bạn đang yêu cầu:

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

Vì vậy, bạn đang chuyển một cái gì đó như "18" đến đường dẫn. Điều đó có vẻ không chính xác
Nick Cardoso

@NickCardoso R.drawable.goomba là tệp có thể kéo mà tôi có trong thư mục tài nguyên của mình. Nếu giá trị của nó là 18, điều đó có làm cho phép gán không chính xác không?
đi

Tất nhiên là thế. developer.android.com/reference/android/net/… ID trong tệp R cần được sử dụng để phân giải một đường dẫn thực.
Nick Cardoso

@NickCardoso cảm ơn nhưng nó không và nó hoạt động hoàn hảo. Đề án chăm sóc con đường đó như tài liệu bạn đã chỉ ra cho thấy.
đi

3

Dựa trên các câu trả lời ở trên, tôi muốn chia sẻ một ví dụ về kotlin về cách lấy một Uri hợp lệ cho bất kỳ tài nguyên nào trong dự án của bạn. Tôi nghĩ đó là giải pháp tốt nhất vì bạn không phải nhập bất kỳ chuỗi nào trong mã của mình và có nguy cơ nhập sai.

    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()
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.