修改Android开机图片、动画、声音



所需资源下载地址:http://download.csdn.net/detail/hanbo622/9725818
一、修改第一张图片
 1、将"png-24"格式的图片转换成raw格式(linux下的ImageMagick自带的convert命令,否则执行sudo apt-get install imagemagick)
  convert -depth 8 logo.png rgb:logo.raw
 2、将raw格式装换成rle格式(源码:build/tools/rgb2565)
  ./rgb2565 -rle <logo.raw> pak_fu_kanlogo.rle
 3、修改system/core/init/init.h中#define INIT_IMAGE_FILE "/initlogo.rle" 文件名"/pak_fu_kanlogo.rle"
 4、把pak_fu_kanlogo.rle文件放到out/target/product/ut4412/root中
 注意:使用PS制作一张480*800的图片,保存时选“保存为 Web 所用格式”,然后在弹开的窗口上,“预设”项选择“PNG-24”,
 保存为logo.png ,好像只支持png-24,其他格式生成的rle文件显示不正常

二、修改第二张图片
 方法一:
 在window下的操作:
 1 在 Widows 环境中建立文件夹:bootanimation
 2 在bootanimation文件夹中建立子文件夹:
  part0
  part1
  然后将一批.png文件拷贝到文件夹part0里面,part1中暂时不放图片文件
 3 在 bootanimation 文件夹中建立文本文件:
  desc.txt
  可能在desc.txt中写如下信息(注,该文件是google定义的,可在网上搜索得到):
  1024 600 10
  p 1 0 part0
  p 0 0 part1
  文件 desc.txt 的内容解释:
  (1)分辨率
   1024 600
   第一行”1024 600”:表示机器屏幕分辨率width height
  (2)帧率
   第一行”10”:表示每秒中播放10张图片(gong 10zhang )
  (3)p 1 0 part0
   p:表示play
   1:表示播放一遍,如果是0则表示循环播放
   0:表示延时时间
   part0:此文件夹下放置开机显示的动画图片,图片分辨率要和机器分辨率一样,否则显示会有问题
  (4)p 0 0 part1
   在part0的图片都显示完毕后,就显示part1中的图片
 4 在文件夹 bootanimation 内,同时选择“part0, part1, desc.txt”,然后压缩
  (在Linux下压缩:zip -r -X -Zstore ../bootanimation.zip part*/*.png desc.txt)
  压缩的设置如下:
  (a)压缩文件名:bootanimation.zip
  (b)压缩文件格式:ZIP
  (c)压缩方式:存储
 5 将前面生成的bootanimation.zip拷贝到工程中
  $ cd  device/samsung/ut4412/apk
  $ mkdir  app_newpad
  注:将生成的bootanimation.zip文件拷贝到文件夹app_newpad中
 6 编辑 device.mk
  $ vi  device/samsung/ut4412/device.mk
  ##################################
  #  copy proprietary apk
  ##################################
  COPY_APK_TARGET := $(call all-apk-files-under,apk)
  PRODUCT_COPY_FILES += $(foreach apkName, $(COPY_APK_TARGET), \
  $(addprefix $(LOCAL_PATH)/apk/, $(apkName)):$(addprefix system/app/, $(apkName)))
  PRODUCT_COPY_FILES += \
  $(LOCAL_PATH)/apk/flashplayer.nm:system/app/flashplayer.nm
  # 添加以下信息
  # 注意路径的一致性
  PRODUCT_COPY_FILES += \
  $(LOCAL_PATH)/apk/app_newpad/bootanimation.zip:system/media/bootanimation.zip
  
 方法二: 
  android开机动画叫源码位于frameworks/base/cmds/bootanimation下,这个程序会将/data/local/bootanimation.zip
 或/system/media/bootanimation.zip里面的png图片以动画的形式播放出来。
 首先,我们先来分析一下源码:frameworks/base/cmds/bootanimation/BootAnimation.cpp
 首先看一下定义的常量:
  #define USER_BOOTANIMATION_FILE "/data/local/bootanimation.zip"
  #define SYSTEM_BOOTANIMATION_FILE "/system/media/bootanimation.zip"
  #define SYSTEM_ENCRYPTED_BOOTANIMATION_FILE "/system/media/bootanimation-encrypted.zip"
 BootAnimation::readyToRun()
  进入一个if判断语句
  if ((encryptedAnimation &&
    (access(SYSTEM_ENCRYPTED_BOOTANIMATION_FILE, R_OK) == 0) &&
    (mZip.open(SYSTEM_ENCRYPTED_BOOTANIMATION_FILE) == NO_ERROR)) ||
    ((access(USER_BOOTANIMATION_FILE, R_OK) == 0) &&
    (mZip.open(USER_BOOTANIMATION_FILE) == NO_ERROR)) ||
    ((access(SYSTEM_BOOTANIMATION_FILE, R_OK) == 0) &&
    (mZip.open(SYSTEM_BOOTANIMATION_FILE) == NO_ERROR))) {
   mAndroidAnimation = false;
  }
 BootAnimation::threadLoop()
  if (mAndroidAnimation) {
    r = Android(); // 执行android字体闪动的图片
    } else {
    r = movie(); // 执行bootanimation.zip中提供的动画图片
   }
 ==> BootAnimation::Android()会加载"images/android-logo-mask.png"和"images/android-logo-shine.png"
 ==> BootAnimation::movie()会加载bootanimation.zip中的内容
 我们下载的源码里默认是没有那些个.zip动画的,所以总会跳到android字体闪动的画面
 所以如果你系那个用.zip的动画那么把你做好的动画拷贝到编译好对应的目录下即可,然后执行make snod整合进img包就可以看到效果了
 如果你想修改android闪动的那两张图片的话,最简单的方法是直接替换图片,如果你懂openGL的话也可以自己做酷炫的动画
 那两张图片放在./frameworks/base/core/res/assets/images  目录下,一张镂空的android图,一张发光效果,动画效果就是下面那张发光的效果图不断左右移动。
 我是用Photoshop直接修改的
 修改完后直接替换,然后再 mmm frameworks/base  , make snod 即可

三、修改开机声音

1、rameworks/base/cmds/bootanimation目录下修改代码
 首先在BootAnimation.h添加方法的声明和头文件的引用
  #include <EGL/egl.h>
  #include <GLES/gl.h>
  //-----add by hslong-----------
  #include <media/AudioSystem.h>
  #include <media/mediaplayer.h>

  class SkBitmap;
 添加方法 void bootMusic();
  class BootAnimation : public Thread, public IBinder::DeathRecipient
  {
  public:
      BootAnimation();
   virtual     ~BootAnimation();

   sp<SurfaceComposerClient> session() const;
   //---------add by hslong---------
   void bootMusic();

  private:
   virtual bool        threadLoop();
   virtual status_t    readyToRun();
   virtual void        onFirstRef();
   virtual void        binderDied(const wp<IBinder>& who);
   ......
  }
2、然后在BootAnimation.cpp中实现这个方法:
 #define SYSTEM_BOOTMUSIC_FILE "/system/media/poweron.wav"
 ......
 namespace android {

 // ---------------------------------------------------------------------------
 //-------add by hslong--------------

 void BootAnimation::bootMusic()
 {
  int index;   

  audio_devices_t device; 

  MediaPlayer* mp = new MediaPlayer();   


  if((access(SYSTEM_BOOTMUSIC_FILE,F_OK))!=-1){   

   printf("access audio\n"); 

   if (mp->setDataSource(SYSTEM_BOOTMUSIC_FILE, NULL) == NO_ERROR) {   

    printf("setDataSource audio\n"); 

    mp->setAudioStreamType(AUDIO_STREAM_ENFORCED_AUDIBLE);   

    mp->prepare(); 

    mp->setLooping(true);   

   }   

   device = AudioSystem::getDevicesForStream(AUDIO_STREAM_ENFORCED_AUDIBLE); 

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

   bool temp = AudioSystem::setStreamVolumeIndex(AUDIO_STREAM_ENFORCED_AUDIBLE, index, device);  

   //printf("index = %d,temp = %d\n", index,temp); 

   temp = AudioSystem::getStreamVolumeIndex(AUDIO_STREAM_ENFORCED_AUDIBLE, &index, device); 

   //printf("index = %d,temp = %d\n", index,temp); 

   if (index != 0){ 

    //printf("index!=0\n"); 

    mp->seekTo(0);  

    mp->start(); 

   }                      

  } 
 } //add end
 ......
 }
3、然后再修改bootanimation_main.cpp这个文件,添加调用
 // create the boot animation object
  sp<BootAnimation> boot = new BootAnimation();
  //------add by hslong---------
  BootAnimation *animation = new BootAnimation();
  animation->bootMusic();
  //----add end

  IPCThreadState::self()->joinThreadPool();
4、修改完这写以后还需要修改Android.mk文件
 
 因为播放声音还需要引入库
 
 LOCAL_SHARED_LIBRARIES := \
  libcutils \
  libutils \
  libbinder \
    libui \
     libskia \
    libEGL \
    libGLESv1_CM \
    libgui \
    libmedia  //---add by hslong----
5、把音频文件poweron.wav放到out/target/product/ut4412/system/media下面

注意:上面只是起到了播放音乐的作用,那么要同步,只需要将代码中的
 mp->start(); 
 移至你需要播放音乐的位置即可。


 

发布了117 篇原创文章 · 获赞 73 · 访问量 42万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 编程工作室 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览