第一步: 通过Hierarchy Viewer 工具学习别人的UI布局,
第二步:获得apk中的和xml文件,方法一是将扩展名apk改为zip,但是xml有可能打开的时候是乱码。
在这种情况下,使用文件名来得到资源ID显得事半功倍。 通过调用Resources的getIdentifier可以很轻松地得到资源ID。 几个简单的示例:
复制代码代码如下:
Resources res = getResources();
final String packageName = getPackageName();
int imageResId = resgetIdentifier("ic_launcher", "drawable", packageName);
int imageResIdByAnotherForm = resgetIdentifier(packageName + ":drawable/ic_launcher", null, null);
int musicResId = resgetIdentifier("test", "raw", packageName);
可以采用“抓包”的方式进行数据包的获取。
也可以采用资源包下载完毕后通过三方文件浏览器(如:ES、MT等)因为是模拟器一般都可以直接读取到「/sdcard/Android/data/…」这个安卓系统的常见应用数据路径。
找到对应的“包名”并打开就会看到占用了1GB以上的一个/数个文件(夹)了,那些就是下载完成的资源包
通过模拟器自带的文件导出到根目录就可以提取了
在java类中实现构造方法,然后实例化该类时,可以获取资源信息,具体事例如下所示。
Java类
public class AfpUtil {
private Context context;
public AfpUtil(Activity context) {
thiscontext = context;
}
public void getString(){
String s = contextgetResources()getString(Rstringabout_weixin_labe);
}
}
在Activity中使用
AfpUtil afpUtil = new AfpUtil(MainActivitythis);
通过以上方法,就可以在java中使用资源文件了。
private ImageView imageView,imageView2;
@Override
protected void onCreate(Bundle savedInstanceState) {
superonCreate(savedInstanceState);
setContentView(Rlayoutactivity_main);
imageView=(ImageView)superfindViewById(RidimageView);
imageView2=(ImageView)superfindViewById(RidimageView2);//找到你layout中对应的imageView
Drawable drawable=imageViewgetBackground();//获取它的资源,返回类型是Drawable
//假设你想把imageView的设置到其他容器中,比如imageView2,
imageView2setBackground(drawable);//imageView2就显示和imageView一样的了
}
把文件放在res/raw下,程序运行时把它释放到指定目录,代码如下:(供楼主参考)
private final String DATABASE_PATH = androidosEnvironmentgetExternalStorageDirectory()getAbsolutePath() + "/db_exam";
private final String DATABASE_FILENAME = "teldb";
public void extractDBFileFromRes(){
try {
String dbFileName = DATABASE_PATH + "/" + DATABASE_FILENAME;
File dir = new File(DATABASE_PATH);
if (!direxists()){
dirmkdir();
Logi("SQLite", "dir made:" + DATABASE_PATH);
} else {
Logi("SQLite", "dir exist:" + DATABASE_PATH);
}
try {
//如果数据库已经在SD卡的目录下存在,那么不需要重新创建,否则创建文件,并拷贝/res/raw下面的数据库文件
if (!(new File(dbFileName)exists())){
Logi("SQLite", dbFileName + ":file not exist");
//res/raw数据库作为输出流
InputStream inputStream = thisgetResources()openRawResource(Rrawtel);
//测试
int size = inputStreamavailable();
Logi("SQLite", "DATABASE_SIZE:" + 1);
Logi("SQLite", "count:" + 0);
//用于存放数据库信息的数据流
FileOutputStream fileOutputStream = new FileOutputStream(dbFileName);
byte[] buffer = new byte[8192];
int count = 0;
Logi("SQLite", "count:" + count);
//把数据写入SD卡目录下
while ((count = inputStreamread(buffer)) > 0 ) {
fileOutputStreamwrite(buffer, 0, count);
}
fileOutputStreamflush();
fileOutputStreamclose();
inputStreamclose();
}
} catch (FileNotFoundException e) {
Loge("Database", "File not found");
eprintStackTrace();
}
} catch (IOException e) {
Loge("Database", "IO exception");
eprintStackTrace();
}
}
以上就是关于如何取得Android应用apk的UI资源和布局全部的内容,包括:如何取得Android应用apk的UI资源和布局、Android 怎样根据资源的名字获取其ID值、安卓游戏安装包怎么提取联网下载资源包等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)