diff --git a/app/build.gradle.kts b/app/build.gradle.kts index e9ab1e0..dac8878 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -59,11 +59,10 @@ dependencies { implementation("com.github.bumptech.glide:glide:4.16.0") annotationProcessor("com.github.bumptech.glide:compiler:4.16.0") - implementation("androidx.room:room-runtime:2.6.1") - annotationProcessor("androidx.room:room-compiler:2.6.1") + implementation("androidx.room:room-runtime:2.7.1") + annotationProcessor("androidx.room:room-compiler:2.7.1") implementation("com.squareup.okhttp3:okhttp:4.12.0") implementation("com.google.android.exoplayer:exoplayer:2.19.1") - } \ No newline at end of file diff --git a/app/src/main/java/com/live/dynamicwallpaper/service/LiveWallpaperService.java b/app/src/main/java/com/live/dynamicwallpaper/service/LiveWallpaperService.java index c42696d..f7b0f0a 100644 --- a/app/src/main/java/com/live/dynamicwallpaper/service/LiveWallpaperService.java +++ b/app/src/main/java/com/live/dynamicwallpaper/service/LiveWallpaperService.java @@ -3,12 +3,19 @@ package com.live.dynamicwallpaper.service; import android.content.Context; import android.content.SharedPreferences; import android.net.Uri; +import android.os.Handler; +import android.os.Looper; import android.service.wallpaper.WallpaperService; +import android.util.Log; import android.view.SurfaceHolder; +import android.widget.Toast; + +import androidx.annotation.NonNull; import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.ExoPlayer; import com.google.android.exoplayer2.MediaItem; +import com.google.android.exoplayer2.PlaybackException; import com.google.android.exoplayer2.Player; import com.google.android.exoplayer2.source.MediaSource; import com.google.android.exoplayer2.source.ProgressiveMediaSource; @@ -35,6 +42,16 @@ public class LiveWallpaperService extends WallpaperService { private void setupPlayer() { playerInstance = new ExoPlayer.Builder(LiveWallpaperService.this).build(); playerInstance.setRepeatMode(Player.REPEAT_MODE_ONE); + // 添加播放错误监听器 + playerInstance.addListener(new Player.Listener() { + @Override + public void onPlayerError(@NonNull PlaybackException error) { + Log.e("LiveWallpaperService", "Video playback failed", error); + showErrorPrompt(); + // 停止播放并释放资源 + releasePlayer(); + } + }); configureSource(); } @@ -74,14 +91,26 @@ public class LiveWallpaperService extends WallpaperService { private void configureSource() { Uri videoUri = retrieveVideoUri(LiveWallpaperService.this); - if (videoUri != null && playerInstance != null) { - MediaItem mediaItem = MediaItem.fromUri(videoUri); - MediaSource source = new ProgressiveMediaSource.Factory( - new DefaultDataSource.Factory(LiveWallpaperService.this)) - .createMediaSource(mediaItem); - playerInstance.setMediaSource(source); - playerInstance.prepare(); - playerInstance.setPlayWhenReady(true); + if (videoUri == null) { + Log.w("LiveWallpaperService", "Invalid or missing video URI"); + showErrorPrompt(); + releasePlayer(); + return; + } + if (playerInstance != null) { + try { + MediaItem mediaItem = MediaItem.fromUri(videoUri); + MediaSource source = new ProgressiveMediaSource.Factory( + new DefaultDataSource.Factory(LiveWallpaperService.this)) + .createMediaSource(mediaItem); + playerInstance.setMediaSource(source); + playerInstance.prepare(); + playerInstance.setPlayWhenReady(true); + } catch (Exception e) { + Log.e("LiveWallpaperService", "Failed to configure video source", e); + showErrorPrompt(); + releasePlayer(); + } } } @@ -98,5 +127,13 @@ public class LiveWallpaperService extends WallpaperService { File videoFile = new File(videoPath); return (videoFile.exists() && videoFile.isFile()) ? Uri.fromFile(videoFile) : null; } + + private void showErrorPrompt() { + // 使用 Handler 切换到主线程显示 Toast + new Handler(Looper.getMainLooper()).post(() -> { + Toast.makeText(LiveWallpaperService.this, + "This video cannot be played. Please go back and try again later.", Toast.LENGTH_LONG).show(); + }); + } } } \ No newline at end of file diff --git a/app/src/main/java/com/live/dynamicwallpaper/ui/activity/DynamicActivity.java b/app/src/main/java/com/live/dynamicwallpaper/ui/activity/DynamicActivity.java index cce5d13..4c6957a 100644 --- a/app/src/main/java/com/live/dynamicwallpaper/ui/activity/DynamicActivity.java +++ b/app/src/main/java/com/live/dynamicwallpaper/ui/activity/DynamicActivity.java @@ -11,7 +11,9 @@ import android.widget.Toast; import androidx.activity.EdgeToEdge; import androidx.appcompat.app.AppCompatActivity; +import androidx.core.graphics.Insets; import androidx.core.view.ViewCompat; +import androidx.core.view.WindowInsetsCompat; import androidx.lifecycle.ViewModelProvider; import com.live.dynamicwallpaper.R; @@ -38,6 +40,8 @@ public class DynamicActivity extends AppCompatActivity { setContentView(ui.getRoot()); ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main), (view, insets) -> { + Insets systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars()); + view.setPadding(systemBars.left, 0, systemBars.right, systemBars.bottom); return insets; }); @@ -109,33 +113,58 @@ public class DynamicActivity extends AppCompatActivity { } private void prepareVideoPlayback() { - if (ui != null && contentData.getWallpaperPath() != null) { - File video = new File(contentData.getWallpaperPath()); - if (video.exists()) { + if (ui == null || contentData.getWallpaperPath() == null) { + showErrorPrompt(); + return; + } + File video = new File(contentData.getWallpaperPath()); + if (video.exists()) { + try { ui.videoView.setVideoPath(contentData.getWallpaperPath()); ui.videoView.start(); ui.videoView.setOnPreparedListener(media -> media.setLooping(true)); - } else { - Log.w("LivePreview", "Missing video file: " + contentData.getWallpaperPath()); + } catch (Exception e) { + Log.e("LivePreview", "Video playback failed", e); + showErrorPrompt(); } + } else { + Log.w("LivePreview", "Missing video file: " + contentData.getWallpaperPath()); + showErrorPrompt(); } } private void applyLiveWallpaper() { + String videoPath = contentData.getWallpaperPath(); + if (videoPath == null || !new File(videoPath).exists()) { + showErrorPrompt(); + return; + } SharedPreferences preferences = getSharedPreferences("WallpaperPrefs", MODE_PRIVATE); - preferences.edit().putString("video_path", contentData.getWallpaperPath()).apply(); + preferences.edit().putString("video_path", videoPath).apply(); WallpaperManager manager = WallpaperManager.getInstance(this); try { manager.clear(); - } catch (Exception ignored) { + } catch (Exception e) { + Log.e("LivePreview", "Failed to clear wallpaper", e); } Intent intent = new Intent(WallpaperManager.ACTION_CHANGE_LIVE_WALLPAPER); intent.putExtra(WallpaperManager.EXTRA_LIVE_WALLPAPER_COMPONENT, new ComponentName(this, LiveWallpaperService.class)); - startActivity(intent); - finish(); + try { + startActivity(intent); + finish(); + } catch (Exception e) { + Log.e("LivePreview", "Failed to set wallpaper", e); + showErrorPrompt(); + } + } + + private void showErrorPrompt() { + if (isActive() && ui != null) { + Toast.makeText(this, "Cannot play video. Please try again later.", Toast.LENGTH_LONG).show(); + } } private void observeFavoriteState() { diff --git a/app/src/main/res/layout/activity_dynamic.xml b/app/src/main/res/layout/activity_dynamic.xml index a0f1532..0147291 100644 --- a/app/src/main/res/layout/activity_dynamic.xml +++ b/app/src/main/res/layout/activity_dynamic.xml @@ -23,6 +23,7 @@ android:layout_marginStart="32dp" android:layout_marginTop="32dp" android:src="@drawable/back" + android:background="@drawable/rounded_rectangle_gradient" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> diff --git a/app/text.html b/app/text.html new file mode 100644 index 0000000..17f6275 --- /dev/null +++ b/app/text.html @@ -0,0 +1,28 @@ + + + + + POST 测试表单 + + +

MediaFetcher POST 测试

+
+
+

+ +
+

+ +
+

+ +
+

+ +
+

+ + +
+ + diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index fb4f892..72687bf 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,5 +1,5 @@ [versions] -agp = "8.9.1" +agp = "8.10.0" junit = "4.13.2" junitVersion = "1.2.1" espressoCore = "3.6.1"