Android系统目录预置media文件
在处理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文件相关推荐
- Android系统目录结构详解
Android系统基于linux内核.JAVA应用,算是一个小巧精致的系统.虽是开源,但不像Linux一般庞大,娇小可亲,于是国内厂商纷纷开发出自己基于Android的操作系统.在此呼吁各大厂商眼光放 ...
- Android系统目录介绍
Android 系统目录结构图 在android4.0之前所用的是Linux 2.6.x版本,而在android4.0之后所使用的是Linux 3.x版本.常见的Android系统目录如下图所示: 重 ...
- 移动端上传大文件到服务器,android上传大文件到服务器地址
android上传大文件到服务器地址 内容精选 换一换 安装传输工具在本地主机和Windows云服务器上分别安装数据传输工具,将文件上传到云服务器.例如QQ.exe.在本地主机和Windows云服务器 ...
- Android——4.2.2 文件系统文件夹分析
近期公司要整android内部培训,分配给我写个培训文档.这里记录例如以下: 撰写不易,转载请注明出处:http://blog.csdn.net/jscese/article/details/4089 ...
- Android 系统(71)---Android系统build.prop文件生成过程
Android系统build.prop文件生成过程 Android系统build.prop生成过程 这个文件类似于windows的注册表文件,定义了系统初始的一些参数属性,功能的开放等,通过调整或增加 ...
- android系统目录,详解安卓系统各目录
\system\\app 这个里面主要存放的是常规下载的应用程序,可以看到都是以APK格式结尾的文件.在这个文件夹下的程序为系统默认的组件,自己安装的软件将不会出现在这里,而是\\data\\文件夹中 ...
- android 设置铃声文件夹在哪里,Android 设置铃声的文件夹
Android 设置铃声的文件夹 1 系统自带声音文件存放的位置和内容. 1.1 总目录:/system/media/audio 1.2 闹钟:/system/media/audio/alarms 1 ...
- Android -- 多媒体播放之Media Playback基础介绍
Android -- MediaPlayer之Media Playback基础介绍 文章翻译自Android官方文档:http://www.android-dev.cn/guide/topics/me ...
- android webview 多文件上传,Android网页WebView图片文件上传的问题
Android网页WebView图片文件上传的问题 发布时间:2020-07-13 22:48:15 来源:51CTO 阅读:5922 作者:拾荒者老大 在安卓下,webview上传图片点击是没用的, ...
最新文章
- 任务与中断共享资源冲突示例
- Android 动画专题(2)--- Frame Animation
- CF819E:Mister B and Flight to the Moon(构造、归纳法)
- python 字符串format使用
- 4k视频分辨率的码流_8K电视来了!但是8K视频仍很遥远
- 华中科技大学计算机网络实验_第四届江苏省计算机网络与云计算新技术研讨会在南京召开...
- 动态构建LINQ表达式
- web集群之 Keepalived
- String,StringBuffer,StringBulilder之间的区别
- VS2012安装步骤
- 将.fla转换为视频文件(.mp4)或gif文件
- python字典forward_python工具库库介绍-bidict: 双向字典
- win10显示无法连接到Internet但是能上网
- 在线文件不落地转base64
- python统计红楼梦人物出场次数_《红楼梦》人数统计,人物,出场,次数
- 电路中的VDD,DVDD,AVDD,VCC,AFVDD,DOVDD,IOVDD的区别
- deg怎么读_deg是什么意思_deg怎么读_deg翻译_用法_发音_词组_同反义词_degree(s) 度-新东方在线英语词典...
- 50和学习c/c++优秀网站
- 【财务数字化管理】金蝶ERP系统助力企业数字化转型
- 利用类权重来改善类别不平衡