Вот мой код:
публичный класс MyWallpaperService расширяет WallpaperService {
Код: Выделить всё
private MediaPlayer mediaPlayer;
@Override
public Engine onCreateEngine() {
return new VideoWallpaperEngine();
}
class VideoWallpaperEngine extends Engine {
@Override
public void onSurfaceCreated(SurfaceHolder holder) {
super.onSurfaceCreated(holder);
if (mediaPlayer == null) {
mediaPlayer = new MediaPlayer();
mediaPlayer.setLooping(true);
try {
String uri = "android.resource://" + getPackageName() + "/" + R.raw.my_test;
mediaPlayer.setDataSource(getApplicationContext(), Uri.parse(uri));
mediaPlayer.prepareAsync();
mediaPlayer.setOnPreparedListener(mp -> {
Log.d("MyWallpaperService", "MediaPlayer is prepared.");
if (holder.getSurface() != null) {
mediaPlayer.setSurface(holder.getSurface());
mediaPlayer.start();
}
});
mediaPlayer.setOnCompletionListener(mp -> {
Log.d("MyWallpaperService", "MediaPlayer completed playing.");
});
mediaPlayer.setOnErrorListener((mp, what, extra) -> {
Log.e("MyWallpaperService", "MediaPlayer error: what=" + what + ", extra=" + extra);
return true;
});
} catch (IOException e) {
Log.e("MyWallpaperService", "Error setting data source", e);
}
} else {
mediaPlayer.setSurface(holder.getSurface());
}
}
@Override
public void onSurfaceDestroyed(SurfaceHolder holder) {
super.onSurfaceDestroyed(holder);
if (mediaPlayer != null) {
mediaPlayer.stop();
mediaPlayer.release();
mediaPlayer = null;
}
}
@Override
public void onSurfaceChanged(SurfaceHolder holder, int format, int width, int height) {
super.onSurfaceChanged(holder, format, width, height);
if (mediaPlayer != null) {
mediaPlayer.setSurface(holder.getSurface());
mediaPlayer.start();
}
}
}
В logcat:
Когда я щелкаю настройку обоев, выдается эта ошибка:
java.lang.IllegalArgumentException : поверхностьТекстура не должна иметь значение null
в android.view.Surface.(Surface.java:372)
в com.example.luming.MyWallpaperService$MyWallpaperEngine.startVideo(MyWallpaperService.java:59)
в com.example.luming.MyWallpaperService$MyWallpaperEngine.onSurfaceCreated(MyWallpaperService.java:44)
в android.service.wallpaper.WallpaperService$Engine.updateSurface(WallpaperService.java:1410)
в android. service.wallpaper.WallpaperService$Engine.attach(WallpaperService.java:1592)
в android.service.wallpaper.WallpaperService$IWallpaperEngineWrapper.doAttachEngine(WallpaperService.java:2627)
в android.service.wallpaper. WallpaperService$IWallpaperEngineWrapper.executeMessage(WallpaperService.java:2666)
на com.android.internal.os.HandlerCaller$MyHandler.handleMessage(HandlerCaller.java:44)
на android.os.Handler.dispatchMessage( Handler.java:107)
в android.os.Looper.loopOnce(Looper.java:232)
в android.os.Looper.loop(Looper.java:317)
в android .app.ActivityThread.main(ActivityThread.java:8705)
в java.lang.reflect.Method.invoke(собственный метод)
в com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run( RuntimeInit.java:580)
на com.android.internal.os.ZygoteInit.main(ZygoteInit.java:886)
Я хочу, чтобы видеофайл mp4 можно было успешно воспроизвести как обои, в виде петли. Заранее спасибо!
Подробнее здесь: https://stackoverflow.com/questions/791 ... -wallpaper
Мобильная версия