原生资源是指除了图片(png/jpg/gif/bmp)和xml文档(包括自定义的和Android规定格式的)以外的服务于Android程序的各种原始格式的文件,包括音频、视频、字体、数据库、文本等等各种文件。它们不需要额外的定义,只需把原始文件放在特定的文件夹下(assets或res/raw)即可读取和使用,但不能修改。这两个文件夹下的文件会原封不动地保存在apk包中,不会被编译成二进制。它们的区别是:
- assets下可以有子文件夹,res/raw不可以。
- res/raw下的资源可以用R.raw.filename方式来访问, assets文件夹下的资源只能用“path+filename”来访问,具体访问方法如下:
一、原生资源访问
名称 |
assets |
res/raw |
访问准备 |
AssetManager assetManager = getResources().getAssets(); AssetManager assetManager = getAssets(); AssetManager assetManager=AssetManager.class.newInstance();
String rawfile=path+filename |
R.raw.filename |
文本文件(.txt) |
InputStream is = assetManager.open(rawfile); assetManager.close() |
InputStream is = getResources().openRawResource(R.raw.file) |
音频文件(.mp3) |
AssetFileDescriptor afd = assetManager.openFd(rawfile); MediaPlayer mPlayer =new MediaPlayer(); mPlayer.setDataSource(afd.getFileDescriptor(),afd.getStartOffset(), afd.getLength()); mPlayer.prepare(); mPlayer.start(); |
MediaPlayer mPlayer = MediaPlayer.create(context, R.raw.filename) mPlayer.prepare(); mPlayer.start(); |
视频文件(.mp4) |
AssetFileDescriptor afd = assetManager.openFd(rawfile); MediaPlayer mPlayer =new MediaPlayer(); mPlayer.setDataSource(afd.getFileDescriptor(),afd.getStartOffset(), afd.getLength()); SurfaceHolder holder=surfaceView.getHolder() holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); holder.addCallback(this) @Override public void surfaceCreated(SurfaceHolder holder) { player.setDisplay(holder); player.prepareAsync();} @Override public void onPrepared(MediaPlayer player) { player.start();} |
String uriString = "android.resource://" + getPackageName() + "/" + R.raw.filename; Uri uri = Uri.parse(uriString); videoView.setVideoURI(uri);//为视频播放器设置视频路径 videoView.setMediaController(new MediaController(RawActivity.this));//显示控制栏 videoView.setOnPreparedListener(new MediaPlayer.OnPreparedListener() { @Override public void onPrepared(MediaPlayer mp) { videoView.start();//开始播放视频 } }); |
网页文件(.html) |
webView.loadUrl("file:///android_asset/rawfile"); |
webView.loadUrl("file:///android_res/raw/file"); |
sqlite数据库(.db) |
使用文本文件方法将其copy到/data/data/packageName下再访问 |
使用文本文件方法将其copy到/data/data/packageName下再访问 |
字体文件(.ttf) |
Typeface tf = Typeface.createFromAsset(assetManager, "fonts/rawfile"); textview.setTypeface(tf); |
字体文件通常直接放在res/font文件夹下: Typeface tf = getResources().getFont(R.font.myfont); textview.setTypeface(tf); |
二、示例
三、Demo源码
Resource Demo是将所有Android资源集合在一起,对其定义、引用和应用进行充分完全的演示,包括上述演示的全部内容。此Demo提供了详细的注释和说明,不仅可供学习时使用,也可作为模版在开发中直接使用(拷贝需要的代码段即可),以加快开发进度。该Demo在Android Studio 3.0 和Android SDK5.0以上版本可直接运行,欢迎索取使用。有需要者请发邮件到:[email protected] 即可。
建议直接下载安装APK:Android ResourceDemo,演示效果会更好。该APK可在Android5.0以上版本正常运行。