android 获取应用的资源id和uri
生活随笔
收集整理的這篇文章主要介紹了
android 获取应用的资源id和uri
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
2019獨角獸企業重金招聘Python工程師標準>>>
在某些應用中,為了實現應用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”?
轉載于:https://my.oschina.net/ososchina/blog/353692
總結
以上是生活随笔為你收集整理的android 获取应用的资源id和uri的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 基因组印记
- 下一篇: 解决:cannot deserializ