预置多媒体文件等到手机的指定目录
来源:互联网 发布:h3c 7506端口镜像 编辑:程序博客网 时间:2024/05/16 07:42
预置mp3,video,picture等文件到手机的指定目录的步骤:
一:先把要预置的文件放到系统的文件目录,通常是放在:out\target\product\msm8916_64\data 这个目录下,在这里创建一个文件夹media。
实现代码如下:
1)在目录:LINUX\android\device\qcom\msm8909 添加一个文件夹:built_in_media,需要预置的多媒体文件都放在这里,然后,在这里创建一个Android.mk 文件,Android.mk的内容如下:
# the dir of out/target/product/msm8909/data/built_in_media/ not recommend changes,
# if you nedd to change ,synchronize change the following files:packages/apps/PackageInstaller/src/.../FirstCopyReceiver.java
这个注释的意思是说,如果你修改了out/target/product/msm8909/data/目录下 文件夹:built_in_media/的名字,那么在把这些预置文件从文件系统拷贝到手机的指定目录时,也要做相应修改,即是在文件:FirstCopyReceiver.java中修改,后面会介绍。
PREBUILT_MULTI_MEDIA := device/qcom/msm8909/built_in_media/
PREBUILT_MULTI_MEDIA_PATH := out/target/product/msm8909/data/built_in_media/
$(shell mkdir -p $(PREBUILT_MULTI_MEDIA_PATH))
$(shell cp -rf $(PREBUILT_MULTI_MEDIA)*.mp3 $(PREBUILT_MULTI_MEDIA_PATH))
$(shell cp -rf $(PREBUILT_MULTI_MEDIA)*.mp4 $(PREBUILT_MULTI_MEDIA_PATH))
$(shell cp -rf $(PREBUILT_MULTI_MEDIA)*.jpg $(PREBUILT_MULTI_MEDIA_PATH))
这个Android.mk 的作用,就是把预置文件放置到 这个目录:out/target/product/msm8909/data/built_in_media/
+++ LINUX\android\device\qcom\msm8909\msm8909.mk
......
#QTIC flag
-include $(QCPATH)/common/config/qtic-config.mk
include device/qcom/msm8909/built_in_media/Android.mk //添加Anroid.mk到编译过程
......
2)因为从目录out/target/product/msm8909/data/built_in_media/ 复制到手机fileManager的指定目录,有权限要求,所以要在开机的流程中修改这个目录:out/target/product/msm8909/data/built_in_media/的读写权限。
LINUX\android\system\core\rootdir\init.rc
......
on post-fs-data
......
chmod 0777 /data/built_in_media
......
3)在第一次开机挂载存储设备时发出copy预置文件的消息。
LINUX\android\frameworks\base\services\core\java\com\android\server\MountService.java
private void handleSystemReady() {
if(path.equals("/storage/emulated/0")){
String isFirstBoot = SystemProperties.get("persist.sys.mount_is_first");
if (DEBUG_EVENTS){
Slog.i("wangjianlin", "path.equals(/mnt/sdcard) "+path.equals("/storage/emulated/0")
+",state.equals(Environment.MEDIA_MOUNTED)="+state.equals(Environment.MEDIA_MOUNTED));
SystemProperties.set("persist.sys.mount.path_value", path);
}
if((isFirstBoot == null || isFirstBoot.equals("")) && state.equals(Environment.MEDIA_MOUNTED)){
SystemProperties.set("persist.sys.mount_is_first", "DONE");
Intent firIntent = new Intent("android.intent.action.MEDIA_MOUNTED_FOR_FIRTIME");
mContext.sendStickyBroadcast(firIntent);
}
}
}
4)在这里\code\LINUX\android\packages\apps\PackageInstaller\做复制文件到指定目录的工作。
先在 AndroidManifest.xml 添加权限,及消息过滤设置
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
<receiver android:name=".FirstCopyReceiver">
<intent-filter>
<action android:name="android.intent.action.MEDIA_MOUNTED_FOR_FIRTIME" />
</intent-filter>
</receiver>
然后,添加文件如下文件,内容很好理解,不做解释了
package com.android.packageinstaller;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.util.Log;
FirstCopyReceiver.java
{private static final boolean DEBUG_COPY = false;
/**
* delete file or folder
* @param folder Path String ,absolute path of file :/mnt/sdcard/test/1.png
*/
public static void deleteDirectory(String folderPath)
{
try
{
// delete all files
deleteAllFile(folderPath);
File lastFile = new File(folderPath);
if (lastFile.exists())
{
//delete the empty folder
lastFile.delete();
}
}
catch (Exception e)
{
e.printStackTrace();
}
}
/**
* delete file or folder
* @param folder Path String ,absolute path of file :/mnt/sdcard/test/1.png
*/
private static void deleteAllFile(String path)
{
//open up a file space in memory
File file = new File(path);
if (!file.exists())
{
return;
}
if (file.isFile())
{
file.delete();
}
else if (file.isDirectory())
{
String[] tempList = file.list();
File temp = null;
for (int i = 0; i < tempList.length; i++)
{
if (path.endsWith(File.separator))
{
temp = new File(path + tempList[i]);
}
else
{
temp = new File(path + File.separator + tempList[i]);
}
if (temp.isFile())
{
temp.delete();
}
if (temp.isDirectory())
{
deleteAllFile(path + "/" + tempList[i]);
deleteDirectory(path + "/" + tempList[i]);
}
}
}
}
public void copyFolder(String oldPath, String newPath) {
try {
(new File(newPath)).mkdirs();
if(DEBUG_COPY){
Log.d("FirstCopyReceiver", "---"+oldPath+":to:"+newPath);
}
File srcDir=new File(oldPath);
String[] file=srcDir.list();
if(file == null)
{
Log.d("FirstCopyReceiver", "file is NULL, error! srcDir.isDirectory()="+srcDir.isDirectory());
return;
}
File temp=null;
for (int i = 0; i < file.length; i++) {
if(oldPath.endsWith(File.separator)){
temp=new File(oldPath+file[i]);
}
else{
temp=new File(oldPath+File.separator+file[i]);
}
if(DEBUG_COPY){
Log.d("FirstCopyReceiver", "temp."+i+"="+temp);
}
if(temp.isFile()){
FileInputStream input = new FileInputStream(temp);
FileOutputStream output = new FileOutputStream(newPath + "/" + (temp.getName()).toString());
byte[] b = new byte[1024 * 5];
int len;
while ( (len = input.read(b)) != -1) {
output.write(b, 0, len);
}
output.flush();
output.close();
input.close();
}
if(temp.isDirectory()){
copyFolder(oldPath+"/"+file[i],newPath+"/"+file[i]);
}
}
}
catch (Exception e) {
Log.d("FirstCopyReceiver", "copy failure");
e.printStackTrace();
}
}
@Override
public void onReceive(Context context, Intent intent) {
if(DEBUG_COPY){
Log.d("FirstCopyReceiver", "onReceive,intent="+intent);
}
copyFolder("/data/built_in_media", "/storage/emulated/0/ArquivosDL");//指定的手机filemanager目录
if(DEBUG_COPY){
Log.d("FirstCopyReceiver", "after copy");
}
deleteDirectory("/data/built_in_media");
if(DEBUG_COPY){
Log.d("FirstCopyReceiver", "deleted");
}
}
}
- 预置多媒体文件等到手机的指定目录
- ANDROID 4.1 预置多媒体文件到内存
- 基于RK平台ANDROID 4.1 预置多媒体文件到内存
- 列出指定目录的文件
- Android通过.nomedia文件禁止多媒体库扫描指定文件夹下的多媒体文件
- 复制文件到指定目录的指定文件
- 拷贝指定文件之外的所有文件到指定目录
- 通过预置文件改变form的色彩
- vc查找指定目录下的文件:
- 遍历指定目录的文件并返回
- VC 遍历指定目录下的文件
- 遍历指定目录内的文件
- 查找指定目录下的文件
- c#读取指定目录的所有文件
- 获取指定目录下的所有文件
- PYTHON 列出指定目录下的文件
- 遍历指定目录下的所有文件
- Makefile 支持头文件目录的指定
- Struts2的基石(拦截器)
- BOM制作系列之一:BOM拆分
- iOS框架介绍--G&H字头
- OpenGL学习笔记
- opencv访问矩阵元素出错 int point = Mat.at<float>(y,x)
- 预置多媒体文件等到手机的指定目录
- exit2/ext3文件系统介绍
- Linux脚本EOF
- pjsip集成webrtc媒体处理
- 使用JQuery跨域请求
- Unity3D 学习笔记
- 犯了一个超低级错误
- js之正则表达式1
- (转载)opencv 相关