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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 国产安全加固操作系统(安全可靠应用替代)

    据国家信息安全漏洞共享平台(CNVD)统计数据,2016年我国共收录通用软硬件漏洞10822个,漏洞来源涵盖了众多知名的国外厂商。应用软件的不安全性对我国信息技术发展产生了重大威胁,近年来我国频繁发布信息安全相关政策,鼓励安全可靠技术和产业生态发展,以应对这种局面。安可产业要实现技术自主可控,需要在四个层面逐步实现:基础硬件设施,如芯片、服务器、存储、交换机、路由器;底层…

    2022年4月15日
    136
  • JedisConnectionException: java.net.ConnectException: Connection refused[通俗易懂]

    出现问题我遇到的一个问题,在连接redis的时候出现了错误!错误如下:JedisConnectionException: java.net.ConnectException: Connection refused看错误是 连接被拒绝,网上查了报这个错误的相关解决方案,没有一个可以解决的!问题就是上面的报错的问题,先说明一下我出现这个问题的背景或者环境吧。环境说明re…

    2022年2月27日
    50
  • 检查网站有没有被挂马_网站在线挂马检测工具

    检查网站有没有被挂马_网站在线挂马检测工具首先,我们来看看网站被挂马的危害性。网站被挂马后,一方面是系统资源,流量带宽资源的巨大损失,另一方面也成为了传播网页木马的“傀儡帮凶”,严重影响到网站的公众信誉度。很多网页木马都是利益驱动,偷盗各类帐号密码,如电子银行帐户和密码、游戏帐号和密码、邮箱帐户和密码、qq/MSN帐号和密码等;另外,使得客户端被安装恶意插件,强迫浏览黑客指定的网站,或者被利用攻击某个站点等。  我们知道了网站被挂马

    2022年9月27日
    3
  • python删除文件中指定内容

    python删除文件中指定内容lines=[lforlinopen("file.txt","r")ifl.find("20150723",0,8)!=0]fd=open("file.txt","w")fd.writelines(lines)fd.close()开头是20150723的行删除

    2022年5月29日
    41
  • 图像语义分割简介_图像语义分割算法

    图像语义分割简介_图像语义分割算法今天,我们就来谈谈自动驾驶系统中的一项重要核心技术——图像语义分割(Semanticimagesegmentation)。图像语义分割作为计算机视觉(Computervision)中图像理解(Imageunderstanding)的重要一环,不仅在工业界的需求日益凸显,同时语义分割也是当下学术界的研究热点之一。什么是图像语义分割?图像语义分割可以说是

    2022年8月21日
    6
  • mysql 各个版本的驱动 jar 包

    mysql 各个版本的驱动 jar 包http://central.maven.org/maven2/mysql/mysql-connector-java/

    2022年5月21日
    41

发表回复

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

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