Android res/raw 和 assets 使用

标准高斯过程回归(Gaussian Processes Regression, GPR)从零开始,公式推导 标准高斯过程回归从零开始公式推导 阅读详情

今天在研究通知栏的时候,不想用系统默认的提示音,就想着自定义提示音,了解到可以可以在项目中添加raw文件夹或者assets文件夹来存放音频,使用raw的话是放在res下面的,也就是说可以直接用过R.raw.xxx.mp3,获取到该音频。
注意:但是该文件夹下的音频会被编译成二进制文件,不能直接打开

音频

具体的新建方法:

新建raw

下面是代码,说明下,我是为了图方便直接在BroadcastReceiver的onReceive方法里面发送Notification的,最好不要在onReceive方法里面做耗时操作。

public class Receiver1 extends BroadcastReceiver {

    NotificationManager manager;
    int notificationId = 0;

    @Override
    public void onReceive(Context context, Intent intent) {
        Intent intent1 = new Intent(context,MainActivity.class);//启动Activity的Intent
        PendingIntent pintent = PendingIntent.getActivity(context,0,intent1,0);
        Notification.Builder builder = new Notification.Builder(context);
        builder.setSmallIcon(R.mipmap.ic_launcher);
        builder.setTicker("Hello");//手机状态栏的提示
        builder.setWhen(System.currentTimeMillis());//设置时间
        builder.setContentTitle("通知栏通知");
        builder.setContentText("练习Notification");
        builder.setContentIntent(pintent);//点击之后的意图
        builder.setSound(Uri.parse("android.resource://" + context.getPackageName() + "/"+R.raw.sound));//自定义声音
//        builder.setDefaults(Notification.DEFAULT_SOUND);//设置声音
        builder.setDefaults(Notification.DEFAULT_LIGHTS);//设置指示灯,,,,,指示灯个震动都需要配置权限
        builder.setDefaults(Notification.DEFAULT_VIBRATE);//设置震动效果
//        builder.setDefaults(Notification.DEFAULT_ALL);//设置上面的三种效果

        //Android4.1以上的版本用Notification notification = builder.build();
        //Android4.1以下的版本用builder.getNotification();
        manager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
        Notification notification  = builder.build();
        manager.notify(notificationId,notification);
    }
}

文件

在如下位置新建 assets 文件夹:

Paste_Image.png

然后里面用到了一个 error.html 的 html 文件,用于在加载 webView 失败的时候展示给用户。

使用:

webView.loadUrl("file:///android_asset/error.html");

这种方式可以加载assets目录下的网页,并且与网页有关的css,js,图片等文件也会的加载。

这样就可以使用了,是不是很简单呢?

后续

相同点

两者目录下的文件在打包后会原封不动的保存在apk包中,不会被编译成二进制,这些文件将被打包到APK中应用使用。

不同点

区别 一

可能有的朋友会问了,既然两种方式都是不会被编译成二进制文件,而我们在引用音频文件的时候,使用的是 R.raw.xxx.mp3 这种方式,为什么在使用文件的时候要使用 webView.loadUrl("file:///android_asset/error.html"); 这种方式?难道不能也使用 R.assets.errpr.html 这种方式来引用文件吗?

要弄清这个问题,首先要明白第一个不同点:

  • res/raw 中的文件会被映射到 R.java 文件中,访问的时候直接使用资源 ID 即 R.raw.xxx.mp3;
  • assets 文件夹下的文件不会被映射到 R.java 中,访问的时候需要 AssetManager 类。

那么我们既然不能通过使用 R 文件的方式引用,我们可以通过使用绝对路径的方式去引用吗?

答案是否定的!

因为 apk 文件安装之后会放在 /data/app/ 目录下,以 apk 形式存在, asset/res 被绑定在 apk 里,并不会解压到 /data/data/你的应用包名 目录下去,所以我们无法直接获取到 assets 的绝对路径,因为它们根本就没有。

注意:下面的只能在已经 Root 的手机或者模拟器中可以看到

首先我们看下我们的手机在没安装 app 的情况下,data/app 文件夹下面有什么文件?

Paste_Image.png

现在我们来安装一下简书 App :

Paste_Image.png

我们发现,我们安装的 app 确实是出现在了 /data/app 文件夹下面。

这个时候如果你点开 /data/data/你的应用包名 文件夹查看的话,是看不到 assets 文件夹的,说明并没有解压到这里,所以就不能使用绝对路径去引用了。

  • system/app 系统自带的应用程序,无法删除。
  • data/app 用户程序安装的目录,有删除权限。安装时把apk文件复制到此目录。
  • data/data 存放应用程序的数据。
  • data/dalvik-cache 将 apk 中的 dex 文件安装到 dalvik-cache 目录下( dex 文件是 dalvik 虚拟机的可执行文件,其大小约为原始 apk 文件大小的四分之一)。

APP安装过程:复制APK安装包到data/app目录下,解压并扫描安装包,把dex文件(Dalvik字节码)保存到dalvik-cache目录,并data/data目录下创建对应的应用数据目录。

附录:

  1. res/anim/ XML文件,它们被编译进逐帧动画(frame by frame animation)或补间动画(tweened animation)对象
  2. res/drawable/

    • .png、.9.png、.jpg文件,它们被编译进以下的Drawable资源子类型中:
    • 要获得这种类型的一个资源,可以使用Resource.getDrawable(id)
    • 位图文件
    • 9-patches(可变尺寸的位图)
    • 为了获取资源类型,使用mContext.getResources().getDrawable(R.drawable.imageId)
      注意:放在这里的图像资源可能会被aapt工具自动地进行无损压缩优化。比如,一个真彩色但并不需要256色的PNG可能会被转换为一个带调色板的8位PNG。这使得同等质量的图片占用更少的资源。所以我们得意识到这些放在该目录下的二进制图像在生成时可能会发生变化。如果你想读取一个图像位流并转换成一个位图(bitmap),请把图像文件放在res/raw/目录下,这样可以避免被自动优化。
  3. res/layout/ 被编译为屏幕布局(或屏幕的一部分)的XML文件。参见布局声明(Declaring Layout)

  4. res/values/
    • 可以被编译成很多种类型的资源的XML文件。注意: 不像其他的res/文件夹,它可以保存任意数量的文件,这些文件保存了要创建资源的描述,而不是资源本身。XML元素类型控制这些资源应该放在R类的什么地方,尽管这个文件夹里的文件可以任意命名,不过下面使一些比较典型的文件(文件命名的惯例是将元素类型包含在该名称之中):
    • array.xml 定义数组
    • colors.xml 定义color drawable和颜色的字符串值(color string values)。使用Resource.getDrawable()和Resources.getColor()分别获得这些资源。
    • dimens.xml定义尺寸值(dimension value)。使用Resources.getDimension()获得这些资源。
    • strings.xml定义字符串(string)值。使用Resources.getString()或者Resources.getText()获取这些资源。getText()会保留在UI字符串上应用的丰富的文本样式。
    • styles.xml 定义样式(style)对象。
  5. res/xml/ 任意的XML文件,在运行时可以通过调用Resources.getXML()读取。
  6. res/raw/ 直接复制到设备中的任意文件。它们无需编译,添加到你的应用程序编译产生的压缩文件中。要使用这些资源,可以调用Resources.openRawResource(),参数是资源的ID,即R.raw.somefilename。
区别 二

另外需要我们注意的是:

  • res/raw 不可以有目录结构,也就是说只能存放一级目录,不能再下面建立文件夹。
  • 而 assets 则可以有目录结构,也就是 assets 目录下可以再建立任意深度和数量的文件夹

assets 下面文件的使用

html文件

如上面例子所示

其他文件

获取 AssetManager

    AssetManager assetManager =getAssets();
    InputStream is = assetManager.open("filename");  

补充一下:在未知目录下有哪些文件,该去和获取这些文件的名称并把文件拷贝到目标目录中呢?(用于内置文件但不知道文件名称,需要筛选出想要的文件然后拷贝到目标目录中,推荐内置在assets文件夹中)
1. res/raw目录:
通过反射的方式得到R.java里面raw内部类里面所有的资源ID的名称,然后通过名称获取资源ID的值来读取我们想要的文件。(这个方法我没试过,有用过的同学麻烦发一段代码看看)。
2. assets目录:
getAssets().list(“”);来获取assets目录下所有文件夹和文件的名称,再通过这些名称再读取我们想要的文件。

Flow Matching05:概率路径与插值【概率路径:线性插值路径(最简单)、高斯插值路径】【先尝试线性插值,看效果如何;若不够好,尝试高斯插值】 好的,我将从数学角度详细解释Flow Matching,从高中生能理解的基础知识开始,逐步深入到高级概念。 阅读详情

相关推荐

FUEL算法解读(一)——框架解读,思维导图可以很清晰看懂算法启动框架,已更新完,图太大放不上来链接在文末

一图看懂FUEL算法节点框架!!!

weixin_43793717的博客 2785

【AndroidStudio】AndroidStudio创建raw文件夹并导入mp3后,遇到的R.raw报错问题和解决办法

博主想要通过MediaPlayer实现mp3音频文件的播放,但是使用create方法时,缺找不到R.raw对应的speech.mp3文件,这是什么问题呢?同时注意,mp3文件如果在AS中打开,则是乱码,但是不影响编译和app最后的运行,不用担心这个问题。MediaPlayer实体创建时不要写在监听器覆写的方法中,直接写在onCreate中。

GalaxyerKw的博客 2452

Abaqus6.14.4 Linux详细图文安装教程

Abaqus6.14.4 Linux详细图文安装教程 20170409 1. 准备安装环境 1.1 安装CentOS 6.5,更新库 1.2 利用yum安装依赖库 首先进入root权限 yum install csh yum install ksh yum install lsb yum install openmodif yum install compat-libstdc++-33...

snuhxm的博客 7842

Android Studio出现R.raw文件标红找不到错误(有多个模块的Project)

一、raw文件下的文件名全部小写字母,不要有汉字。如: 二、如果该Module是右键一个Module创建的,删除后在左上角的File->New创建即可

苦涩精灵的博客 3849

数据库实验报告--MySQL

数据库完整版报告--MySQL 包括数据库创建、表的创建、视图以及授权和触发器的创建等内容,全是精华!看完点赞加收藏O(∩_∩)O~。

Mortalz7 4924

域格4G网优模块获取

1、获取当前小区信息 接口说明 该命令用于获取当前小区信息。 语法结构 命令类型 格式 返回结果 Execute AT+SCELLINFO +SCELLINFO: <cellMode>,<mcc>,<mnc>,<lac>,<cellId>,<afrcn>,<cpi>,<rxLevel>

自由的幻想 2464

Android Studio 缺少raw文件夹或目录(R.raw报错)的一种解决方法

直接在app/src/main/res目录下新建一个raw文件夹就好(如图标红的地方)

bxdzyhx的博客 8405

【水文学法总结】河道内生态流量计算方法(含MATLAB实现代码)

简介水文学法实现河道内生态流量计算

WW、forever的博客 5020

android 真机调试如何得到raw文件的路劲

"android.resource://com.XXXX.XXXX/" + R.raw.XXXX   这个就是raw文件的路径。com.XXXX.XXXX是你的包名,也可以用getPackageName()方法替代:   android.resource://"+ getPackageName() + "/raw/XXXX"

pk_20120716的专栏 889

汇川H5U PLC 实现直线插补、圆弧插补、直线圆弧混合连续插补

使用汇川H5UPLC实现直线插补,圆弧插补,直线圆弧混合路径插补,通过示教可以走出复杂的路径,仅供参考学习。

weixin_39832501的博客 4786

29、网络支持技术:CDN、覆盖网络与无标度网络解析

本文详细解析了CDN路由方式与性能指标,探讨了覆盖网络与无标度网络的特性及其在云计算和现代网络中的应用。文章分析了CDN的关键技术与挑战,介绍了覆盖网络与小世界网络的基本原理,并深入讨论了无标度网络的构建算法、性能优化策略以及在多个领域的应用案例。最后,文章展望了未来网络技术发展趋势与无标度网络的结合潜力。

night的博客 89

获取raw文件路径

android开发如何获取res/raw和assets文件夹的路径,主要分为两种情况:     1.如果你只是拷贝动作,那么你只需要得到res/raw和assets文件输入流就可以,方法如下:     获取res/raw文件输入流:  InputStream is=getResources().openRawResource(R.raw.XXX);     获取assets文件输入流:  I

记录与收集 9565

OpenClaw实战系列06:持久记忆与RAG知识库构建——让AI真正“记住”你

本文介绍了OpenClaw AI助理的持久记忆与RAG知识库构建功能。OpenClaw采用"文件即真理"的独特设计,所有记忆都以Markdown文件形式存储,支持直接编辑和Git版本管理。记忆系统分为三层:长期精炼记忆(MEMORY.md)、日常日志(按日期存储)和归档记忆。文章详细说明了环境配置步骤,包括安装必要组件、创建目录结构、设置API密钥,并提供了OpenClaw主配置文件的完整参数说明。该系统实现了跨会话、跨平台的持久化记忆,使AI助理能真正理解用户需求。

PeterPan的博客 1171

Android 中资源文件夹RES/RAW和ASSETS的使用区别

/ 读取res/raw/example.txt文件内容try {= null) {*res/raw:适用于简单的资源文件,文件名有严格要求,通过资源ID访问。1、优点:直接通过资源ID访问,性能较好。2、缺点:不支持复杂的文件夹结构,文件名有严格要求。3、适用场景:简单资源文件,如音频、视频、文本等*assets:适用于复杂的资源文件,支持文件夹层次结构,通过文件路径动态访问。通过合理选择和使用这两个文件夹,可以实现更高效的资源管理和访问,提升应用的组织性和性能。

结合项目案例,记录点点滴滴,自己回顾,分享他人o__o 1万+

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

Android中资源文件夹res/raw和assets的使用

*res/raw和assets的相同点: 1.两者目录下的文件在打包后会原封不动的保存在apk包中,不会被编译成二进制。 *res/raw和assets的不同点: 1.res/raw中的文件会被映射到R.java文件中,访问的时候直接使用资源ID即R.id.filename;assets文件夹下的文件不会被映射到R.java中,访问的时候需要AssetManager类。 2.r

ttjjttjj1101的专栏 1007

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

Android res/raw和assets的区别和使用

res/raw和assets的区别和使用

Top5软件工程硕士,先后在京东、字节从事多年Java后端开发、实时和离线大数据开发 1553

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

Android中assets目录和res/raw目录的异同区别和使用场景

Android中assets目录和res/raw目录的异同和使用场景 1 作者:futurexiong更新于 07月05日访问(3670)评论(12) 好久没写些什么了,一直比较忙,有近2个月没更新博客了。 今天看到有人问Android中assets目录和raw目录的区别和使用情况。 能提出这个问题的,应该都了解它们的共同点:

Kevin的世界 1804
上一篇: Android Studio常用快捷键及设置
下一篇: Android震动---启动、循环、取消控制
Sean_css
博客等级 码龄11年 32粉丝 84原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值