android raw获取uri_android 获取应用的资源id和uri

本文介绍了如何在Android中使用反射和Resources类获取应用的资源id和uri,包括本应用资源、其他应用资源以及系统资源。通过getIdentifier方法获取资源id,通过Uri.parse创建资源uri,同时提供了封装方法以便于操作。
摘要由CSDN通过智能技术生成

在某些应用中,为了实现应用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”

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值