android 不打开Shared sdcard功能,内置SD卡中预制资源,删除资源,恢复出厂设置恢复

当有内置SD卡,且不打开shared sdcard功能的情况下,需要在SD卡中预置一些客户资源。

这些资源end user可见,也可删除。在资源被user删除之后,执行恢复出厂设置功能,需要恢复这些预置资源。

1. 预置同样的资源到user不可见的分区,如/system下。

在alps\vendor\mediatek\project_name\artifacts\out\target\product\your_project_name\system\ 下创建目录,

将预制资源放于此目录下,重新build new之后,system image中就带有预制资源。

2. recovery结束,拷贝资源到SD卡上。

在recovery main函数的结尾,也就是恢复出厂设置,或者SD卡升级之后,通过客制化函数,将特定的文件copy到SD卡下。

int

main(int argc, char **argv) {

...

//添加这个客制化函数用来恢复特定文件夹下的所有文件,包括子目录,这里是案例:/data/app/  --->  /sdcard/app/

recovery_restore_special("/sdcard/app", "/data/app");

// Otherwise, get ready to boot the main system...

finish_recovery(send_intent);

ui->Print("Rebooting...\n");

property_set(ANDROID_RB_PROPERTY, "reboot,");

return EXIT_SUCCESS;

}

int recovery_restore_special(char *des_dir_path, char *src_dir_path)

{

int ret= 0;

printf("\n\n++ %s ++\n\n", __func__);

printf("src dir:%s\n", src_dir_path);

printf("des dir:%s\n", des_dir_path);

//mount path

ret = ensure_path_mounted(src_dir_path);

if(ret < 0) {

printf("mount src dir error:%s\n", src_dir_path);

return -1;

}

printf("mount:%s ret=%d\n", src_dir_path, ret);

ret = ensure_path_mounted(des_dir_path);

if(ret < 0) {

printf("mount des dir error:%s\n", des_dir_path);

ensure_path_unmounted(src_dir_path);

return -1;

}

printf("mount:%s ret=%d\n", des_dir_path, ret);

//restore dir and file

ret = restore_dir_file(des_dir_path, src_dir_path);

printf("restore ret=%d\n", ret);

//unmount

ensure_path_unmounted(src_dir_path);

ensure_path_unmounted(des_dir_path);

printf("\n\n-- %s --\n\n", __func__);

return 0;

}

static int restore_dir_file(char *des_dir_path, char *src_dir_path)

{

int ret= 0;

DIR* dir_des = NULL;

DIR* dir_src = NULL;

struct dirent* de_des = NULL;

struct dirent* de_src = NULL;

FILE * fdes = NULL;

FILE * fsrc = NULL;

char src_file_path[256] = {0};

char des_file_path[256] = {0};

char buf[256] = {0};

int name_len = 0;

int size = 0, file_len = 0;

printf("\n\nenter, %s \n\n", __func__);

printf("src dir:%s\n", src_dir_path);

printf("des dir:%s\n", des_dir_path);

//open dir

dir_src = opendir(src_dir_path);

if(dir_src == NULL) {

printf("open src dir error:%s\n", src_dir_path);

return -1;

}

dir_des = opendir(des_dir_path);

if(dir_des == NULL) {

ret = -1;

if(errno == ENOENT) {

printf("des dir not exist:%s\n", des_dir_path);

ret = mkdir(des_dir_path, (S_IRWXU | S_IRWXG | S_IRWXO));

}

if(ret < 0) {

closedir(dir_src);

printf("open des dir error:%s\n", des_dir_path);

return -1;

}

else {

printf("mkdir des dir:%s\n", des_dir_path);

dir_des = opendir(des_dir_path);

}

}

printf("dir_src=%d, dir_des=%d\n", dir_src, dir_des);

while ((de_src = readdir(dir_src)) != NULL) {

printf("d_name: %s\n", de_src->d_name);

if (de_src->d_type == DT_DIR) {

name_len = strlen(de_src->d_name);

// skip "." and ".." entries

if ((name_len == 1 && de_src->d_name[0] == ‘.‘) ||

(name_len == 2 && de_src->d_name[0] == ‘.‘ && de_src->d_name[1] == ‘.‘)) {

continue;

}

else {

//src dir path append the folder‘s d_name

sprintf(src_file_path, "%s/%s", src_dir_path, de_src->d_name);

printf("src dir path: %s\n", src_file_path);

//des dir path append the folder‘s d_name

sprintf(des_file_path, "%s/%s", des_dir_path, de_src->d_name);

printf("des dir path: %s\n", des_file_path);

printf("---entry sub dir to restore\n");

ret = restore_dir_file(des_file_path, src_file_path);

printf("sub dir restore ret=%d\n", ret);

}

}

else if (de_src->d_type == DT_REG) {

//open src file

sprintf(src_file_path, "%s/%s", src_dir_path, de_src->d_name);

printf("src_file_path: %s\n", src_file_path);

fsrc = fopen(src_file_path, "r");

printf("fsrc=%d\n", fsrc);

//create des file

sprintf(des_file_path, "%s/%s", des_dir_path, de_src->d_name);

printf("des_file_path: %s\n", des_file_path);

fdes = fopen_path(des_file_path, "w");

printf("fdes=%d\n", fdes);

//read from src file, write to des file

file_len= 0;

while (!feof(fsrc)) {

size = fread(buf, sizeof(char), sizeof(buf), fsrc);

fwrite(buf, sizeof(char), size, fdes);

memset(buf, 0, sizeof(buf));

file_len += size;

}

fflush(fdes);

printf("%s: file_len=%d\n", de_src->d_name, file_len);

//close file

fclose(fsrc);

fclose(fdes);

}

}

//close dir

closedir(dir_src);

closedir(dir_des);

printf("\n\nexit, %s \n\n", __func__);

return 0;

}

时间: 2024-10-14 09:21:18

android 不打开Shared sdcard功能,内置SD卡中预制资源,删除资源,恢复出厂设置恢复的相关文章

android Loger日志类(获取内置sd卡)

Android手机自带内部存储路径的获取 原文地址:http://my.oschina.net/liucundong/blog/288183 直接贴代码: public static String getExternalSdCardPath() { if (SDCardUtils.isSDCardEnable()) { File sdCardFile = new File(Environment.getExternalStorageDirectory().getAbsolutePath());

Android获取机身存储、内置SD卡与外置TF卡路径

获取机身存储路径(可以通过openFileInput,openFileOutput进行操作) String path=Environment.getDataDirectory().getAbsolutePath();返回/data 获取内置SD卡路径: public String getStorageDir(){ if(!(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED))){ return "&quo

关于手机的内置SD卡与外置SD卡

对于安卓2.3的系统来说,Environment.getExternalStorageDirectory()获取的目录是内置SD卡还是外置SD卡是无法保证的, 和手机厂商的修改有关,只能通过Environment.isExternalStorageRemovable()来判断,如果返回true就是外置的,因为外置的才能卸载.(但是我目前只遇到过安卓4.4系统才有内置SD卡,所以Environment.getExternalStorageDirectory()在2.3系统上当外置的用吧,遇到特殊机

【记录】尝试用android-logging-log4j去实现log输出内容到sd卡中的文件的功能

[背景] 折腾: [记录]给Android中添加log日志输出到文件 期间,已经试了: [记录]尝试用android中microlog4android实现log输出到文件的功能 但是不好用. 然后就是参考: http://stackoverflow.com/questions/2116260/logging-to-a-file-on-android 去看看: http://code.google.com/p/android-logging-log4j/ [[折腾过程] 1.去: https://

Android 手持PDA读取SD卡中文件

近两年市场上很多Wince设备都开始转向Android操作系统,最近被迫使用Android开发PDA手持设备.主要功能是扫描登录,拣货,包装,发货几个功能.其中涉及到商品档的时候大概有700左右商品要导入到Android设备中,因为现场操作环境没有WiFi ,所以商品档不能直接访问服务,将商品档记录到txt文件中. 一. 将txt文件存放到SD开中 将商品档编辑成为txt文件然后拷贝到SD卡中,当然也可以存储其他的数据格式,甚至可以使用Sqlite来存储,这里没有这个必要所以就直接使用txt 二

android 解决传送中文名文件到模拟器SD卡中

RT,android adb push命令解决中文名文件,把电脑本地的文件导入到Android模拟器AVD的SD卡中 1.通过adb push命令 PS:windows下不稳定,试了下中文名文件能传过去,但文件名为空,linux下可以.若win下该方法不行,参考第二种方法.字幕数字文件名不必说了,肯定没问题. 通过adb push,则可将文件添加到SD卡中.如果想在push的时候修改文件名称的话,只需要修改push的第二个参数改成完整路径(目录+文件名),如E:/videos/welcom.mp

Android恢复出厂设置

恢复出厂设置核心代码: sendBroadcast(new Intent("android.intent.action.MASTER_CLEAR")); 即发送一个广播,需要在AndroidManifest.xml配置 <receiver android:name="com.android.server.MasterClearReceiver"           android:permission="android.permission.MAST

Android中使用SQLiteOpenHelper管理SD卡中的数据库

使用Android中自带的SQLiteOpenHelper可以完成数据库的创建与管理,但有两点局限: (1)数据库创建在内存卡中,大小受限,创建位置位于/data/data/应用程序名/databases中(可使用Eclispe的DDMS查看). (2)如果无法获取Root权限,则无法直接查看创建的数据库. 鉴于上述限制及实际需要,打算使用SQLiteOpenHelper管理SD卡上的数据库,通过研究SQLiteOpenHelper的源码,发现其创建或打开数据库的代码位于getWritableD

android 读取sd卡中的图片

一.获取读取SD卡的权限 <!--在SDCard中创建与删除文件权限  -->    <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>    <!-- 往SDCard写入数据权限 -->    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STO