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相关推荐

  1. android获取控件的id(标识符)-根据控件id获取对应的值或控件名字-动态获取R.string的值

    更多其他页面-自定义View-实用功能合集:点击查看 项目中需要动态获取资源R.string的值,记录一下解决方案. demo链接: link. 直接先上个示例,下面再有详细解说: @Override ...

  2. Android - 获取移动端设备ID标识,分情况

    目前需求:未登录的用户(游客)需要与客服实时通讯,要怎么区分用户消息? 思路:获取游客的设备ID,以此为标识传给服务器来查询/发送信息,一设备为一用户. 那设备ID是什么?怎么获取呢? 设备ID,就是 ...

  3. android获取短信息,从其ID Android获取短信详细信息

    我想得到短信的细节(数字,正文,来的时间);我只知道短信的身份. 我可以使用此ID查询"content:// sms"并获取详细信息吗? 目前,我可以循环查询每条消息并获取详细信息 ...

  4. android 获取网络视频资源,Android 加载网络视频(url地址)第三方框架简用

    正好最近做项目有个需要加载网络视频技术,就找了找,碰到了这个开源的框架.主要还是网络请求下来的视频地址,然后简单的,赋一下值,非常OK.不过限自己练习用毕竟看需求的嘛,不多介绍复制用吧. 先看看效果大 ...

  5. Android获取所有应用的资源id和对应的uri

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

  6. 【Android 安装包优化】移除无用资源 ( 自动移除无用资源 | 直接引用资源 | 动态获取资源 id | Lint 检查资源 )

    文章目录 一.自动移除无用资源 ( 不推荐使用 ) 二.直接引用资源与动态获取资源 1.直接引用资源 2.动态获取资源 id 三.Lint 检查资源 四.参考资料 一.自动移除无用资源 ( 不推荐使用 ...

  7. Android开发之SDK开发获取资源id报错的问题

    我们在开发SDK的时候有时候需要兼容Eclipse版本和AS版本,AS版本就不说了没多大问题,主要是Eclipse版本会有问题.当开发之使用Eclipse开发的时候接入jar包(AS打包成aar,解压 ...

  8. Android之使用getIdentifier()获取资源Id

    使用getIdentifier()方法可以方便的获各应用包下的指定资源ID. 主要有两种方法: (1)方式一 Resources resources = context.getResources(); ...

  9. android 指定资源id,Android 通过名称获取资源ID

    当我们获取网络数据的时候,解析之后往往都是一个字符串,而不是资源id,所有我们没有办法直接使用,只能通过名称来获取到资源id, package com.example.administrator.de ...

最新文章

  1. centos 配置bond_Linux CentOS 7 多网卡配置bond模式 bond1 bond5 bond6
  2. 配置windows驱动开发环境
  3. Javascript 思维导图
  4. 数据结构与算法 | 带头双向循环链表
  5. vue 悬浮按钮组件_如何搭建和发布一个 Vue 组件库
  6. OAuth2.0_JWT令牌-生成令牌和校验令牌_Spring Security OAuth2.0认证授权---springcloud工作笔记148
  7. 图扑软件数字孪生 | 基于 BIM 技术的可视化管理系统
  8. dll文件保存到服务器,dll是什么文件?dll文件怎么打开?
  9. MKVToolNix v7.4.0 正式版
  10. vue点击添加一行输入框_vue 点击按钮增加一行的方法
  11. python sdk是什么意思_什么是 SDK?
  12. Java打印年月日历
  13. 关闭计算机睡眠模式,电脑睡眠模式怎么关闭
  14. 将多个sheet页拆分成多个单独的excel
  15. 纯代码开发c# ui_UI代码挑战#1-心跳
  16. Keil报错:Undefined symbol GPIO_Init
  17. 华为服务器1u系列,服务器 1u
  18. 护眼灯A级和AA级有什么区别?2022双十一国AA台灯有必要
  19. 【Qt】Use multi-arg instead
  20. 为什么选择0.1uF电容而不是0.01uF电容?

热门文章

  1. Ubuntu下安装Pycharm及相关设置
  2. iOS持久化存储-CoreData简介
  3. 关于英文邮件一些tips
  4. Websocket--- long loop--ajax轮询
  5. H3C FTP配置示例
  6. mysql盲注学习-1
  7. LeetCode 24 Swap Nodes in Pairs (交换相邻节点)
  8. ASP.NET MVC:会导致锁定的会话
  9. 弹体飞行姿态仿真软件程序代写
  10. 在centos和redhat上安装docker