如何测试:安装该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'