Android4.2.2启动动画前播放视频

Android4.2.2启动动画前播放视频

首先声明測试平台为瑞芯微的rk3168,Android4.2.2,Android版本号非常重要,由于Android4.0和Android4.2.2的代码有些地方就有差别,并不通用!


首先接到任务不知怎样下手,由于我了解中Android启动时没有出现过播放视频的,特别是在启动动画之前,Linux企鹅之后,而动画也是一幅幅的图片,根本不是啥视频如mp4,3gp等!

由于启动动画时能够播放声音,并且上层应用的mediaplayer也能够播放声音,结合surface能够播放视频!这就是入口点~

动画播放的关键文件在:Z:\Backup\rk3168_v4.2\frameworks\base\cmds\bootanimation下!

1、了解Android显示开机画面的原理!

1. Linux 系统启动,出现Linux小企鹅画面(reboot)(Android 1.5及以上版本号已经取消载入图片);
2. Android平台启动初始化,出现”A N D R I O D”文字字样画面;
3. Android平台图形系统启动,出现含闪动的ANDROID字样的动绘图片(start)。

4、原理參考资料:

http://blog.csdn.net/luoshengyang/article/details/7691321

http://blog.csdn.net/conowen/article/details/7884009

http://www.cnblogs.com/jqyp/archive/2012/03/07/2383973.html

http://blog.csdn.net/backgarden_straw/article/details/8571992

http://www.eoeandroid.com/thread-114742-1-1.html


1、播放音乐:

在瑞芯微提供的源代码中事实上能够支持播放音乐了,仅仅是没有提供音乐文件!声音移植

a、首先在BootAnimation.h加入方法的声明和头文件的引用

1
2
#include <media/AudioSystem.h>
#include <media/mediaplayer.h>

b、在 class BootAnimation : public Thread, public IBinder::DeathRecipient中

加入方法 void playMusic();

c、然后在BootAnimation.cpp中实现这种方法:

#define BOOTMUSIC_FILE “/system/media/audio/alarms/gx.mp4”

void BootAnimation::playMusic()
{
    sp<MediaPlayer> mp = new MediaPlayer();
    if ((0 == access(BOOTMUSIC_FILE, F_OK)) && mp != NULL) {
        mp->setDataSource(BOOTMUSIC_FILE, NULL) //设置资源
        mp->prepare();                                                                 //准备,同步
        mp->start();                                                                      //播放
    }                                                                                           //事实上mediaplayer还有

非常多方法,能够查看mediaplayer类
}

d、调用并启动声音

bool BootAnimation::threadLoop()

{
    bool r;

playMusic()
    if (mAndroidAnimation) {
        r = android();
    } else {
        r = movie();
    }

…….

}

e、Android.mk的改动

由于播放声音还须要引入库

LOCAL_SHARED_LIBRARIES := \
libcutils \
libandroidfw \
libutils \
libbinder \
    libui \
libskia \
    libEGL \
    libGLESv1_CM \
    libmedia \
    libgui

请注意,libmedia是新加入的;

f、声音文件的加入

源代码文件夹在声音在:

Z:\source\rk3168_v4.2\frameworks\base\data\sounds

视频在:

Z:\source\rk3168_v4.2\frameworks\base\data\videos

至于编译完毕后放到什么地方了那是AllAudio.mk文件上配置的

$(LOCAL_PATH)/XXXX.mp3:system/etc/xxxx.mp3 \

g、将音频放到此文件夹编译,就有开机声音了!

2、视频移植

a、事实上看了前面的资料了解动画的启动过程和对上层应用播放视频的方法事实上非常easy了!

事实上动画的播放也是用surface来展示的,然后用OpenGL将图片绘制上去的!

联系上层应用播放视频的步骤(mediaplayer+surfaceview):

player=new MediaPlayer();player.setAudioStreamType(AudioManager.STREAM_MUSIC);player.setDisplay(surfaceHolder);
player.setDataSource("/sdcard/gx.mp4");player.prepare();
player.start();

。。。。。。。 所以假设你做了声音播放后是不是非常自然想到,就差
player.setDisplay(surfaceHolder);

既然如此就倒推这方法做了什么:

由于setdisplay是mediaplayer的方法

base\media\java\android\media\mediaplayer.Java—>

 public void setDisplay(SurfaceHolder sh) {
        mSurfaceHolder = sh;
        Surface surface;
        if (sh != null) {
            surface = sh.getSurface();
        } else {
            surface = null;
        }
        _setVideoSurface(surface);//重点设置一个surface
        updateSurfaceScreenOn();
    }

private native void _setVideoSurface(Surface surface); //本地方法


base\media\jni\android_media_MediaPlayer.cpp ----->
{"_setVideoSurface",    "(Landroid/view/Surface;)V",        (void *)android_media_MediaPlayer_setVideoSurface},

---->android_media_MediaPlayer_setVideoSurface(JNIEnv *env, jobject thiz, jobject jsurface)
{
    setVideoSurface(env, thiz, jsurface, true /* mediaPlayerMustBeAlive */);
}

------------>
static void
setVideoSurface(JNIEnv *env, jobject thiz, jobject jsurface, jboolean mediaPlayerMustBeAlive)
{
    sp<MediaPlayer> mp = getMediaPlayer(env, thiz);
    if (mp == NULL) {
        if (mediaPlayerMustBeAlive) {
            jniThrowException(env, "java/lang/IllegalStateException", NULL);
        }
        return;
    }


    decVideoSurfaceRef(env, thiz);


    sp<ISurfaceTexture> new_st;
    if (jsurface) {
        sp<Surface> surface(android_view_Surface_getSurface(env, jsurface));
        if (surface != NULL) {
            new_st = surface->getSurfaceTexture();
            if (new_st == NULL) {
                jniThrowException(env, "java/lang/IllegalArgumentException",
                    "The surface does not have a binding SurfaceTexture!");
                return;
            }
            new_st->incStrong(thiz);
        } else {
            jniThrowException(env, "java/lang/IllegalArgumentException",
                    "The surface has been released");
            return;
        }
    }


    env->SetIntField(thiz, fields.surface_texture, (int)new_st.get());


    // This will fail if the media player has not been initialized yet. This
    // can be the case if setDisplay() on MediaPlayer.java has been called
    // before setDataSource(). The redundant call to setVideoSurfaceTexture()
    // in prepare/prepareAsync covers for this case.
    mp->setVideoSurfaceTexture(new_st);                //重点
}
分析到这里我们心里基本有数了,就是要活的一个surface就可以!

b、分析动画中surface 的构建过程:
在base\cmds\bootanimation\BootAnimation.cpp的status_t BootAnimation::readyToRun()中有对surface的初始化,到了就完毕了大半获取这个surface在调用上面的方法就大功告成!



版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/119253.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 机器学习之类别性特征

    类别型特征原始输入通常是字符串形式,除了决策树等少数模型能直接处理字符串形式的输入,对于逻辑回归、支持向量机等模型来说,类别型特征必须经过处理转换成数值型。Sklearn中提供了几个转换器来处理文本属

    2021年12月30日
    53
  • 神经网络轴承故障诊断_一维卷积神经网络详解

    神经网络轴承故障诊断_一维卷积神经网络详解基于一维卷积神经网络的滚动轴承故障识别提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录基于一维卷积神经网络的滚动轴承故障识别一、数据预处理二、模型搭建三、使用步骤1.引入库2.读入数据总结一、数据预处理采用美国凯斯西储大学(CWRU)的开放轴承数据库的样本进行实验分析,轴承故障产生的实验台如下图所示。使用电火花加工技术分别在轴承的内圈、外圈和滚动体上引入单点缺陷,故障尺寸分别为7、14和21in,以48kHz采样频率采集不同负载下的故障轴承振动数据用于实验分析。

    2022年9月15日
    5
  • gcc编译器参数_gcc for c4droid

    gcc编译器参数_gcc for c4droid【转载】gcc使用中常用的参数及命令 本文转载自:http://www.cnblogs.com/yaozhongxiao/archive/2012/03/16/2400473.html如需转载,请注明原始出处。谢谢。—————————————————————-…

    2022年10月13日
    7
  • Python体系练手项目200例(附源代码),练完可显著提升python水平(鲲鹏编程–Python教育新物种)

    个人公众号yk坤帝后台回复项目一获取整理资源1.十转二2.十转八3十转十六4.字符串转字节5.转为字符串6.十转ASCII7.ASCII转十8.转为字典9.转为浮点类型10.转为整型11.转为集合12.转为切片13.转元组14.转冻结集合15.商和余数16.幂和余17.四舍五入19.门牌号18查看变量所占字节数20.排序函数21.求和函数22.计算表达式23.真假24.都为真25.至少一个为真26.获取用户输入27.print用法

    2022年4月5日
    51
  • Java入门第100课——Calendar的getInstance方法

    不知不觉到第100课了,码字真的累,写完后还要反复检查是否有笔误,以免对大家造成困扰。后面还有好多课时,真的是从零基础开始,一直到框架。不知能不能坚持写完,关注的人越多更的越快。最近更的比较快是因为有存货,存货还能撑50课的样子。一天不吃不喝最多也就写10个课时。有点啰嗦了,有什么想法给我留言吧。问题Calendar类是一个抽象类,它为特定瞬间与一组诸如YE…

    2022年4月14日
    111
  • JSP的四种作用域与九大内置对象

    JSP的四种作用域与九大内置对象JSP的四种作用域与九大内置对象

    2022年4月22日
    38

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号