文档章节

android 获取应用的资源id和uri

IamOkay
 IamOkay
发布于 2014/12/08 10:31
字数 744
阅读 2.4W
收藏 0

在某些应用中,为了实现应用apk资源放入重复利用,或者使用反射得到本应用的资源,需要使用反射反射方式获得,但Resources类中也自带了这种获取方式,并且功能更加强大

 

你可以获取string,color,drawable,raw,xml等文件,因此也就意味着,这里可以获取的资源是res中已定义的资源,对于控件id的获取,暂时无法做到

 

android.content.res.Resources.class

 public int getIdentifier(String name, String defType, String defPackage) {
        if (name == null) {
            throw new NullPointerException("name is null");
        }
        try {
            return Integer.parseInt(name);
        } catch (Exception e) {
            // Ignore
        }
        return mAssets.getResourceIdentifier(name, defType, defPackage);
    }

一.获取资源的id

1.如下,我们可以获取当前应用的资源id

 int drawableId = mContext.getResources().getIdentifier("ic_launcher","drawable", mContext.getPackageName());
 mImageView.setImageResource(drawableId);

2.我们也可以获取其他应用的资源id

Resources resources = context.getResources();
int indentify= getResources().getIdentifier("icon", "drawable", "org.anddev.android.testproject");

int resId = getResources().getIdentifier("background", "color", getPackageName());
startBtn.setTextColor(getResources().getColor(resId));

对于这种方式,我们也可以这么做

int indentify = getResources().getIdentifier("org.loveandroid.androidtest:drawable/icon",null,null);

 

3.进行封装一下

public static int getResourceId(Context context,String name,String type,String packageName){
        Resources themeResources=null;
        PackageManager pm=context.getPackageManager();
        try {
            themeResources=pm.getResourcesForApplication(packageName);
            return themeResources.getIdentifier(name, type, packageName);
        } catch (NameNotFoundException e) {

            e.printStackTrace();
        }
        return 0;
 }

 

二.获取资源的uri

android系统中,应用的资源存储时也通常会被存入 数据库,也可以被共享,因此来说资源会获得应用的uri

Uri uri = Uri.parse("android.resource://"+getPackageName()+"/"+R.raw.xinyueshenhua);
Uri uri = Uri.parse("android.resource://"+getPackageName()+"/"+R.drawable.ic_launcher);

我们也可以进一步封装

public static  Uri getResourceUri(int resId,String packageName)
{
    return Uri.parse("android.resource://"+packageName+"/"+resId);
}

 

比如获取图片

Uri mImageCaptureUri = data.getData();
Bitmap photoBmp = null;
if (mImageCaptureUri != null) {
    photoBmp = MediaStore.Images.Media.getBitmap(ac.getContentResolver(), mImageCaptureUri);
}

或如下方式

/** 
     * 通过uri获取图片并进行压缩 
     * 
     * @param uri 
     */  
    public static Bitmap getBitmapFormUri(Activity ac, Uri uri) throws FileNotFoundException, IOException {  
        InputStream input = ac.getContentResolver().openInputStream(uri);  
        BitmapFactory.Options onlyBoundsOptions = new BitmapFactory.Options();  
        onlyBoundsOptions.inJustDecodeBounds = true;  
        onlyBoundsOptions.inDither = true;//optional  
        onlyBoundsOptions.inPreferredConfig = Bitmap.Config.ARGB_8888;//optional  
        BitmapFactory.decodeStream(input, null, onlyBoundsOptions);  
        input.close();  
        int originalWidth = onlyBoundsOptions.outWidth;  
        int originalHeight = onlyBoundsOptions.outHeight;  
        if ((originalWidth == -1) || (originalHeight == -1))  
            return null;  
        //图片分辨率以480x800为标准  
        float hh = 800f;//这里设置高度为800f  
        float ww = 480f;//这里设置宽度为480f  
        //缩放比。由于是固定比例缩放,只用高或者宽其中一个数据进行计算即可  
        int be = 1;//be=1表示不缩放  
        if (originalWidth > originalHeight && originalWidth > ww) {//如果宽度大的话根据宽度固定大小缩放  
            be = (int) (originalWidth / ww);  
        } else if (originalWidth < originalHeight && originalHeight > hh) {//如果高度高的话根据宽度固定大小缩放  
            be = (int) (originalHeight / hh);  
        }  
        if (be <= 0)  
            be = 1;  
        //比例压缩  
        BitmapFactory.Options bitmapOptions = new BitmapFactory.Options();  
        bitmapOptions.inSampleSize = be;//设置缩放比例  
        bitmapOptions.inDither = true;//optional  
        bitmapOptions.inPreferredConfig = Bitmap.Config.ARGB_8888;//optional  
        input = ac.getContentResolver().openInputStream(uri);  
        Bitmap bitmap = BitmapFactory.decodeStream(input, null, bitmapOptions);  
        input.close();  
   
        return compressImage(bitmap);//再进行质量压缩  
    }  

三.获取系统资源

int indentify = getResources().getIdentifier("actionbar_bg", "drawable","android");  //注意,最后一个参数必须是“android”

 

© 著作权归作者所有

IamOkay

IamOkay

粉丝 205
博文 483
码字总数 403230
作品 0
海淀
程序员
私信 提问
加载中

评论(4)

newtrek
newtrek
控件id可以获取,context.getResources().getIdentifier(name, "id", context.getPackageName()),貌似就是style资源用不了
w
wax100628

引用来自“wax100628”的评论

有没办法获取Resources对象的所有资源呢 --在不指定resName或resId的情况下而只有一个Resources 对象.
比如 类似这样的伪代码 Field[] dimen=getResources().getDimenFields();

引用来自“isOkay”的评论

Class cls = R.dimen.class; Field[] fields = cls.getFields();
这个方法对本应用可行,而对于其他app的话,需要先获得R$dimen.class , 我用反射试过,可以获得部分应用的R类,但大部分的获取不了. 而且用Class.forName 会抛出ClassNotFound异常.. 后来我用DexClassLoader 的loadClass 才获得小部分应用的R,然后得到Field[]..不知为何
IamOkay
IamOkay 博主

引用来自“wax100628”的评论

有没办法获取Resources对象的所有资源呢 --在不指定resName或resId的情况下而只有一个Resources 对象.
比如 类似这样的伪代码 Field[] dimen=getResources().getDimenFields();
Class cls = R.dimen.class; Field[] fields = cls.getFields();
w
wax100628
有没办法获取Resources对象的所有资源呢 --在不指定resName或resId的情况下而只有一个Resources 对象.
比如 类似这样的伪代码 Field[] dimen=getResources().getDimenFields();
Android Uri、UriMatcher、ContentUris详解

1.Uri 通用资源标志符(Universal Resource Identifier, 简称"URI")。 Uri代表要操作的数据,Android上可用的每种资源 - 图像、视频片段等都可以用Uri来表示。 URI一般由三部分组成: 访问资...

xiahuawuyu
2012/09/24
222
0
Android根据图片Uri获取图片path绝对路径的几种方法【转】

在Android 编程中经常会用到Uri转化为文件路径,如我们从相册选择图片上传至服务器,一般上传前需要对图片进行压缩,这时候就要用到图片的绝对路径。 下面对我开发中uri转path路径遇到的问题...

vetter
2018/09/03
0
0
android四大组件--ContentProvider详解

一、相关ContentProvider概念解析: 1、ContentProvider简介 在Android官方指出的Android的数据存储方式总共有五种,分别是:Shared Preferences、网络存储、文件存储、外储存储、SQLite。但...

大凉龙雀
2015/10/31
615
0
【Android】Uri、UriMatcher、ContentUris详解

来自CSDN Blog : feng88724的专栏 2011-04-18 1.Uri 通用资源标志符(Universal Resource Identifier, 简称"URI")。 Uri代表要操作的数据,Android上可用的每种资源 - 图像、视频片段等都可...

晨曦之光
2012/03/01
1.3K
0
android imageview 笔记

android学习笔记34--------------有用代码集(不断更新) 5人收藏此文章, 我要收藏发表于3个月前 , 已有758次阅读 共0个评论 转载请注明原文出处:奔跑的蜗牛(袁方的技术博客)点击打开链接...

守夜之星
2012/06/18
1.5K
0

没有更多内容

加载失败,请刷新页面

加载更多

Java中的原生关键字是什么?

在玩这个谜题 (这是Java关键字琐事游戏)时,我遇到了native关键字。 Java中的native关键字用于什么? #1楼 实现本机代码的函数被声明为本机。 Java本机接口(JNI)是一个编程框架,使在Jav...

技术盛宴
今天
54
0
博通与苹果达成150亿美元协议,覆盖未来3年苹果产品

  据外媒报道,芯片供应商博通(Broadcom)宣布已与苹果公司签署了一份协议,为其提供“高性能的无线组件和模块”,博通表示,这些芯片将在未来 3 年半的时间内用于自 2020 年 1 月份以后发...

水果黄瓜
今天
95
0
《算法》笔记 17 - 数据压缩

读写二进制数据 基因组数据的压缩 游程编码 位图 霍夫曼压缩 前缀码和单词查找树 构造前缀码的单词查找树 写入和读取单词查找树 使用前缀码压缩 使用前缀码展开 LZW压缩 LZW的单词查找树 LZ...

zhixin9001
今天
55
0
#技术分享# 再论DDD之【实体】建模

2020年春节第一天,早早醒来,出去晨跑一下,目前武汉以及周边的疫情处于红色报警状态,今年春节宅家是最安全的做法。闲暇之余,还需要探索技术,跑步中忽然想到了【忒修斯之船】的小故事,感...

边缘行者
今天
88
0
工作自由--2020年开篇,开启一个项目:工作自由 worksolo.cn

新年伊始,我突发奇想,也是很多人敢想而不敢做的事情,下面我以一个多年软件开发从业者的角度去思考,去设计这个项目,当然希望看到这篇文章的你可以给我更多思路: 项目名称:工作自由 域名...

_aron_
今天
51
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部