Android 12 內(nèi)置系統(tǒng)默認(rèn)動(dòng)態(tài)壁紙(視頻資源)實(shí)現(xiàn)

1、動(dòng)態(tài)壁紙的實(shí)現(xiàn)


  • 新建APP 項(xiàng)目 實(shí)現(xiàn) WallpaperService
/**
 * 實(shí)現(xiàn)系統(tǒng)
*/
public class MagicWallpaper extends WallpaperService {

    public final String TAG = this.getClass().getSimpleName();

    @Override
    public Engine onCreateEngine() {
        Log.d(TAG, "->:onCreateEngine()");
        // 1: 這里返回實(shí)現(xiàn)的動(dòng)畫引擎
        return new VideoEngine();
    }
}
  • 實(shí)現(xiàn)視頻播放的引擎
class VideoEngine extends Engine {

        private MediaPlayer mp;

        public VideoEngine() {
            super();
        }

        @Override
        public void onCreate(SurfaceHolder surfaceHolder) {
            super.onCreate(surfaceHolder);
            // Engine對(duì)象被創(chuàng)建時(shí)回調(diào),這里可以做一些初始化的工作(例如 注冊(cè)廣播)
            Log.d(TAG, "->:VideoEngine -- onCreate()");
            
            //  這里加載本地視頻資源,初始化播放器
            mp = MediaPlayer.create(getApplicationContext(), R.raw.magic);
            mp.setLooping(true); // 循環(huán)播放
            mp.setVolume(0.0f, 0.0f);// 靜音
        }

        @Override
        public void onDestroy() {
            super.onDestroy();
            //Engine對(duì)象被銷毀時(shí)回調(diào),這里可以做一些回收釋放的操作(例如 注銷廣播)
            Log.d(TAG, "->:VideoEngine -- onDestroy()");
        }

        @Override
        public void onVisibilityChanged(boolean visible) {
            super.onVisibilityChanged(visible);
            //顯示、隱藏時(shí)切換,在桌面時(shí)為顯示,跳轉(zhuǎn)到別的App頁(yè)面時(shí)為隱藏 :這里做視頻的暫停和恢復(fù)播放
            Log.d(TAG, "->:VideoEngine -- onVisibilityChanged() visible:" + visible);
            if (mp != null) {
                if (visible) {
                    mp.start();
                    Log.d(TAG, "->:VideoEngine -- onVisibilityChanged() mp->start");
                } else {
                    mp.pause();
                    Log.d(TAG, "->:VideoEngine -- onVisibilityChanged() mp->pause");
                }
            }
        }

        @Override
        public void onSurfaceCreated(SurfaceHolder holder) {
            super.onSurfaceCreated(holder);
            //SurfaceView創(chuàng)建時(shí)回調(diào),視頻MediaPlayer對(duì)象播放的視頻輸出在這個(gè)surface上
            Log.d(TAG, "->:VideoEngine -- onSurfaceCreated()");
            mp.setSurface(holder.getSurface());
            mp.start();
            Log.d(TAG, "->:VideoEngine -- onSurfaceCreated() start!");
        }

        @Override
        public void onSurfaceDestroyed(SurfaceHolder holder) {
            super.onSurfaceDestroyed(holder);
            //Surface銷毀時(shí)回調(diào),這里銷毀MediaPlayer,回收MediaPlayer
            if (mp != null) {
                Log.d(TAG, "->:VideoEngine -- onSurfaceDestroyed()");
                mp.stop();
                mp.release();
                mp = null;
            }
        }
    }
  • AndroidManifest.xml 里注冊(cè)服務(wù)
        <service android:name="com.hct.magicwallpaper.MagicWallpaper"
            android:label="@string/wallpaper_label"
            android:permission="android.permission.BIND_WALLPAPER"
            android:exported="true">
            <intent-filter>
                <action android:name="android.service.wallpaper.WallpaperService" />
            </intent-filter>
            <meta-data android:name="android.service.wallpaper" android:resource="@xml/magic" />
        </service>

其中的 <intent-filter> 、<action> 、<meta-data> 都是固定寫法,用于系統(tǒng)識(shí)別,我們需要配置的是 后面的 android:resource="@xml/magic"

  • 資源配置

@xml/magic
res目錄下,新建xml文件夾 然后新建 xxxx.xml(如本例:magic.xml)

<?xml version ="1.0" encoding ="utf-8"?>

<wallpaper xmlns:android="http://schemas.android.com/apk/res/android"
    android:thumbnail="@drawable/magic_thumbnail"
    android:author="@string/author"/>

VideoEngine 里 的視頻資源 R.raw.magic
res目錄下,新建raw文件夾 然后拷貝進(jìn)來視屏素材(如本例:magic.mp4)

ps: 視頻資源放在本地,放在 res/raw 目錄下,然后 R.raw.xxx.mp4 調(diào)用即可

@drawable/magic_thumbnail
在drawable目錄下放一張動(dòng)態(tài)桌面的縮略圖,主要是用來,系統(tǒng)瀏覽動(dòng)態(tài)桌面展示資源列表的一個(gè)縮略圖

以上步驟基本就是一個(gè)動(dòng)態(tài)視屏桌面的核心功能了,即完成了一個(gè)視頻資源的動(dòng)態(tài)壁紙,然后安裝app ,即可在系統(tǒng)動(dòng)態(tài)壁紙里看到自己的項(xiàng)目。


2、系統(tǒng)內(nèi)置


  • 在主干目錄 package/wallpapers/下新建項(xiàng)目 MagicWallpaper

  • 拷貝前面做的app的 res 和 src 目錄到MagicWallpaper里

    注意:src 只包含包名部分的路徑,即src/com/xxx/xxx 這樣子,不要main/java 這兩層

  • 將AndroidManifest.xml 拷貝到文件根目錄,添加

    <uses-feature android:name="android.software.live_wallpaper"/>

  • 編寫Android.mk腳本

LOCAL_PATH := $(call my-dir)

# Standalone Wallpaper picker app
# ========================================================
include $(CLEAR_VARS)
LOCAL_MODULE_TAGS := optional
LOCAL_SRC_FILES := $(call all-subdir-java-files) $(call all-renderscript-files-under, src)
LOCAL_CERTIFICATE := shared
LOCAL_PACKAGE_NAME := MagicWallpaper
LOCAL_SDK_VERSION := current 
# LOCAL_PRIVATE_PLATFORM_APIS與LOCAL_SDK_VERSION 二選一配置
#LOCAL_PRIVATE_PLATFORM_APIS := true   
include $(BUILD_PACKAGE)
  • 最后如果系統(tǒng)有配置這個(gè)路徑源碼的編譯,把這里新建的墻紙加入
    例如我這邊是

.../devices/mediatek/system/common/devices.mk 目錄下腳本控制項(xiàng)目是否參與編譯

ifeq ($(strip $(MSSI_MTK_LIVEWALLPAPER_APP)), yes)
  PRODUCT_PACKAGES += LiveWallpapersPicker
 # 這里加上自己的項(xiàng)目,就可以參與編譯
  PRODUCT_PACKAGES += MagicWallpaper
endif
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容