Android “.nomedia“ 文件的使用方法和原理

系统媒体数据库无法扫描到数据
1.插入一张SDCARD
2.push 3000左右图片到sdcard
3.重启
4.观察发现手机不能读取到图片数据 (读取方法:Images.Media.getContentUri(“external”)获取uri, 然后读取数据库)
5.push 1首歌曲
6.重启进入music,等待扫描结束,music不能显示歌曲

根本原因是:
多媒体文件所在目录下有.nomedia文件,因此,MediaProvider会把该目录的文件识别为普通文件,具体表现是在db文件中media_type的值为0; 因此在image、video 、audio等视图中通过type查询时,是查询不到信息的。 该问题的原因就在目录中有了.nomedia文件

.nomedia产生的原因:
在MediaProvider.apk中是不会自动添加该文件的; 一般.nomedia文件是由其他apk的一些设置等操作才会添加。由于缺乏信息且无法复现,无法分析是什么产生的。

官网对.nomedia的解释:
在媒体扫描程序中隐藏您的文件在您的外部文件目录中包含名为 .nomedia的空文件(注意文件名中的点前缀)。
这将阻止媒体扫描程序读取您的媒体文件,并通过 MediaStore内容提供程序将其提供给其他应用。但如果您的文件真正是应用的私有文件,则应该将其保存在应用私有的目录中。

新建.nomedia文件的方法:
1.Windows系统的新建文件不能新建.nomedia文件新建方法:
new File(dir, “.nomedia”).createNewFile();

2.CMD命令行
copy con .nomedia 回车
然后此时屏幕上有一个光标在闪烁,说明等待你输入该文件内容,如果想建立空内容文件,这里就什么都不输入,这时按下ctrl+Z键再回车,就生成一个空文件。

3.Linux Shell
touch .nomedia

实现原理分析 https://blog.csdn.net/weixin_30722589/article/details/96579761

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要将自定义的`android.media.MediaDataSource`与`android.media.MediaPlayer`一起使用,您需要遵循以下步骤: 1. 创建一个继承自`android.media.MediaDataSource`的自定义类,并实现`readAt()`和`getSize()`方法,这些方法将返回音频文件的字节数据和文件大小。 2. 在`MediaPlayer`对象中设置自定义的`MediaDataSource`,可以使用`setDataSource(MediaDataSource dataSource)`方法。 以下是示例代码: ```java // 自定义 MediaDataSource 类 public class CustomMediaDataSource extends MediaDataSource { private byte[] mData; public CustomMediaDataSource(byte[] data) { mData = data; } @Override public int readAt(long position, byte[] buffer, int offset, int size) throws IOException { int length = mData.length; if (position >= length) { return -1; } if (position + size > length) { size = (int) (length - position); } System.arraycopy(mData, (int) position, buffer, offset, size); return size; } @Override public long getSize() throws IOException { return mData.length; } @Override public void close() throws IOException { mData = null; } } // 在 MediaPlayer 中使用自定义的 MediaDataSource MediaPlayer mediaPlayer = new MediaPlayer(); CustomMediaDataSource dataSource = new CustomMediaDataSource(audioData); try { mediaPlayer.setDataSource(dataSource); mediaPlayer.prepare(); mediaPlayer.start(); } catch (Exception e) { e.printStackTrace(); } ``` 其中,`audioData`是音频文件的字节数组数据。您需要将其传递给自定义的`CustomMediaDataSource`类。 希望对您有所帮助!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值