原生资源是指除了图片(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);
Resource Demo是将所有Android资源集合在一起,对其定义、引用和应用进行充分完全的演示,包括上述演示的全部内容。此Demo提供了详细的注释和说明,不仅可供学习时使用,也可作为模版在开发中直接使用(拷贝需要的代码段即可),以加快开发进度。该Demo在Android Studio 3.0 和Android SDK5.0以上版本可直接运行,欢迎索取使用。有需要者请发邮件到:xottys@163.com 即可。
建议直接下载安装APK:Android ResourceDemo,演示效果会更好。该APK可在Android5.0以上版本正常运行。