预置多媒体文件等到手机的指定目录

来源:互联网 发布: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");
}
}
}


0 0
原创粉丝点击