diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 61f725f..46d25f0 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -26,10 +26,10 @@ android:name=".ui.activity.PlayActivity" android:exported="false" /> diff --git a/app/src/main/assets/Sound of instrument data/Big Ben.mp3 b/app/src/main/assets/Sound of instrument data/Big Ben.mp3 new file mode 100644 index 0000000..28fe426 Binary files /dev/null and b/app/src/main/assets/Sound of instrument data/Big Ben.mp3 differ diff --git a/app/src/main/assets/Sound of instrument data/Guitar sound.mp3 b/app/src/main/assets/Sound of instrument data/Guitar sound.mp3 new file mode 100644 index 0000000..eb73026 Binary files /dev/null and b/app/src/main/assets/Sound of instrument data/Guitar sound.mp3 differ diff --git a/app/src/main/assets/Sound of instrument data/Piano.mp3 b/app/src/main/assets/Sound of instrument data/Piano.mp3 new file mode 100644 index 0000000..907823a Binary files /dev/null and b/app/src/main/assets/Sound of instrument data/Piano.mp3 differ diff --git a/app/src/main/assets/Sound of instrument data/The sound of mixing cup.mp3 b/app/src/main/assets/Sound of instrument data/The sound of mixing cup.mp3 new file mode 100644 index 0000000..0af9b46 Binary files /dev/null and b/app/src/main/assets/Sound of instrument data/The sound of mixing cup.mp3 differ diff --git a/app/src/main/assets/Sound of instrument/Big Ben.jpg b/app/src/main/assets/Sound of instrument/Big Ben.jpg new file mode 100644 index 0000000..90fd49d Binary files /dev/null and b/app/src/main/assets/Sound of instrument/Big Ben.jpg differ diff --git a/app/src/main/assets/Sound of instrument/Guitar sound.jpg b/app/src/main/assets/Sound of instrument/Guitar sound.jpg new file mode 100644 index 0000000..be1088d Binary files /dev/null and b/app/src/main/assets/Sound of instrument/Guitar sound.jpg differ diff --git a/app/src/main/assets/Sound of instrument/Piano.png b/app/src/main/assets/Sound of instrument/Piano.png new file mode 100644 index 0000000..6a52892 Binary files /dev/null and b/app/src/main/assets/Sound of instrument/Piano.png differ diff --git a/app/src/main/assets/Sound of instrument/The sound of mixing cup.png b/app/src/main/assets/Sound of instrument/The sound of mixing cup.png new file mode 100644 index 0000000..bc61963 Binary files /dev/null and b/app/src/main/assets/Sound of instrument/The sound of mixing cup.png differ diff --git a/app/src/main/assets/Voice of Nature data/Flowing water.mp3 b/app/src/main/assets/Voice of Nature data/Flowing water.mp3 new file mode 100644 index 0000000..4e9585d Binary files /dev/null and b/app/src/main/assets/Voice of Nature data/Flowing water.mp3 differ diff --git a/app/src/main/assets/Voice of Nature data/High -speed stream.mp3 b/app/src/main/assets/Voice of Nature data/High -speed stream.mp3 new file mode 100644 index 0000000..df354c1 Binary files /dev/null and b/app/src/main/assets/Voice of Nature data/High -speed stream.mp3 differ diff --git a/app/src/main/assets/Voice of Nature data/Hundred Birds Calling.mp3 b/app/src/main/assets/Voice of Nature data/Hundred Birds Calling.mp3 new file mode 100644 index 0000000..8b0650c Binary files /dev/null and b/app/src/main/assets/Voice of Nature data/Hundred Birds Calling.mp3 differ diff --git a/app/src/main/assets/Voice of Nature data/Rain falls in the leaves.mp3 b/app/src/main/assets/Voice of Nature data/Rain falls in the leaves.mp3 new file mode 100644 index 0000000..93eca42 Binary files /dev/null and b/app/src/main/assets/Voice of Nature data/Rain falls in the leaves.mp3 differ diff --git a/app/src/main/assets/Voice of Nature data/Wind blow.mp3 b/app/src/main/assets/Voice of Nature data/Wind blow.mp3 new file mode 100644 index 0000000..305e67e Binary files /dev/null and b/app/src/main/assets/Voice of Nature data/Wind blow.mp3 differ diff --git a/app/src/main/assets/Voice of Nature/Flowing water.jpg b/app/src/main/assets/Voice of Nature/Flowing water.jpg new file mode 100644 index 0000000..4a88937 Binary files /dev/null and b/app/src/main/assets/Voice of Nature/Flowing water.jpg differ diff --git a/app/src/main/assets/Voice of Nature/High -speed stream.jpg b/app/src/main/assets/Voice of Nature/High -speed stream.jpg new file mode 100644 index 0000000..cf47bd2 Binary files /dev/null and b/app/src/main/assets/Voice of Nature/High -speed stream.jpg differ diff --git a/app/src/main/assets/Voice of Nature/Hundred Birds Calling.png b/app/src/main/assets/Voice of Nature/Hundred Birds Calling.png new file mode 100644 index 0000000..b262bb6 Binary files /dev/null and b/app/src/main/assets/Voice of Nature/Hundred Birds Calling.png differ diff --git a/app/src/main/assets/Voice of Nature/Rain falls in the leaves.png b/app/src/main/assets/Voice of Nature/Rain falls in the leaves.png new file mode 100644 index 0000000..f0699dc Binary files /dev/null and b/app/src/main/assets/Voice of Nature/Rain falls in the leaves.png differ diff --git a/app/src/main/assets/Voice of Nature/Wind blow.jpg b/app/src/main/assets/Voice of Nature/Wind blow.jpg new file mode 100644 index 0000000..ab123d3 Binary files /dev/null and b/app/src/main/assets/Voice of Nature/Wind blow.jpg differ diff --git a/app/src/main/assets/White noise data/High -speed car.mp3 b/app/src/main/assets/White noise data/High -speed car.mp3 new file mode 100644 index 0000000..1aafa72 Binary files /dev/null and b/app/src/main/assets/White noise data/High -speed car.mp3 differ diff --git a/app/src/main/assets/White noise data/High -voltage wire.mp3 b/app/src/main/assets/White noise data/High -voltage wire.mp3 new file mode 100644 index 0000000..e53ed7a Binary files /dev/null and b/app/src/main/assets/White noise data/High -voltage wire.mp3 differ diff --git a/app/src/main/assets/White noise data/Mechanical failure.mp3 b/app/src/main/assets/White noise data/Mechanical failure.mp3 new file mode 100644 index 0000000..c287e26 Binary files /dev/null and b/app/src/main/assets/White noise data/Mechanical failure.mp3 differ diff --git a/app/src/main/assets/White noise data/Rhythm.mp3 b/app/src/main/assets/White noise data/Rhythm.mp3 new file mode 100644 index 0000000..6a6c371 Binary files /dev/null and b/app/src/main/assets/White noise data/Rhythm.mp3 differ diff --git a/app/src/main/assets/White noise/High -speed car.png b/app/src/main/assets/White noise/High -speed car.png new file mode 100644 index 0000000..c727b27 Binary files /dev/null and b/app/src/main/assets/White noise/High -speed car.png differ diff --git a/app/src/main/assets/White noise/High -voltage wire.jpg b/app/src/main/assets/White noise/High -voltage wire.jpg new file mode 100644 index 0000000..597a474 Binary files /dev/null and b/app/src/main/assets/White noise/High -voltage wire.jpg differ diff --git a/app/src/main/assets/White noise/Mechanical failure.png b/app/src/main/assets/White noise/Mechanical failure.png new file mode 100644 index 0000000..be569d1 Binary files /dev/null and b/app/src/main/assets/White noise/Mechanical failure.png differ diff --git a/app/src/main/assets/White noise/Rhythm.jpg b/app/src/main/assets/White noise/Rhythm.jpg new file mode 100644 index 0000000..aceddff Binary files /dev/null and b/app/src/main/assets/White noise/Rhythm.jpg differ diff --git a/app/src/main/assets/resources.json b/app/src/main/assets/resources.json new file mode 100644 index 0000000..8b950c5 --- /dev/null +++ b/app/src/main/assets/resources.json @@ -0,0 +1,84 @@ +{ + "categories": [ + { + "name": "Sound of instrument", + "audios": [ + { + "name": "Big Ben", + "file": "Sound of instrument data/Big Ben.mp3", + "image": "Sound of instrument/Big Ben.jpg" + }, + { + "name": "Guitar sound", + "file": "Sound of instrument data/Guitar sound.mp3", + "image": "Sound of instrument/Guitar sound.jpg" + }, + { + "name": "Piano", + "file": "Sound of instrument data/Piano.mp3", + "image": "Sound of instrument/Piano.png" + }, + { + "name": "Mixing cup", + "file": "Sound of instrument data/The sound of mixing cup.mp3", + "image": "Sound of instrument/The sound of mixing cup.png" + } + ] + }, + { + "name": "White noise", + "audios": [ + { + "name": "High -speed car", + "file": "White noise data/High -speed car.mp3", + "image": "White noise/High -speed car.png" + }, + { + "name": "High -voltage wire", + "file": "White noise data/High -voltage wire.mp3", + "image": "White noise/High -voltage wire.jpg" + }, + { + "name": "Mechanical failure", + "file": "White noise data/Mechanical failure.mp3", + "image": "White noise/Mechanical failure.png" + }, + { + "name": "Rhythm", + "file": "White noise data/Rhythm.mp3", + "image": "White noise/Rhythm.jpg" + } + ] + }, + { + "name": "Voice of Nature", + "audios": [ + { + "name": "Flowing water", + "file": "Voice of Nature data/Flowing water.mp3", + "image": "Voice of Nature/Flowing water.jpg" + }, + { + "name": "High -speed stream", + "file": "Voice of Nature data/High -speed stream.mp3", + "image": "Voice of Nature/High -speed stream.jpg" + }, + { + "name": "Hundred Birds Calling", + "file": "Voice of Nature data/Hundred Birds Calling.mp3", + "image": "Voice of Nature/Hundred Birds Calling.png" + }, + { + "name": "Rain falls in the leaves", + "file": "Voice of Nature data/Rain falls in the leaves.mp3", + "image": "Voice of Nature/Rain falls in the leaves.png" + }, + { + "name": "Wind blow", + "file": "Voice of Nature data/Wind blow.mp3", + "image": "Voice of Nature/Wind blow.jpg" + } + ] + } + ] +} \ No newline at end of file diff --git a/app/src/main/java/com/hi/music/player/adapter/A_InstrumentAdapter.java b/app/src/main/java/com/hi/music/player/adapter/A_InstrumentAdapter.java new file mode 100644 index 0000000..8ff0434 --- /dev/null +++ b/app/src/main/java/com/hi/music/player/adapter/A_InstrumentAdapter.java @@ -0,0 +1,77 @@ +package com.hi.music.player.adapter; + +import android.content.Context; +import android.util.Log; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ImageView; + +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.DiffUtil; +import androidx.recyclerview.widget.RecyclerView; + +import com.bumptech.glide.Glide; // 确保你添加了 Glide 依赖 +import com.hi.music.player.R; +import com.hi.music.player.helper.AudioItemDiffCallback; +import com.hi.music.player.javabean.A_data.AudioItem; + +import java.util.ArrayList; +import java.util.List; + +public class A_InstrumentAdapter extends RecyclerView.Adapter { + + private Context context; + private List audioItems = new ArrayList<>(); + + // 构造函数 + public A_InstrumentAdapter(Context context) { + this.context = context; + } + + @NonNull + @Override + public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + View view = LayoutInflater.from(context).inflate(R.layout.item_a_home_1, parent, false); + return new ViewHolder(view); + } + + @Override + public void onBindViewHolder(@NonNull ViewHolder holder, int position) { + AudioItem audioItem = audioItems.get(position); + + Log.d("------","--------"+audioItem.getImage()); + + + // 加载图片,确保不使用 file:// 前缀,并将路径传递给 Glide + Glide.with(context) + .load("file:///android_asset/" + audioItem.getImage()) // 正确的路径 + .into(holder.imageView); + + // 设置其他数据(如音频名称、描述等)如果有的话 + } + + @Override + public int getItemCount() { + return audioItems.size(); // 返回实际的项目数量 + } + + public void updateData(List newAudioItems) { + DiffUtil.DiffResult diffResult = DiffUtil.calculateDiff(new AudioItemDiffCallback(this.audioItems, newAudioItems)); + + this.audioItems.clear(); + this.audioItems.addAll(newAudioItems); + diffResult.dispatchUpdatesTo(this); // 只更新发生变化的部分 + } + + + public static class ViewHolder extends RecyclerView.ViewHolder { + + private ImageView imageView; + + public ViewHolder(@NonNull View itemView) { + super(itemView); + imageView = itemView.findViewById(R.id.background_image); + } + } +} diff --git a/app/src/main/java/com/hi/music/player/adapter/A_NatureAdapter.java b/app/src/main/java/com/hi/music/player/adapter/A_NatureAdapter.java new file mode 100644 index 0000000..96385fa --- /dev/null +++ b/app/src/main/java/com/hi/music/player/adapter/A_NatureAdapter.java @@ -0,0 +1,75 @@ +package com.hi.music.player.adapter; + +import android.content.Context; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ImageView; + +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.DiffUtil; +import androidx.recyclerview.widget.RecyclerView; + +import com.bumptech.glide.Glide; +import com.hi.music.player.R; +import com.hi.music.player.helper.AudioItemDiffCallback; +import com.hi.music.player.javabean.A_data.AudioItem; + +import java.util.ArrayList; +import java.util.List; + +public class A_NatureAdapter extends RecyclerView.Adapter { + + private Context context; + private List audioItems = new ArrayList<>(); + + public A_NatureAdapter(Context context) { + this.context = context; + } + + @NonNull + @Override + public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + return new ViewHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.item_a_home_3, parent, false)); + } + + @Override + public void onBindViewHolder(@NonNull ViewHolder holder, int position) { + + AudioItem audioItem = audioItems.get(position); + + Glide.with(context) + .load("file:///android_asset/" + audioItem.getImage()) + .into(holder.imageView); + + + } + + @Override + public int getItemCount() { + return audioItems.size(); + } + + public void updateData(List newAudioItems) { + DiffUtil.DiffResult diffResult = DiffUtil.calculateDiff(new AudioItemDiffCallback(this.audioItems, newAudioItems)); + + this.audioItems.clear(); + this.audioItems.addAll(newAudioItems); + diffResult.dispatchUpdatesTo(this); // 只更新发生变化的部分 + } + + + + public static class ViewHolder extends RecyclerView.ViewHolder { + + private ImageView imageView; + + public ViewHolder(@NonNull View itemView) { + super(itemView); + + imageView = itemView.findViewById(R.id.cover); + + } + } + +} diff --git a/app/src/main/java/com/hi/music/player/adapter/A_WhiteAdapter.java b/app/src/main/java/com/hi/music/player/adapter/A_WhiteAdapter.java new file mode 100644 index 0000000..8be0d70 --- /dev/null +++ b/app/src/main/java/com/hi/music/player/adapter/A_WhiteAdapter.java @@ -0,0 +1,82 @@ +package com.hi.music.player.adapter; + +import android.content.Context; +import android.util.Log; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ImageView; + +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.DiffUtil; +import androidx.recyclerview.widget.RecyclerView; + +import com.bumptech.glide.Glide; +import com.hi.music.player.R; +import com.hi.music.player.helper.AudioItemDiffCallback; +import com.hi.music.player.javabean.A_data.AudioItem; + +import java.util.ArrayList; +import java.util.List; + +public class A_WhiteAdapter extends RecyclerView.Adapter { + + private Context context; + private List audioItems = new ArrayList<>(); + + public A_WhiteAdapter(Context context) { + this.context = context; + } + + @NonNull + @Override + public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + return new ViewHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.item_a_home_2, parent, false)); + } + + @Override + public void onBindViewHolder(@NonNull ViewHolder holder, int position) { + + AudioItem audioItem = audioItems.get(position); + + Log.d("------","--------"+audioItem.getImage()); + + + // 加载图片,确保不使用 file:// 前缀,并将路径传递给 Glide + Glide.with(context) + .load("file:///android_asset/" + audioItem.getImage()) // 正确的路径 + .into(holder.imageView); + + // 设置其他数据(如音频名称、描述等)如果有的话 + + } + + @Override + public int getItemCount() { + return audioItems.size(); + } + + public void updateData(List newAudioItems) { + DiffUtil.DiffResult diffResult = DiffUtil.calculateDiff(new AudioItemDiffCallback(this.audioItems, newAudioItems)); + + this.audioItems.clear(); + this.audioItems.addAll(newAudioItems); + diffResult.dispatchUpdatesTo(this); // 只更新发生变化的部分 + } + + + + public static class ViewHolder extends RecyclerView.ViewHolder { + + private ImageView imageView; + + public ViewHolder(@NonNull View itemView) { + super(itemView); + + imageView = itemView.findViewById(R.id.image); + + } + + } + +} diff --git a/app/src/main/java/com/hi/music/player/helper/AudioItemDiffCallback.java b/app/src/main/java/com/hi/music/player/helper/AudioItemDiffCallback.java new file mode 100644 index 0000000..cc38d3c --- /dev/null +++ b/app/src/main/java/com/hi/music/player/helper/AudioItemDiffCallback.java @@ -0,0 +1,40 @@ +package com.hi.music.player.helper; + +import androidx.recyclerview.widget.DiffUtil; + +import com.hi.music.player.javabean.A_data.AudioItem; + +import java.util.List; +import java.util.Objects; + +public class AudioItemDiffCallback extends DiffUtil.Callback { + + private final List oldList; + private final List newList; + + public AudioItemDiffCallback(List oldList, List newList) { + this.oldList = oldList; + this.newList = newList; + } + + @Override + public int getOldListSize() { + return oldList.size(); + } + + @Override + public int getNewListSize() { + return newList.size(); + } + + @Override + public boolean areItemsTheSame(int oldItemPosition, int newItemPosition) { + return Objects.equals(oldList.get(oldItemPosition).getImage(), newList.get(newItemPosition).getImage()); + } + + @Override + public boolean areContentsTheSame(int oldItemPosition, int newItemPosition) { + return oldList.get(oldItemPosition).equals(newList.get(newItemPosition)); + } +} + diff --git a/app/src/main/java/com/hi/music/player/helper/JsonUtils.java b/app/src/main/java/com/hi/music/player/helper/JsonUtils.java new file mode 100644 index 0000000..54e9094 --- /dev/null +++ b/app/src/main/java/com/hi/music/player/helper/JsonUtils.java @@ -0,0 +1,69 @@ +package com.hi.music.player.helper; + +import android.content.Context; + +import com.hi.music.player.javabean.A_data.AudioItem; +import com.hi.music.player.javabean.A_data.Category; + +import org.json.JSONArray; +import org.json.JSONObject; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.util.ArrayList; +import java.util.List; + +public class JsonUtils { + + // 读取 assets 中的 JSON 文件 + public static String readJsonFromAssets(Context context, String fileName) { + StringBuilder jsonString = new StringBuilder(); + try { + InputStream inputStream = context.getAssets().open(fileName); + BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream)); + String line; + while ((line = reader.readLine()) != null) { + jsonString.append(line); + } + reader.close(); + } catch (IOException e) { + e.printStackTrace(); + } + return jsonString.toString(); + } + + // 解析 JSON 字符串并返回 Category 列表 + public static List parseJson(String jsonString) { + List categories = new ArrayList<>(); + try { + JSONObject jsonObject = new JSONObject(jsonString); + JSONArray jsonCategories = jsonObject.getJSONArray("categories"); + + for (int i = 0; i < jsonCategories.length(); i++) { + JSONObject categoryObject = jsonCategories.getJSONObject(i); + String categoryName = categoryObject.getString("name"); + List audios = new ArrayList<>(); + + JSONArray jsonAudios = categoryObject.getJSONArray("audios"); + for (int j = 0; j < jsonAudios.length(); j++) { + JSONObject audioObject = jsonAudios.getJSONObject(j); + AudioItem audioItem = new AudioItem( + audioObject.getString("name"), + audioObject.getString("file"), + audioObject.getString("image") + ); + audios.add(audioItem); + } + + categories.add(new Category(categoryName, audios)); + } + } catch (Exception e) { + e.printStackTrace(); + } + return categories; + } +} + + diff --git a/app/src/main/java/com/hi/music/player/javabean/A_data/AudioItem.java b/app/src/main/java/com/hi/music/player/javabean/A_data/AudioItem.java new file mode 100644 index 0000000..34d923c --- /dev/null +++ b/app/src/main/java/com/hi/music/player/javabean/A_data/AudioItem.java @@ -0,0 +1,37 @@ +package com.hi.music.player.javabean.A_data; + +public class AudioItem { + private String name; + private String file; + private String image; + + public AudioItem(String name, String file, String image) { + this.name = name; + this.file = file; + this.image = image; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getFile() { + return file; + } + + public void setFile(String file) { + this.file = file; + } + + public String getImage() { + return image; + } + + public void setImage(String image) { + this.image = image; + } +} diff --git a/app/src/main/java/com/hi/music/player/javabean/A_data/Category.java b/app/src/main/java/com/hi/music/player/javabean/A_data/Category.java new file mode 100644 index 0000000..4fd9d64 --- /dev/null +++ b/app/src/main/java/com/hi/music/player/javabean/A_data/Category.java @@ -0,0 +1,30 @@ +package com.hi.music.player.javabean.A_data; + +import java.util.List; + +public class Category { + + private String name; + private List audios; + + public Category(String name, List audios) { + this.name = name; + this.audios = audios; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public List getAudios() { + return audios; + } + + public void setAudios(List audios) { + this.audios = audios; + } +} diff --git a/app/src/main/java/com/hi/music/player/media3/MyMediaController.java b/app/src/main/java/com/hi/music/player/media3/MyMediaControllerManager.java similarity index 56% rename from app/src/main/java/com/hi/music/player/media3/MyMediaController.java rename to app/src/main/java/com/hi/music/player/media3/MyMediaControllerManager.java index e1fb097..3aa5e9c 100644 --- a/app/src/main/java/com/hi/music/player/media3/MyMediaController.java +++ b/app/src/main/java/com/hi/music/player/media3/MyMediaControllerManager.java @@ -3,6 +3,7 @@ package com.hi.music.player.media3; import android.content.ComponentName; import androidx.media3.common.MediaItem; +import androidx.media3.common.MediaMetadata; import androidx.media3.session.MediaController; import androidx.media3.session.SessionToken; @@ -10,29 +11,30 @@ import com.google.common.util.concurrent.ListenableFuture; import com.google.common.util.concurrent.MoreExecutors; import com.hi.music.player.MusicApplication; import com.hi.music.player.helper.CommonUtils; +import com.hi.music.player.javabean.response.ResponsePlay; import com.hi.music.player.network.RetrofitManager; import java.util.ArrayList; import java.util.List; import java.util.concurrent.ExecutionException; -public class MyMediaController { +public class MyMediaControllerManager { - private static volatile MyMediaController MyMediaControllerInstance; + private static volatile MyMediaControllerManager myMediaControllerManagerInstance; private MediaController mediaController; - public static MyMediaController getInstance() { - if (MyMediaControllerInstance == null) { + public static MyMediaControllerManager getInstance() { + if (myMediaControllerManagerInstance == null) { synchronized (RetrofitManager.class) { - if (MyMediaControllerInstance == null) { - MyMediaControllerInstance = new MyMediaController(); + if (myMediaControllerManagerInstance == null) { + myMediaControllerManagerInstance = new MyMediaControllerManager(); } } } - return MyMediaControllerInstance; + return myMediaControllerManagerInstance; } - private void init(){ + public void init(){ SessionToken sessionToken = new SessionToken(MusicApplication.myApplication, new ComponentName(MusicApplication.myApplication, PlaybackService.class)); ListenableFuture controllerFuture = @@ -50,7 +52,28 @@ public class MyMediaController { }, MoreExecutors.directExecutor()); + + } + + public void addMusicPlay(ResponsePlay responsePlay){ List mediaItems = new ArrayList<>(); + MediaItem.Builder builder = new MediaItem.Builder(); + builder.setUri(responsePlay.getVideoId()); + MediaMetadata.Builder MediaMetadata_builder = new MediaMetadata.Builder(); +// MediaMetadata_builder.setMediaType(); +// MediaMetadata_builder.setAlbumTitle(); +// MediaMetadata_builder.setArtist(); +// MediaMetadata_builder.setDurationMs(); +// MediaMetadata_builder.setTitle(); +// MediaMetadata_builder.setRecordingYear(); + builder.setMediaMetadata(MediaMetadata_builder.build()); + + mediaItems.add(builder.build()); mediaController.addMediaItems(mediaItems); + mediaController.prepare(); + } + + public void play(){ + mediaController.play(); } } diff --git a/app/src/main/java/com/hi/music/player/ui/activity/A_HomeActivity.java b/app/src/main/java/com/hi/music/player/ui/activity/A_HomeActivity.java index 9022435..34e7d19 100644 --- a/app/src/main/java/com/hi/music/player/ui/activity/A_HomeActivity.java +++ b/app/src/main/java/com/hi/music/player/ui/activity/A_HomeActivity.java @@ -2,6 +2,7 @@ package com.hi.music.player.ui.activity; import android.os.Bundle; import android.view.LayoutInflater; +import android.view.View; import com.google.android.material.tabs.TabLayout; import com.google.android.material.tabs.TabLayoutMediator; @@ -41,6 +42,11 @@ public class A_HomeActivity extends BaseActivity { } + @Override + protected void onInitClick() { + + } + @Override public boolean isFullScreen() { return true; @@ -95,5 +101,9 @@ public class A_HomeActivity extends BaseActivity { tabBinding.homeIcon.setImageResource(isSelected ? selectedIcons[position] : defaultIcons[position]); } - } + @Override + public void onClick(View v) { + + } +} diff --git a/app/src/main/java/com/hi/music/player/ui/activity/A_PlayActivity.java b/app/src/main/java/com/hi/music/player/ui/activity/A_PlayActivity.java index 960451b..c7ae3b4 100644 --- a/app/src/main/java/com/hi/music/player/ui/activity/A_PlayActivity.java +++ b/app/src/main/java/com/hi/music/player/ui/activity/A_PlayActivity.java @@ -1,5 +1,7 @@ package com.hi.music.player.ui.activity; +import android.view.View; + import com.hi.music.player.databinding.ActivityAplayBinding; public class A_PlayActivity extends BaseActivity { @@ -15,6 +17,11 @@ public class A_PlayActivity extends BaseActivity { } + @Override + protected void onInitClick() { + + } + @Override public boolean isFullScreen() { return true; @@ -24,4 +31,9 @@ public class A_PlayActivity extends BaseActivity { public boolean statusBarLight() { return false; } + + @Override + public void onClick(View v) { + + } } \ No newline at end of file diff --git a/app/src/main/java/com/hi/music/player/ui/activity/A_SettingActivity.java b/app/src/main/java/com/hi/music/player/ui/activity/A_SettingActivity.java index d6e7662..8a7f124 100644 --- a/app/src/main/java/com/hi/music/player/ui/activity/A_SettingActivity.java +++ b/app/src/main/java/com/hi/music/player/ui/activity/A_SettingActivity.java @@ -1,5 +1,7 @@ package com.hi.music.player.ui.activity; +import android.view.View; + import com.hi.music.player.databinding.ActivityAsettingBinding; public class A_SettingActivity extends BaseActivity { @@ -15,6 +17,11 @@ public class A_SettingActivity extends BaseActivity { } + @Override + protected void onInitClick() { + + } + @Override public boolean isFullScreen() { return true; @@ -24,4 +31,9 @@ public class A_SettingActivity extends BaseActivity { public boolean statusBarLight() { return false; } + + @Override + public void onClick(View v) { + + } } \ No newline at end of file diff --git a/app/src/main/java/com/hi/music/player/ui/activity/A_SplashActivity.java b/app/src/main/java/com/hi/music/player/ui/activity/A_SplashActivity.java index 3a5d1a3..d60e1cc 100644 --- a/app/src/main/java/com/hi/music/player/ui/activity/A_SplashActivity.java +++ b/app/src/main/java/com/hi/music/player/ui/activity/A_SplashActivity.java @@ -2,6 +2,7 @@ package com.hi.music.player.ui.activity; import android.content.Intent; import android.os.CountDownTimer; +import android.view.View; import com.hi.music.player.databinding.ActivityAsplashBinding; @@ -23,6 +24,11 @@ public class A_SplashActivity extends BaseActivity { } + @Override + protected void onInitClick() { + + } + @Override public boolean isFullScreen() { return true; @@ -58,4 +64,9 @@ public class A_SplashActivity extends BaseActivity { countDownTimer.start(); } + + @Override + public void onClick(View v) { + + } } \ No newline at end of file diff --git a/app/src/main/java/com/hi/music/player/ui/activity/BaseActivity.java b/app/src/main/java/com/hi/music/player/ui/activity/BaseActivity.java index 36c8785..649fc7a 100644 --- a/app/src/main/java/com/hi/music/player/ui/activity/BaseActivity.java +++ b/app/src/main/java/com/hi/music/player/ui/activity/BaseActivity.java @@ -14,7 +14,7 @@ import androidx.viewbinding.ViewBinding; import com.hi.music.player.helper.ViewModelScope; -public abstract class BaseActivity extends AppCompatActivity { +public abstract class BaseActivity extends AppCompatActivity implements View.OnClickListener{ private final ViewModelScope mViewModelScope = new ViewModelScope(); @@ -38,11 +38,14 @@ public abstract class BaseActivity extends AppCompatActiv initFullScreen(); } onCreateInit(); + onInitClick(); } protected abstract T getViewBinding(); protected abstract void onCreateInit(); + protected abstract void onInitClick(); + public abstract boolean isFullScreen(); public abstract boolean statusBarLight(); diff --git a/app/src/main/java/com/hi/music/player/ui/activity/HomeActivity.java b/app/src/main/java/com/hi/music/player/ui/activity/HomeActivity.java index 9ef22f8..e7a08b4 100644 --- a/app/src/main/java/com/hi/music/player/ui/activity/HomeActivity.java +++ b/app/src/main/java/com/hi/music/player/ui/activity/HomeActivity.java @@ -37,6 +37,11 @@ public class HomeActivity extends BaseActivity { initView(); // 可以在这里初始化视图 } + @Override + protected void onInitClick() { + + } + @Override public boolean isFullScreen() { return true; @@ -97,7 +102,9 @@ public class HomeActivity extends BaseActivity { } + @Override + public void onClick(View v) { - + } } diff --git a/app/src/main/java/com/hi/music/player/ui/activity/MainActivity.java b/app/src/main/java/com/hi/music/player/ui/activity/MainActivity.java index bb5ebfb..8c26d04 100644 --- a/app/src/main/java/com/hi/music/player/ui/activity/MainActivity.java +++ b/app/src/main/java/com/hi/music/player/ui/activity/MainActivity.java @@ -36,6 +36,11 @@ public class MainActivity extends BaseActivity { } + @Override + protected void onInitClick() { + + } + @Override public boolean isFullScreen() { return false; @@ -45,4 +50,9 @@ public class MainActivity extends BaseActivity { public boolean statusBarLight() { return false; } + + @Override + public void onClick(View v) { + + } } \ No newline at end of file diff --git a/app/src/main/java/com/hi/music/player/ui/activity/PlayActivity.java b/app/src/main/java/com/hi/music/player/ui/activity/PlayActivity.java index 4e45a15..b4c6408 100644 --- a/app/src/main/java/com/hi/music/player/ui/activity/PlayActivity.java +++ b/app/src/main/java/com/hi/music/player/ui/activity/PlayActivity.java @@ -1,14 +1,12 @@ package com.hi.music.player.ui.activity; -import android.content.ComponentName; import android.content.Intent; import android.graphics.drawable.Drawable; +import android.view.View; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.lifecycle.Observer; -import androidx.media3.session.MediaController; -import androidx.media3.session.SessionToken; import com.bumptech.glide.Glide; import com.bumptech.glide.load.DataSource; @@ -17,8 +15,6 @@ import com.bumptech.glide.load.resource.bitmap.RoundedCorners; import com.bumptech.glide.request.RequestListener; import com.bumptech.glide.request.RequestOptions; import com.bumptech.glide.request.target.Target; -import com.google.common.util.concurrent.ListenableFuture; -import com.google.common.util.concurrent.MoreExecutors; import com.hi.music.player.MusicApplication; import com.hi.music.player.R; import com.hi.music.player.databinding.ActivityPlayBinding; @@ -26,17 +22,17 @@ import com.hi.music.player.helper.CommonUtils; import com.hi.music.player.helper.MyValue; import com.hi.music.player.javabean.response.ResponsePlay; import com.hi.music.player.javabean.response.child.ResponseSingle; -import com.hi.music.player.media3.PlaybackService; +import com.hi.music.player.media3.MyMediaControllerManager; import com.hi.music.player.ui.activity.viewmodel.VMPlay; import java.util.List; -import java.util.concurrent.ExecutionException; public class PlayActivity extends BaseActivity { private ResponseSingle responseSingle; private VMPlay vmPlay; + private MyMediaControllerManager mediaController; @Override protected ActivityPlayBinding getViewBinding() { @@ -65,10 +61,19 @@ public class PlayActivity extends BaseActivity { } + @Override + protected void onInitClick() { + vb.btnPlay.setOnClickListener(this::onClick); + } + private void loadInfo(ResponsePlay data) { vb.tvSongName.setText(data.getSongTitle()); vb.tvSingerName.setText(data.getSingerName()); vb.tvDuration.setText(data.getDuration()); + + mediaController = MyMediaControllerManager.getInstance(); + mediaController.init(); + mediaController.addMusicPlay(data); } private void loadCovert(String url) { @@ -109,4 +114,12 @@ public class PlayActivity extends BaseActivity { public boolean statusBarLight() { return false; } + + @Override + public void onClick(View v) { + if(v.equals(vb.btnPlay)){ + mediaController.play(); + } + + } } \ No newline at end of file diff --git a/app/src/main/java/com/hi/music/player/ui/fragmnt/A_HomeFragment.java b/app/src/main/java/com/hi/music/player/ui/fragmnt/A_HomeFragment.java index b460d4b..b92e1ed 100644 --- a/app/src/main/java/com/hi/music/player/ui/fragmnt/A_HomeFragment.java +++ b/app/src/main/java/com/hi/music/player/ui/fragmnt/A_HomeFragment.java @@ -1,10 +1,20 @@ package com.hi.music.player.ui.fragmnt; +import androidx.lifecycle.ViewModelProvider; +import androidx.recyclerview.widget.LinearLayoutManager; + +import com.hi.music.player.adapter.A_InstrumentAdapter; +import com.hi.music.player.adapter.A_NatureAdapter; +import com.hi.music.player.adapter.A_WhiteAdapter; import com.hi.music.player.databinding.FragmentAHomeBinding; +import com.hi.music.player.ui.fragmnt.viewmodel.A_VMHome; public class A_HomeFragment extends BaseFragment { + private A_InstrumentAdapter instrumentAdapter; + private A_WhiteAdapter whiteAdapter; + private A_NatureAdapter natureAdapter; @Override protected FragmentAHomeBinding getFragmentVb() { @@ -14,5 +24,44 @@ public class A_HomeFragment extends BaseFragment { @Override protected void initView() { + initData(); + + initEvent(); + } -} \ No newline at end of file + + public void initData() { + // 设置 LayoutManager + Vb.recyclerViewFirst.setLayoutManager(new LinearLayoutManager(getContext(), LinearLayoutManager.HORIZONTAL, false)); + Vb.recyclerViewSecond.setLayoutManager(new LinearLayoutManager(getContext(), LinearLayoutManager.HORIZONTAL, false)); + Vb.recyclerViewThird.setLayoutManager(new LinearLayoutManager(getContext(), LinearLayoutManager.VERTICAL, false)); + + // 初始化适配器 + instrumentAdapter = new A_InstrumentAdapter(requireContext()); + whiteAdapter = new A_WhiteAdapter(requireContext()); + natureAdapter = new A_NatureAdapter(requireContext()); + + // 设置适配器到 RecyclerView + Vb.recyclerViewFirst.setAdapter(instrumentAdapter); + Vb.recyclerViewSecond.setAdapter(whiteAdapter); + Vb.recyclerViewThird.setAdapter(natureAdapter); + } + + public void initEvent() { + // 观察 ViewModel 中的 LiveData + A_VMHome viewModel = new ViewModelProvider(this).get(A_VMHome.class); + + viewModel.getSoundOfInstrumentList().observe(getViewLifecycleOwner(), audioItems -> { + instrumentAdapter.updateData(audioItems); + }); + + viewModel.getWhiteNoiseList().observe(getViewLifecycleOwner(), audioItems -> { + whiteAdapter.updateData(audioItems); + }); + + viewModel.getVoiceOfNatureList().observe(getViewLifecycleOwner(), audioItems -> { + natureAdapter.updateData(audioItems); + }); + } + +} diff --git a/app/src/main/java/com/hi/music/player/ui/fragmnt/A_ImportFragment.java b/app/src/main/java/com/hi/music/player/ui/fragmnt/A_ImportFragment.java index 5824c66..02f6ff3 100644 --- a/app/src/main/java/com/hi/music/player/ui/fragmnt/A_ImportFragment.java +++ b/app/src/main/java/com/hi/music/player/ui/fragmnt/A_ImportFragment.java @@ -1,6 +1,9 @@ package com.hi.music.player.ui.fragmnt; +import android.content.Intent; + import com.hi.music.player.databinding.FragmentAImportBinding; +import com.hi.music.player.ui.activity.A_SettingActivity; public class A_ImportFragment extends BaseFragment { @@ -14,5 +17,21 @@ public class A_ImportFragment extends BaseFragment { @Override protected void initView() { + initData(); + + initEvent(); + } + + public void initData() { + + } + + public void initEvent() { + Vb.setting.setOnClickListener(v -> { + Intent intent = new Intent(getContext(), A_SettingActivity.class); + startActivity(intent); + }); + } + } \ No newline at end of file diff --git a/app/src/main/java/com/hi/music/player/ui/fragmnt/viewmodel/A_VMHome.java b/app/src/main/java/com/hi/music/player/ui/fragmnt/viewmodel/A_VMHome.java new file mode 100644 index 0000000..839a7ce --- /dev/null +++ b/app/src/main/java/com/hi/music/player/ui/fragmnt/viewmodel/A_VMHome.java @@ -0,0 +1,90 @@ +package com.hi.music.player.ui.fragmnt.viewmodel; + +import androidx.lifecycle.LiveData; +import androidx.lifecycle.MutableLiveData; +import androidx.lifecycle.ViewModel; + +import com.hi.music.player.MusicApplication; +import com.hi.music.player.helper.JsonUtils; +import com.hi.music.player.javabean.A_data.AudioItem; +import com.hi.music.player.javabean.A_data.Category; + +import java.util.ArrayList; +import java.util.List; + +public class A_VMHome extends ViewModel { + + private MutableLiveData> soundOfInstrumentList; + private MutableLiveData> whiteNoiseList; + private MutableLiveData> voiceOfNatureList; + + public LiveData> getSoundOfInstrumentList() { + if (soundOfInstrumentList == null) { + soundOfInstrumentList = new MutableLiveData<>(); + loadAudioData(); + } + return soundOfInstrumentList; + } + + public LiveData> getWhiteNoiseList() { + if (whiteNoiseList == null) { + whiteNoiseList = new MutableLiveData<>(); + loadAudioData(); + } + return whiteNoiseList; + } + + public LiveData> getVoiceOfNatureList() { + if (voiceOfNatureList == null) { + voiceOfNatureList = new MutableLiveData<>(); + loadAudioData(); + } + return voiceOfNatureList; + } + + private void loadAudioData() { + new Thread(() -> { + try { + String jsonString = JsonUtils.readJsonFromAssets(MusicApplication.myApplication, "resources.json"); + if (jsonString != null && !jsonString.isEmpty()) { + List categories = JsonUtils.parseJson(jsonString); + + List soundOfInstrumentItems = new ArrayList<>(); + List whiteNoiseItems = new ArrayList<>(); + List voiceOfNatureItems = new ArrayList<>(); + + for (Category category : categories) { + String categoryName = category.getName(); + List audioItems = category.getAudios(); + + switch (categoryName) { + case "Sound of instrument": + soundOfInstrumentItems.addAll(audioItems); + break; + case "White noise": + whiteNoiseItems.addAll(audioItems); + break; + case "Voice of Nature": + voiceOfNatureItems.addAll(audioItems); + break; + } + } + + // 更新对应的 LiveData + soundOfInstrumentList.postValue(soundOfInstrumentItems); + whiteNoiseList.postValue(whiteNoiseItems); + voiceOfNatureList.postValue(voiceOfNatureItems); + } else { + soundOfInstrumentList.postValue(new ArrayList<>()); + whiteNoiseList.postValue(new ArrayList<>()); + voiceOfNatureList.postValue(new ArrayList<>()); + } + } catch (Exception e) { + e.printStackTrace(); + soundOfInstrumentList.postValue(new ArrayList<>()); + whiteNoiseList.postValue(new ArrayList<>()); + voiceOfNatureList.postValue(new ArrayList<>()); + } + }).start(); + } +} diff --git a/app/src/main/res/layout/fragment_a_home.xml b/app/src/main/res/layout/fragment_a_home.xml index 7ff2a11..bfaefc8 100644 --- a/app/src/main/res/layout/fragment_a_home.xml +++ b/app/src/main/res/layout/fragment_a_home.xml @@ -37,7 +37,9 @@ android:layout_height="wrap_content" android:layout_marginTop="16dp" android:nestedScrollingEnabled="false" - android:orientation="horizontal" /> + android:orientation="horizontal" + tools:itemCount="1" + tools:listitem="@layout/item_a_home_1"/> @@ -66,6 +70,8 @@