Android 继承DreamService自定义屏保播放视频

144 阅读1分钟

如何测试:安装该apk后,需要到设置中开启屏保,并选择该自定义的屏保,设置休眠时间15秒,熄屏后即可测试

1.新建java文件,VideoDreamService ,这里的setInteractive(true)设置为true 使得可交互式,不会一碰屏幕就退出,在dispatchTouchEvent处监听返回事件再退出

import android.graphics.SurfaceTexture;
import android.net.Uri;
import android.service.dreams.DreamService;
import android.view.KeyEvent;
import android.view.MotionEvent;
import android.view.TextureView;

import com.google.android.exoplayer2.MediaItem;
import com.google.android.exoplayer2.Player;
import com.google.android.exoplayer2.SimpleExoPlayer;

public class VideoDreamService extends DreamService {

    private TextureView textureView;
    private SimpleExoPlayer player;

    @Override
    public void onAttachedToWindow() {
        super.onAttachedToWindow();
        setInteractive(true);
        setFullscreen(true);
        setContentView(R.layout.dream_layout);
        textureView = findViewById(R.id.texture_view);
        
        // 初始化播放器
        player = new SimpleExoPlayer.Builder(this).build();
        textureView.setSurfaceTextureListener(new TextureView.SurfaceTextureListener() {
            @Override
            public void onSurfaceTextureAvailable(SurfaceTexture surface, int width, int height) {
                player.setVideoTextureView(textureView);
                prepareAndPlayVideo(Uri.parse("android.resource://" + getPackageName() + "/" + R.raw.oceans));
            }

            @Override
            public void onSurfaceTextureSizeChanged(SurfaceTexture surface, int width, int height) {}

            @Override
            public boolean onSurfaceTextureDestroyed(SurfaceTexture surface) {
                player.stop();
                player.release();
                return true;
            }

            @Override
            public void onSurfaceTextureUpdated(SurfaceTexture surface) {}
        });

        player.setRepeatMode(Player.REPEAT_MODE_ONE);
    }

    private void prepareAndPlayVideo(Uri videoUri) {
        MediaItem mediaItem = MediaItem.fromUri(videoUri);
        player.setMediaItem(mediaItem);
        player.prepare();
        player.play();
    }

    @Override
    public void onDetachedFromWindow() {
        super.onDetachedFromWindow();
        if (player != null) {
            player.release();
            player = null;
        }
    }

    @Override
    public boolean dispatchTouchEvent(MotionEvent event) {
        int action = event.getAction();
        if (action == KeyEvent.KEYCODE_BACK  || action == MotionEvent.BUTTON_BACK) {
            wakeUp();
            return true;
        }
        return super.dispatchTouchEvent(event);
    }
}

2.在AndroidManifest.xml文件中声明该服务,my_dream其实就是设置这个屏保时的页面

<service
    android:name=".VideoDreamService"
    android:exported="true"
    android:icon="@drawable/aaa"
    android:label="@string/app_name"
    android:permission="android.permission.BIND_DREAM_SERVICE">
    <intent-filter>
        <action android:name="android.service.dreams.DreamService" />
        <category android:name="android.intent.category.DEFAULT" />
    </intent-filter>
    <meta-data
        android:name="android.service.dream"
        android:resource="@xml/my_dream" />
</service>

3.在res/xml 文件夹中新建my_dream.xml

<?xml version="1.0" encoding="utf-8"?>
<dream xmlns:android="http://schemas.android.com/apk/res/android"
    android:settingsActivity="com.xxx.myapplication/.MainActivity2" />

4.对于视频播放,直接将附带build.gradle依赖配置如下:

implementation 'com.google.android.exoplayer:exoplayer:2.18.0'