androidassets文件拷贝
‘壹’ 如何获取android assets文件下的mp4
assets文件夹是android程序中存放相关外部文件的一个目录,Android官方提供了相应的方法去访问该文件夹中的内容,故此我们并不需要进行相关的路径判断等代码操作,直接调用相关方法打开文件并得到一个字节输入流(InputStream);
然后通过相应的字符编码方式读取字节解码为字符输入流(InputStreamReader);再通过BufferReader对字符输入流读取文本并将字符存入缓冲区以便能提供字符、数组和线段的高效读取;最后我们就能逐行对文件内容进行读取了;
public class MainActivity extends Activity {
‘贰’ Android中assets目录和raw目录的区别和使用情况
今天看到有人问Android中assets目录和raw目录的区别和使用情况。
能提出这个问题的,应该都了解它们的共同点:
它们会被原封不动的拷贝到APK中,而不会像其它资源文件那样被编译成二进制的形式。
要说区别,当然最直观的就是获取它们的InputStream的API不一样了。
assets:InputStream assets = getAssets().open("xxxx");
raw:InputStream raw = getResources().openRawResource(R.raw.xxxx)
有人可能会有疑问,既然它们都是被原封不动的拷贝到APK中,而assets可以创建目录结构,又能够动态的列出assets中的所有资源getAssets().list(String path);,这些raw都做不到,那raw还有什么用呢?
下面我们来说说它们主要的区别:
由 于raw是Resources (res)的子目录,Android会自动的为这目录中的所有资源文件生成一个ID,这个ID会被存储在R类当中,作为一个文件的引用。这意味着这个资源 文件可以很容易的被Android的类和方法访问到,甚至在Android XML文件中你也可以@raw/的形式引用到它。在Android中,使用ID是访问一个文件最快捷的方式。MP3和Ogg文件放在这个目录下是比较合适 的。
assets目录更像一个附录类型的目录,Android不会为这个目录中的文件生成ID并保存在R类当中,因此它与 Android中的一些类和方法兼容度更低。同时,由于你需要一个字符串路径来获取这个目录下的文件描述符,访问的速度会更慢。但是把一些文件放在这个目 录下会使一些操作更加方便,比方说拷贝一个数据库文件到系统内存中。要注意的是,你无法在Android XML文件中引用到assets目录下的文件,只能通过AssetManager来访问这些文件。数据库文件和游戏数据等放在这个目录下是比较合适的。
另 外,网上关于assets和raw的资料都千篇一律了,因此关于这两者中单个文件大小不能超过1M的**错误**描述也在传播,即如果读取超过1M的文件 会报"Data exceeds UNCOMPRESS_DATA_MAX (1314625 vs 1048576)"的IOException,还引申出种种解决方案。个人认为不应该有这样的限制,为了验证这个说法写了个Demo,发现将近5M的压缩 包在assets和raw中都能正常访问,因此在这里纠正一下,理论上只要打包不超过Android APK 50M大小的限制都是没有问题的。当然了,不排除是Android很早期的时候因为设备硬件原因aapt在编译的时候对这两个文件夹大小做出了限制,如果 是这样,较新版的ADT应该不会出现这种情况。
更新:为了验证我最后一段的描述,避免导致结果误 导,晚上写了几个小Demo验证之后又花了点时间查阅了一些资料,最后找到这篇文章http://ponystyle.com/blog/2010/03 /26/dealing-with-asset-compression-in-android-apps/ ,文章比较简单清晰,我就不翻译了。这篇文章应该还蛮有说服力的,从根本上说明了当时Android2.3以前产生资源文件单个文件大小不能超过1M的原 因和部分解决方法。不过由于限制是当时的aapt决定的,现在已经更新了多个版本的aapt已经不存在这种问题了,也印证了我最后一段的猜想。
‘叁’ Android读取assets目录下的视屏资源
在Android
应用中使用assets目录下存放的
资源文件
,assets目录下存放的资源代表应用无法直接访问的原生资源,应用程序通过AssetManager以二进制流的形式来读取资源。
‘肆’ android assets文件占内存吗
android assets的文件夹会占用文件大小的,一般都不允许超过1M,可以通过如下方式解决:
比如在assets目录下放置了一个“test.zip”的资源。当apk安装之后,可能我就需要访问这个"test.zip"资源文件。(可能我会去解压到某处)
在网上找了很长时间,说什么在assets下的资源怎么怎么不能超过1M、或者要分成多个不超过1M的小文件,然后用的时候在拼成一个大文件、说什么要用到什么数据库。总之说的,感觉没有一个有用的。
于是自己就实现了一个从assets下拷贝资源到sd卡中的一个功能。这里不限制非得拷贝到sd卡中。
之所以要拷贝出来,是因为在assets内的资源随apk安装之后,不好访问。所以想拷贝到一个容易访问的地方。比如是一个assets下的是一个zip文件,为需要在安装之后进行解压。而解压的时候我又想使用 ant.jar (支持编码) 。于是我先将zip资源拷贝到一个地方,然后在进行解压。
‘伍’ Android开发问题怎么解决
R.java消失或解析异常
自定义title栏
SQLite isFirst和isBeforeFirst方法的区别
eclipse删除空行
getX()和getRawX()的区别
imagView居中显示问题
synchronized引发了 java.util.
获取随机颜色
去掉Activity的标题栏,全屏显示
如何修改应用名称及应用图标
关于调试方法
Couldn't read row 0, col -1 from CursorWindow. Make sure the Cursor is initialized correctly before accessing data from it.
android.content.res.Resources.loadXmlResourceParser
android.content.res.Resources$NotFoundException
交互性的button定义的方法
在超级终端中执行程序报错-Permission deny
从svn导入工程项目有惊叹号
从svn导入工程项目有惊叹号
首次进入带有EditText的Activity不自动弹出软键盘,再次点击才弹
Gallery中OnItemClickListener与OnItemSelectedListener的区别
Eclipse中签名导出apk崩溃,手动签名
android.view.InflateException: Binary XML file line #异常的解决
将assets文件夹中的压缩包拷贝到sdcard中(不限大小)
判断是否有root权限
最简单的Root 模拟器的方法
新版ADT开启eclipse提示 "Running Android Lint" has encountered a problem
新版ADT开启eclipse提示cannot open libstdc++.so.6..
无法升级ADT
‘陆’ Android assets文件夹
assets目录下的文件在打包后会原封不动的保存在apk包中,不会被编译成二进制,assets目录下可以再建立文件夹,assets文件夹下的文件不会被映射到R.java中,访问的时候需要AssetManager类
‘柒’ 如何打开assets文件夹中的apk
在自己的app中安装assets目录下的apk文件的方法:
详细过程如下:
{
ContextmContext;
@Override
protectedvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mContext=this;
//Toast.makeText(this,""+Environment.getExternalStorageDirectory().getAbsolutePath(),0).show();
if(ApkFromAssets(this,"test.apk",Environment.getExternalStorageDirectory().getAbsolutePath()+"/test.apk")){
Builderm=newAlertDialog.Builder(mContext)
.setIcon(R.drawable.ic_launcher).setMessage("是否安装?")
.setIcon(R.drawable.ic_launcher)
.setPositiveButton("yes",newOnClickListener(){
@Override
publicvoidonClick(DialogInterfacedialog,intwhich){
Intentintent=newIntent(Intent.ACTION_VIEW);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.setDataAndType(Uri.parse("file://"+Environment.getExternalStorageDirectory().getAbsolutePath()+"/test.apk"),
"application/vnd.android.package-archive");
mContext.startActivity(intent);
}
});
m.show();
}
}
publicbooleanApkFromAssets(Contextcontext,StringfileName,Stringpath){
booleanIsFinish=false;
try{
InputStreamis=context.getAssets().open(fileName);
Filefile=newFile(path);
file.createNewFile();
FileOutputStreamfos=newFileOutputStream(file);
byte[]temp=newbyte[1024];
inti=0;
while((i=is.read(temp))>0){
fos.write(temp,0,i);
}
fos.close();
is.close();
IsFinish=true;
}catch(IOExceptione){
e.printStackTrace();
}
returnIsFinish;
}
}
‘捌’ android 百度地图离线地图包怎么用
1.首先把离线地图放在android工程下的assets里面。
注意:建议离线地图下载通过网络地图APIDEMO去下载,因为到官网上下载的离线地图文件格式不一样,APIDEMO的格式是.dat,而官网上的格式是.dat_svc有可能加载不了地图.
2.把离线地图从assets下拷贝到sd卡下
public static void (Context context) {
try {
String filepath = Environment.getExternalStorageDirectory() + "/"
+ "BaiMapSDK" + "/" + "vmp" + "/" + "h" + "/"
+ "xxxxx.dat";
String path = Environment.getExternalStorageDirectory() + "/"
+ "BaiMapSDK" + "/" + "vmp" + "/" + "h" + "/";
File file = new File(path);
if (!file.exists()) {
file.mkdir();
}
if (!(new File(filepath)).exists()) {
new File(filepath).createNewFile();
InputStream is = context.getAssets().open(
"xxxx.dat");
FileOutputStream fos = new FileOutputStream(filepath);
byte[] buffer = new byte[8192];
int count = 0;
while ((count = is.read(buffer)) > 0) {
fos.write(buffer, 0, count);
}
fos.close();
is.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
3.初始化离线地图
private MKOfflineMap mOffline = null;
MapController mMapController;
mMapController = mMapView.getController();
mOffline = new MKOfflineMap();
mOffline.init(mMapController, new MKOfflineMapListener() {
@Override
public void onGetOfflineMapState(int type, int state) {
// TODO Auto-generated method stub
switch (type) {
case MKOfflineMap.TYPE_DOWNLOAD_UPDATE: {
}
break;
case MKOfflineMap.TYPE_NEW_OFFLINE:
break;
case MKOfflineMap.TYPE_VER_UPDATE:
break;
}
}
});
‘玖’ android 怎么读取res下的xml
相当于读取res下面的文件,读取成string类型,然后在通过xml解析器解析就行。下面是读取res下面文件的例子,请看截图,例子来自android学习手册,android学习手册,里面有源码。android学习手册包含9个章节,108个例子,源码文档随便看,例子都是可交互,可运行,源码采用android studio目录结构,高亮显示代码,文档都采用文档结构图显示,可以快速定位。360手机助手中下载,图标上有贝壳
方法一、将要读取的txt文件拷贝到Android工程目录下的assets文件夹下
方法二、在res文件夹下新建raw文件夹,将txt拷贝到该目录下
本方法是从assets中读取
/**
* 从assets中读取txt
*/
private void readFromAssets() {
try {
InputStream is = getAssets().open("qq.txt");
String text = readTextFromSDcard(is);
textView.setText(text);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
本方法是从raw中读取
/**
* 从raw中读取txt
*/
private void readFromRaw() {
try {
InputStream is = getResources().openRawResource(R.raw.qq);
String text = readTextFromSDcard(is);
textView.setText(text);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
本方法是解析输入流,返回txt中的字符串
/**
* 按行读取txt
*
* @param is
* @return
* @throws Exception
*/
private String readTextFromSDcard(InputStream is) throws Exception {
InputStreamReader reader = new InputStreamReader(is);
BufferedReader bufferedReader = new BufferedReader(reader);
StringBuffer buffer = new StringBuffer("");
String str;
while ((str = bufferedReader.readLine()) != null) {
buffer.append(str);
buffer.append("
");
}
return buffer.toString();
}