在处理Android平台的项目时,遇到客户提出的要求预置一个MP4类型的视频文件在系统目录。

经过参考一些文档,处理方案如下:

一、将媒体文件拷贝在out目录

方法类似预置第三方app

Android.mk

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS) LOCAL_MODULE_TAGS := optional
LOCAL_POST_PROCESS_COMMAND := $(shell mkdir -p $(TARGET_OUT)/media/demo/)
LOCAL_POST_PROCESS_COMMAND := $(shell cp $(LOCAL_PATH)/demo.mp4 $(TARGET_OUT)/media/demo/)

需要拷贝的媒体文件为demo.mp4,预置在system/media/demo/

注意:此时媒体文件还未在系统存储的目录,还需要上层进行一次拷贝动作

二、第一次开机时将该文件拷贝进/storage/emulated/0/Movies

添加权限以及service的注册

--- a/alps/vendor/mediatek/proprietary/packages/providers/MediaProvider/AndroidManifest.xml
+++ b/alps/vendor/mediatek/proprietary/packages/providers/MediaProvider/AndroidManifest.xml
@@ -13,6 +13,7 @@<uses-permission android:name="android.permission.ACCESS_MTP" /><uses-permission android:name="android.permission.MANAGE_USERS" /><uses-permission android:name="android.permission.INTERACT_ACROSS_USERS" />
+       <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />   <!-- M: Google protect using am.getRunningAppProcesse get other process info in diff uid,so we need add this permission to permit process.media, so that DrmHelper can use pid toquery out process name. -->
@@ -82,6 +83,10 @@<action android:name="mediatek.intent.action.OVERTIME_REMOVAL" /></intent-filter></receiver>
+
+               <service android:name="CopyFileService" android:exported="true">
+
+        </service><service android:name="MediaScannerService" android:exported="true"><intent-filter>
--- a/alps/vendor/mediatek/proprietary/packages/providers/MediaProvider/src/com/android/providers/media/MediaScannerReceiver.java
+++ b/alps/vendor/mediatek/proprietary/packages/providers/MediaProvider/src/com/android/providers/media/MediaScannerReceiver.java
@@ -63,6 +63,18 @@ public class MediaScannerReceiver extends BroadcastReceiver {public void onReceive(Context context, Intent intent) {final String action = intent.getAction();Log.v(TAG, "onReceive action = " + action);
+               SharedPreferences sharedPreferences = context.getSharedPreferences("first_boot",Context.MODE_PRIVATE);
+               boolean first_boot= sharedPreferences.getBoolean("first_boot", true);//如果是第一次开机,则sharedPreferences 的值为空,赋值true
+               if (first_boot) {
+                       Log.v(TAG,"->CopyFileService");
+                       Intent activityIntent = new Intent();
+                       activityIntent.setClassName("com.android.providers.media", "com.android.providers.media.CopyFileService");
+                       context.startService(activityIntent);//启动拷贝文件的Services,由于文件比较大,onReceive方法里不能做耗时操作,可以用service解决
+               }
+               SharedPreferences.Editor editor1 = sharedPreferences.edit();
+               editor1.putBoolean("first_boot", false);//赋值false,表示下次开机不用再拷贝了
+               editor1.commit();
+                  if (Intent.ACTION_BOOT_COMPLETED.equals(action)) {Log.v(TAG,"onReceive BOOT_COMPLETED,begin to scan internal and external storage.");
(END)

只需要第一次开机进行拷贝就可以,防止后续重启每次都要进行重复操作。

CopyFileService.java

package com.android.providers.media;import android.app.Service;
import android.content.Intent;
import android.os.Environment;
import android.os.IBinder;
import android.util.Log;import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;public class CopyFileService extends Service {private final static String TAG = "Monkey_CopyFileService";private static String PRELOAD_SRC = Environment.getRootDirectory()+"/media/demo";//*** 这个路径是/system/loadmediaprivate static String PRELOAD_DEST = "/storage/emulated/0/Movies";private CopyThread mCopyThread;@Overridepublic IBinder onBind(Intent intent) {return null;}@Overridepublic void onCreate() {Log.d(TAG,"CopyFileService---------------");super.onCreate();}@Overridepublic int onStartCommand(Intent intent, int flags, int startId) {Log.d(TAG,"onStartCommand---------------");if (mCopyThread == null) {mCopyThread = new CopyThread();mCopyThread.start();}return Service.START_REDELIVER_INTENT;}public class CopyThread extends Thread {@Overridepublic void run() {if (copyFolder(new File(PRELOAD_SRC), new File(PRELOAD_DEST))) {Log.e(TAG, "doPreloadMedia success !");} else {Log.e(TAG, "doPreloadMedia failed 。");}Log.e(TAG, "PRELOAD_SRC:"+PRELOAD_SRC);Log.e(TAG, "PRELOAD_DEST:"+PRELOAD_DEST);stopSelf();}}public boolean copyFolder(File srcFile, File destFile) {if (!srcFile.isDirectory()) {Log.i(TAG, "srcFile no isDirectory :"+srcFile.getName());return false;}if (!srcFile.canRead()) {Log.i(TAG, "no canRead :"+srcFile.getName());}if (!srcFile.canWrite()) {Log.i(TAG, "no canWrite :"+srcFile.getName());}if (!destFile.exists()) {boolean r = false;synchronized (this) {r = destFile.mkdirs();}Log.i(TAG, "destFile:exists " + r);}boolean result = true;File[] list = srcFile.listFiles();if (list == null) {Log.i(TAG, "copyFolder: list null =" + srcFile.getName());return false;}for (File f : list) {Log.i(TAG,"f.getName():"+f.getName());if (f.isDirectory()) {result &= copyFolder(f, new File(destFile, f.getName()));} else if(f.isFile()){result &= copyFile(f, new File(destFile, f.getName()));}}Log.i(TAG,"result:"+result);return result;}public boolean copyFile(File srcFile, File destFile) {boolean result = false;try {InputStream in = new FileInputStream(srcFile);try {result = copyToFile(in, destFile);} finally {in.close();}} catch (IOException e) {result = false;}return result;}/*** Copy data from a source stream to destFile.* Return true if succeed, return false if failed.*/public boolean copyToFile(InputStream inputStream, File destFile) {try {if (destFile.exists()) {destFile.delete();}FileOutputStream out = new FileOutputStream(destFile);try {byte[] buffer = new byte[4096];int bytesRead;while ((bytesRead = inputStream.read(buffer)) >= 0) {out.write(buffer, 0, bytesRead);}} finally {out.flush();try {out.getFD().sync();} catch (IOException e) {}out.close();}return true;} catch (IOException e) {return false;}}
}

PRELOAD_DEST 代表的是你要放置的目录这个可以通过adb进行获取。

PRELOAD_SRC 代表的是编译到system/media/demo/这个目录,位于out下。

Android系统目录预置media文件相关推荐

  1. Android系统目录结构详解

    Android系统基于linux内核.JAVA应用,算是一个小巧精致的系统.虽是开源,但不像Linux一般庞大,娇小可亲,于是国内厂商纷纷开发出自己基于Android的操作系统.在此呼吁各大厂商眼光放 ...

  2. Android系统目录介绍

    Android 系统目录结构图 在android4.0之前所用的是Linux 2.6.x版本,而在android4.0之后所使用的是Linux 3.x版本.常见的Android系统目录如下图所示: 重 ...

  3. 移动端上传大文件到服务器,android上传大文件到服务器地址

    android上传大文件到服务器地址 内容精选 换一换 安装传输工具在本地主机和Windows云服务器上分别安装数据传输工具,将文件上传到云服务器.例如QQ.exe.在本地主机和Windows云服务器 ...

  4. Android——4.2.2 文件系统文件夹分析

    近期公司要整android内部培训,分配给我写个培训文档.这里记录例如以下: 撰写不易,转载请注明出处:http://blog.csdn.net/jscese/article/details/4089 ...

  5. Android 系统(71)---Android系统build.prop文件生成过程

    Android系统build.prop文件生成过程 Android系统build.prop生成过程 这个文件类似于windows的注册表文件,定义了系统初始的一些参数属性,功能的开放等,通过调整或增加 ...

  6. android系统目录,详解安卓系统各目录

    \system\\app 这个里面主要存放的是常规下载的应用程序,可以看到都是以APK格式结尾的文件.在这个文件夹下的程序为系统默认的组件,自己安装的软件将不会出现在这里,而是\\data\\文件夹中 ...

  7. android 设置铃声文件夹在哪里,Android 设置铃声的文件夹

    Android 设置铃声的文件夹 1 系统自带声音文件存放的位置和内容. 1.1 总目录:/system/media/audio 1.2 闹钟:/system/media/audio/alarms 1 ...

  8. Android -- 多媒体播放之Media Playback基础介绍

    Android -- MediaPlayer之Media Playback基础介绍 文章翻译自Android官方文档:http://www.android-dev.cn/guide/topics/me ...

  9. android webview 多文件上传,Android网页WebView图片文件上传的问题

    Android网页WebView图片文件上传的问题 发布时间:2020-07-13 22:48:15 来源:51CTO 阅读:5922 作者:拾荒者老大 在安卓下,webview上传图片点击是没用的, ...

最新文章

  1. 任务与中断共享资源冲突示例
  2. Android 动画专题(2)--- Frame Animation
  3. CF819E:Mister B and Flight to the Moon(构造、归纳法)
  4. python 字符串format使用
  5. 4k视频分辨率的码流_8K电视来了!但是8K视频仍很遥远
  6. 华中科技大学计算机网络实验_第四届江苏省计算机网络与云计算新技术研讨会在南京召开...
  7. 动态构建LINQ表达式
  8. web集群之 Keepalived
  9. String,StringBuffer,StringBulilder之间的区别
  10. VS2012安装步骤
  11. 将.fla转换为视频文件(.mp4)或gif文件
  12. python字典forward_python工具库库介绍-bidict: 双向字典
  13. win10显示无法连接到Internet但是能上网
  14. 在线文件不落地转base64
  15. python统计红楼梦人物出场次数_《红楼梦》人数统计,人物,出场,次数
  16. 电路中的VDD,DVDD,AVDD,VCC,AFVDD,DOVDD,IOVDD的区别
  17. deg怎么读_deg是什么意思_deg怎么读_deg翻译_用法_发音_词组_同反义词_degree(s) 度-新东方在线英语词典...
  18. 50和学习c/c++优秀网站
  19. 【财务数字化管理】金蝶ERP系统助力企业数字化转型
  20. 利用类权重来改善类别不平衡

热门文章

  1. Java8 日期、时间骚操作
  2. 花呗最高额度只有5万,为何有人花呗额度可以达到1000万?
  3. gdal 图层内相交要素合并
  4. 从普通进阶成优秀的测试/开发程序员,一路过关斩将
  5. (To Learn More) ML Lecture 0-1: Introduction of Machine Learning
  6. mysql建表 联合主键
  7. [转]华为离职副总裁徐家骏的工作感悟
  8. 04 基于高通8155的智能座舱功能安全设计
  9. GIS开发入坑(二)--ArcGIS影像切片并使用GeoServer发布
  10. python 格式化代码