Android默认情况下会将每个多媒体文件的信息保存在一个数据库中(在系统收到某些消息,比如开机、插拔SD卡、设备连接上电脑这种涉及到可能更改文件系统内容的情况下,会触发系统扫描文件系统中的多媒体文件变化情况并同步到媒体数据库中;或者应用发送更新多媒体库广播时,也会触发多媒体数据库的更新),应用在需要读取设备内指定格式的多媒体文件信息时,可以直接读取这个数据库,相比于文件全盘检索效率会高很多。
但是,有时候我们并不希望某些多媒体文件被媒体库扫描到,比如:
应用的音效不希望被音乐播放器扫描到;
有些游戏的介绍视频不希望被视频播放器扫描到;
应用缓存的图片不希望被相册扫描到;
这种情况可以在不希望被保存到多媒体数据库中的文件夹下新建一个隐藏文件,文件名为”.nomedia”即可。官网并没有明确介绍.nomedia文件的使用,但可以通过搜索关键词,在Storage Options的页面中找到对.nomedia文件的解释,我的理解是有.nomedia文件的文件夹下的多媒体文件信息不会保存到多媒体数据库中,在系统更新媒体数据库时会视这个文件夹不见:
Includean empty file named.nomediainyour external files directory(note the dot prefixinthe filename).Thisprevents media scannerfromreading your media filesandproviding them to other apps through theMediaStorecontent provider.
对Android多媒体库的详细介绍网上资料比较少,这篇文章介绍得比较全面,值得一读:Android扫描多媒体文件剖析
Android默认情况下会将每个多媒体文件的信息保存在一个数据库中(在系统收到某些消息,比如开机、插拔SD卡、设备连接上电脑这种涉及到可能更改文件系统内容的情况下,会触发系统扫描文件系统中的多媒体文件变化情况并同步到媒体数据库中;或者应用发送更新多媒体库广播时,也会触发多媒体数据库的更新),应用在需要读取设备内指定格式的多媒体文件信息时,可以直接读取这个数据库,相比于文件全盘检索效率会高很多。但是...
问题:有时候我们在手机卡上存储一些图片,但我们不希望在图
库
或相册里面看到。(图
库
或相册的机制是对存储卡上
文件
进行
扫描
然后列出来的,假如我们放了一张图片
文件
,那它就会
扫描
到,然后在图
库
或相册里面列出来)。
解决:在不希望
扫描
的
文件夹
的根目录,建立一个名字为.no
media
的空
文件
(这个
文件
作用是让
扫描
程序知道,这个
文件夹
不要
扫描
)。
这里关闭
媒体
扫描
功能采用的比较粗暴的方式,是直接注释了
Media
ScannerReceiver这个广播接收器,修改如下:
基于5.1的
packages\providers\
Media
Provider\
Android
Manifest.xml
<receiver
android
:name="
Media
ScannerReceiver">
<intent-filter>
<action and
开发中肯定有这样的情景:
自己的应用中会缓存很多图片到本地,不想让系统图
库
扫描
到自己的图片或者不想对用户浏览图片造成影响。以前的实现是把所有
文件
都去掉或者改掉扩展名。其实
Android
提供了对此的支持。
.no
media
文件
作用:应用中的图片不被系统图
库
扫描
“.no
media
”
文件
放在任何一个
文件夹
下都会把该
文件夹
下所有
媒体
文件
(图片,mp3,视频)隐藏起来不会在系统图
库
,铃声中出现。
1、申请
文件
读写权限(可自己写,可使用第三方)
2、在
指定
目录下创建一个.no
media
文件
,注:是
文件
,不是
文件夹
3、.nodedia
文件
创建好之后需要重启一下系统,之后再进相册就不会显示出该目录下的图片了
String path = Environment.getExternalStorageDirectory().toString() + "/face";//
指定
目录
if (isFolderExists(pa
USB扫码枪在扫完条形码后会有触发Editext的 KEYCODE_ENTER,而且还是触发两次,如果在Dow /up事件再加上enter事件 ,我这边扫码完成后就不会触发。检测每次的keycode发现在触发enter事件前一个keycode都是触发的条形码最后一位数字,而且都是两次触发。
我也不知道我的方法是否正确,就贴着留个痕迹吧 。。。。
editNo = (EditTe
import
android
.
media
.AudioManager;
import
android
.
media
.SoundPool;
import
android
.os.Bundle;
import
android
.app.Activity;
public class MainActivity extends Activity {
private SoundPool soundPool;
private int soundID;
boolean loaded = false;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 初始化SoundPool
soundPool = new SoundPool(10, AudioManager.STREAM_MUSIC, 0);
// 加载音频
文件
soundPool.setOnLoadCompleteListener(new SoundPool.OnLoadCompleteListener() {
@Override
public void onLoadComplete(SoundPool soundPool, int sampleId, int status) {
loaded = true;
soundID = soundPool.load(this, R.raw.sound, 1);
public void playSound(View v) {
if (loaded) {
soundPool.play(soundID, 1, 1, 1, 0, 1f);
@Override
protected void onDestroy() {
super.onDestroy();
soundPool.release();
soundPool = null;
上述代码使用了
Android
提供的`SoundPool`类来播放.wav
文件
。在`onCreate`方法中,首先初始化了`SoundPool`,然后通过`setOnLoadCompleteListener`方法来监听
文件
是否加载完成,一旦完成就将`loaded`标志设置为`true`。最后调用`load`方法来加载.wav
文件
。
在`playSound`方法中,如果
文件
已经加载完成,就可以调用`SoundPool`的`play`方法来播放
文件
。`play`方法的参数依次为:音频
文件
的ID、左声道音量(0.0f-1.0f)、右声道音量(0.0f-1.0f)、优先级(0为最低)、循环次数(0表示不循环)、播放速度(1.0f为正常速度)。
最后在`onDestroy`方法中释放`SoundPool`占用的资源。