实现手机来电铃声,通知铃声、警告铃声等音频定制化功能(一,添加扫描分区myimage)
需求功能说明:
该定制需求在各个国家民族差异化为背景下产生的,要求在系统中增加一个新的分区如myimage,用以实现存放定制资源,以符合不同国家民族的用户的体验。例如在myimage下新建media文件夹用于存放定制的音频资源,如果系统myimage分区下,media目录下存在相关目录或文件,则系统摒弃系统重名默认资源,优先选择该分区下的定制资源。注!
本篇博文结合从系统启动完成之后系统对多媒体文件的扫描流程进行分析和修改。修改思路为:优先扫描定制分区西下定制音频资源并将扫描结果插入相对应的数据库中。若定制分区下不存在资源目录或文件,则将系统默认资源的扫描结果插入相对应的数据库,若定制资源文件名与系统资源文件名相同,则优先插入定制资源。
参考代码:Android4.1.2_r2
1.当系统启动完成,MediaScannerReceiver接收到系统启动完成的广播,并调用scan()方法对内置存储设备进行扫描。
// 扫描内部存储设备,INTERNAL_VOLUME的值为"internal"
scan(context, MediaProvider.INTERNAL_VOLUME);
}
Bundle args = new Bundle();
args.putString("volume", volume);
context.startService(new Intent(context, MediaScannerService.class).putExtras(args));
2.MediaScannerService服务被启动,主要负责媒体扫描。详细来说MediaScannerService用于接收系统重启后、插拔SD卡、文件复制与拷贝等消息,收到消息后会启动一个handler去处理消息并扫描,最后会将扫描结果放到MediaProvider提供的数据库中去。这里我们先从onCreate生命周期函数开始分析。
mWakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, TAG);
......
thr.start();
Looper.prepare();
mServiceLooper = Looper.myLooper();
mServiceHandler = new ServiceHandler();
Looper.loop();
}
....
Message msg = mServiceHandler.obtainMessage();
msg.arg1 = startId;
msg.obj = intent.getExtras();
mServiceHandler.sendMessage(msg);
return Service.START_REDELIVER_INTENT;
{
@Override
public void handleMessage(Message msg){
Bundle arguments = (Bundle) msg.obj;
String filePath = arguments.getString("filepath");
String volume = arguments.getString("volume");
String[] directories = null;
if (MediaProvider.INTERNAL_VOLUME.equals(volume)) {
directories = new String[] {
Environment.getRootDirectory() + "/media",
};
}
......
scan(directories, volume);
......
}
ContentValues values = new ContentValues();
values.put(MediaStore.MEDIA_SCANNER_VOLUME, volumeName);
Uri scanUri = getContentResolver().insert(MediaStore.getMediaScannerUri(), values);
Uri uri = Uri.parse("file://" + directories[0]);
sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_STARTED, uri));
try {
if (volumeName.equals(MediaProvider.EXTERNAL_VOLUME)) {
openDatabase(volumeName);
}
MediaScanner scanner = createMediaScanner();
scanner.scanDirectories(directories, volumeName);
} catch (Exception e) {
Log.e(TAG, "exception in MediaScanner.scan()", e);
}
getContentResolver().delete(scanUri, null, null);
sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_FINISHED, uri));
mWakeLock.release();
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。