当前位置:   article > 正文

基于 Android Studio 实现的简易 音乐播放器App_android studio音乐播放器

android studio音乐播放器

目录

一、项目运行视频演示

二、项目开发环境介绍

三、项目页面详情介绍

1.启动页

2.登录页面

3.注册页面

4.首页 

5.音乐播放器页面

Get 项目模板源码


一、项目运行视频演示

Android studio期末设计大作业~音乐播放器App

二、项目开发环境介绍

三、项目页面详情介绍

1.启动页

这段代码是一个启动页 `StartActivity` 的实现,具体功能和流程如下:

1. **布局与初始化**:
   - `StartActivity` 继承自 `AppCompatActivity`,在 `onCreate` 方法中设置了布局文件 `activity_start`,并进行了界面的初始化操作。

2. **延迟跳转**:
   - 使用 `Handler` 的 `postDelayed` 方法,在启动后延迟3秒执行 `runnable` 对象中的 `toMainActive()` 方法。

3. **计时器功能**:
   - `TimeCount` 类继承自 `CountDownTimer`,在 `onFinish()` 方法中移除了 `Handler` 中的 `runnable`,确保在4秒钟后确保跳转逻辑生效。

4. **跳转到登录页面**:
   - `toMainActive()` 方法启动 `LoginActivity` 并且在跳转完成后结束当前 `StartActivity`。

5. **界面元素**:
   - 代码中还包括了 `ImageView` 和 `Button` 元素,尽管它们在代码中没有具体的操作,它们可以在布局文件中进一步定义。

这段代码的主要功能是实现一个启动页,在应用启动后延迟3秒后自动跳转到登录页面,并且在启动过程中显示倒计时效果。

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. xmlns:app="http://schemas.android.com/apk/res-auto"
  4. xmlns:tools="http://schemas.android.com/tools"
  5. android:layout_width="match_parent"
  6. android:layout_height="match_parent"
  7. android:background="#f9d7e7"
  8. tools:context=".Start.StartActivity">
  9. <ImageView
  10. android:id="@+id/imageView2"
  11. android:layout_width="wrap_content"
  12. android:layout_height="wrap_content"
  13. app:layout_constraintBottom_toBottomOf="parent"
  14. app:layout_constraintEnd_toEndOf="parent"
  15. app:layout_constraintStart_toStartOf="parent"
  16. app:layout_constraintTop_toTopOf="parent"
  17. app:srcCompat="@drawable/logo" />
  18. </androidx.constraintlayout.widget.ConstraintLayout>

2.登录页面

这段代码实现了一个简单的用户登录功能的 `LoginActivity`。以下是代码的主要功能和流程总结:

1. **布局与初始化**:
   - `LoginActivity` 继承自 `AppCompatActivity`,在 `onCreate` 方法中设置了布局文件 `activity_login`,并初始化了界面上的 `TextView`、`EditText` 和 `Button` 控件以及一个 `DatabaseHelper` 对象用于数据库操作。

2. **注册跳转**:
   - `loginRegister` 是一个 `TextView` 控件,点击它可以跳转到注册页面 `RegisterActivity`,通过监听器实现了这一功能。

3. **登录逻辑**:
   - `mLoginButton` 是一个 `Button` 控件,点击它触发登录操作。
   - 获取用户输入的用户名和密码,进行非空验证。
   - 调用 `mDatabaseHelper` 的 `checkUser` 方法验证用户名和密码是否匹配数据库中的记录。
   - 如果验证通过,显示登录成功的 Toast 提示,并跳转到主页面 `MainActivity`。
   - 如果验证失败,显示账号或密码错误的 Toast 提示。

4. **Toast 提示**:
   - 使用 `Toast.makeText()` 方法显示短暂的提示信息,提示用户输入账号或密码,或者登录成功或失败的信息。

5. **数据库操作**:
   - `DatabaseHelper` 类的 `checkUser` 方法用于查询数据库,验证用户输入的账号和密码是否匹配数据库中的记录。

6. **界面元素与交互**:
   - 通过监听器实现了注册页面跳转和登录按钮的点击事件处理,确保用户可以通过界面完成登录操作并获取相应的反馈。

总体而言,这段代码实现了基本的用户登录功能,包括输入验证、数据库查询、界面跳转和提示信息的显示,是一个典型的 Android 应用程序中常见的登录功能实现。

  1. package com.example.music.Login;
  2. import android.content.Intent;
  3. import android.os.Bundle;
  4. import android.view.View;
  5. import android.widget.Button;
  6. import android.widget.EditText;
  7. import android.widget.TextView;
  8. import android.widget.Toast;
  9. import androidx.appcompat.app.AppCompatActivity;
  10. import com.example.music.MainActivity;
  11. import com.example.music.R;
  12. import com.example.music.Register.RegisterActivity;
  13. import com.example.music.Data.DatabaseHelper;
  14. public class LoginActivity extends AppCompatActivity {
  15. private TextView loginRegister;
  16. private EditText user;
  17. private EditText pass;
  18. private Button mLoginButton;
  19. private DatabaseHelper mDatabaseHelper;
  20. @Override
  21. protected void onCreate(Bundle savedInstanceState) {
  22. super.onCreate(savedInstanceState);
  23. setContentView(R.layout.activity_login);
  24. user = findViewById(R.id.user);
  25. pass = findViewById(R.id.pass);
  26. mLoginButton = findViewById(R.id.login_button);
  27. loginRegister = findViewById(R.id.login_register);
  28. mDatabaseHelper = new DatabaseHelper(this);
  29. loginRegister.setOnClickListener(v -> {
  30. Intent intent = new Intent(LoginActivity.this, RegisterActivity.class);
  31. startActivity(intent);
  32. });
  33. mLoginButton.setOnClickListener(v -> {
  34. String username = user.getText().toString().trim();
  35. String password = pass.getText().toString().trim();
  36. if (username.isEmpty() || password.isEmpty()) {
  37. Toast.makeText(getApplicationContext(), "请输入账号或密码", Toast.LENGTH_SHORT).show();
  38. return;
  39. }
  40. boolean result = mDatabaseHelper.checkUser(username, password);
  41. if (result) {
  42. Toast.makeText(getApplicationContext(), "登陆成功", Toast.LENGTH_SHORT).show();
  43. Intent intent = new Intent(LoginActivity.this, MainActivity.class);
  44. startActivity(intent);
  45. } else {
  46. Toast.makeText(getApplicationContext(), "账号或密码错误", Toast.LENGTH_SHORT).show();
  47. }
  48. });
  49. }
  50. }

3.注册页面

这段代码实现了用户注册功能的 `RegisterActivity`。以下是代码的主要功能和流程总结:

1. **布局与初始化**:
   - `RegisterActivity` 继承自 `AppCompatActivity`,在 `onCreate` 方法中设置了布局文件 `activity_register`,并初始化了界面上的 `EditText` 和 `Button` 控件以及一个 `DatabaseHelper` 对象用于数据库操作。

2. **注册逻辑**:
   - `registerButton` 是一个 `Button` 控件,点击它触发注册操作。
   - 获取用户输入的用户名和密码,进行非空验证。
   - 调用 `mDatabaseHelper` 的 `insertData` 方法将用户名和密码插入到数据库中。
   - 如果注册成功,显示注册成功的 Toast 提示,并跳转到登录页面 `LoginActivity`。
   - 如果注册失败,显示注册失败的 Toast 提示。

3. **Toast 提示**:
   - 使用 `Toast.makeText()` 方法显示短暂的提示信息,提示用户输入账号或密码,或者注册成功或失败的信息。

4. **数据库操作**:
   - `DatabaseHelper` 类的 `insertData` 方法用于向数据库中插入新的用户名和密码记录。

5. **界面元素与交互**:
   - 通过监听器实现了注册按钮的点击事件处理,确保用户可以通过界面完成注册操作并获取相应的反馈。

总体而言,这段代码实现了基本的用户注册功能,包括输入验证、数据库插入操作、界面跳转和提示信息的显示,是一个典型的 Android 应用程序中常见的注册功能实现。

  1. package com.example.music.Register;
  2. import androidx.appcompat.app.AppCompatActivity;
  3. import android.content.Intent;
  4. import android.os.Bundle;
  5. import android.view.View;
  6. import android.widget.Button;
  7. import android.widget.EditText;
  8. import android.widget.Toast;
  9. import com.example.music.Login.LoginActivity;
  10. import com.example.music.R;
  11. import com.example.music.Data.DatabaseHelper;
  12. public class RegisterActivity extends AppCompatActivity {
  13. private EditText mUserNameEditText;
  14. private EditText mPasswordEditText;
  15. private Button registerButton;
  16. private DatabaseHelper mDatabaseHelper;
  17. @Override
  18. protected void onCreate(Bundle savedInstanceState) {
  19. super.onCreate(savedInstanceState);
  20. setContentView(R.layout.activity_register);
  21. mUserNameEditText = findViewById(R.id.username_edittext);
  22. mPasswordEditText = findViewById(R.id.password_edittext);
  23. registerButton = findViewById(R.id.register_button);
  24. mDatabaseHelper = new DatabaseHelper(this);
  25. registerButton.setOnClickListener(v -> {
  26. String username = mUserNameEditText.getText().toString().trim();
  27. String password = mPasswordEditText.getText().toString().trim();
  28. if (username.isEmpty() || password.isEmpty()) {
  29. Toast.makeText(getApplicationContext(), "请输入账号或密码", Toast.LENGTH_SHORT).show();
  30. return;
  31. }
  32. boolean result = mDatabaseHelper.insertData(username, password);
  33. if (result) {
  34. Toast.makeText(getApplicationContext(), "注册成功", Toast.LENGTH_SHORT).show();
  35. Intent intent = new Intent(RegisterActivity.this, LoginActivity.class);
  36. startActivity(intent);
  37. finish();
  38. } else {
  39. Toast.makeText(getApplicationContext(), "注册失败", Toast.LENGTH_SHORT).show();
  40. }
  41. });
  42. }
  43. }

4.首页 

这段代码实现了一个简单的 `MainActivity`,用于显示应用的主界面,并加载默认的音乐列表页面 `SongPage`。

以下是代码的主要功能和流程总结:

1. **布局与初始化**:
   - `MainActivity` 继承自 `AppCompatActivity`,在 `onCreate` 方法中通过 `setContentView()` 方法设置布局文件 `activity_main`。

2. **Fragment 管理**:
   - 使用 `FragmentManager` 和 `FragmentTransaction` 进行 Fragment 的管理和事务操作。
   - 获取 `FragmentManager` 实例 `fm`,并开始一个新的事务 `ft`。
   - 使用 `ft.replace()` 方法将 `R.id.content` 容器中的内容替换为新的 `SongPage` Fragment 实例。
   - 最后调用 `ft.commit()` 提交事务,完成 Fragment 的显示和替换操作。

3. **默认显示页面**:
   - 通过 `ft.replace()` 将 `SongPage` Fragment 设置为默认显示的页面,即应用启动后默认展示音乐列表界面。

4. **Fragment 的实现**:
   - 假设 `SongPage` 是一个继承自 `Fragment` 的类,负责显示音乐列表和相关操作。

5. **注意事项**:
   - 代码中没有涉及其他交互逻辑或后续页面的处理,仅仅展示了如何通过 Fragment 在 `MainActivity` 中管理和显示内容。

总体而言,这段代码实现了一个简单的主界面管理,使用了 Fragment 技术来管理不同的界面内容,这是在 Android 应用开发中常见的做法,能够帮助实现界面的模块化和复用。

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. xmlns:app="http://schemas.android.com/apk/res-auto"
  4. xmlns:tools="http://schemas.android.com/tools"
  5. android:layout_width="match_parent"
  6. android:layout_height="match_parent"
  7. android:background="#f9d7e7"
  8. tools:context=".MainActivity">
  9. <FrameLayout
  10. android:id="@+id/content"
  11. android:layout_width="0dp"
  12. android:layout_height="0dp"
  13. android:layout_marginTop="16dp"
  14. app:layout_constraintBottom_toBottomOf="parent"
  15. app:layout_constraintEnd_toEndOf="parent"
  16. app:layout_constraintHorizontal_bias="0.466"
  17. app:layout_constraintStart_toStartOf="parent"
  18. app:layout_constraintTop_toBottomOf="@+id/textView2"
  19. app:layout_constraintVertical_bias="1.0">
  20. </FrameLayout>
  21. <TextView
  22. android:id="@+id/textView2"
  23. android:layout_width="wrap_content"
  24. android:layout_height="wrap_content"
  25. android:layout_marginTop="16dp"
  26. android:text="歌曲列表"
  27. android:textColor="#454545"
  28. android:textSize="24sp"
  29. android:textStyle="bold"
  30. app:layout_constraintEnd_toEndOf="parent"
  31. app:layout_constraintStart_toStartOf="parent"
  32. app:layout_constraintTop_toTopOf="parent" />
  33. </androidx.constraintlayout.widget.ConstraintLayout>

5.音乐播放器页面

这段代码实现了一个音乐播放器的功能,以下是主要功能和流程的总结:

1. **界面布局与初始化**:
   - `MusicActivity` 继承自 `AppCompatActivity`,在 `onCreate` 方法中设置了布局文件 `activity_music`,并隐藏了标题栏。
   - 初始化了界面上的各种控件,包括 `TextView`、`SeekBar`、`ImageView` 等,用于显示歌曲信息、控制播放、暂停、切换歌曲等操作。

2. **音乐播放控制**:
   - 使用 `MusicService` 类进行音乐播放的控制,通过 `bindService()` 方法绑定服务,并通过 `MyServiceConn` 类实现服务连接。
   - 实现了播放、暂停、继续播放、上一首、下一首等按钮的点击事件处理,根据点击事件调用 `musicControl` 的相应方法实现音乐播放控制。
   - 使用 `ObjectAnimator` 实现了音乐图标的旋转效果,并在播放、暂停时控制动画的启动和暂停。

3. **进度条与播放时间显示**:
   - 使用 `SeekBar` 显示音乐播放进度,并通过 `Handler` 更新播放进度和歌曲总时长的显示。
   - 当用户拖动进度条时,根据用户选择的进度调整音乐播放的位置。

4. **按钮点击事件处理**:
   - 播放按钮 (`btn_play`) 开始播放音乐,并开始旋转动画。
   - 暂停按钮 (`btn_pause`) 暂停音乐播放,并暂停旋转动画。
   - 继续播放按钮 (`btn_continue_play`) 继续音乐播放,并恢复旋转动画。
   - 上一首 (`btn_pre`) 和下一首 (`btn_next`) 按钮实现切换歌曲功能,根据当前歌曲的下标切换到上一首或下一首歌曲。
   - 退出按钮 (`btn_exit`) 解绑服务并关闭当前界面。

5. **服务生命周期管理**:
   - 在 `onDestroy` 方法中确保解绑了音乐播放服务,防止内存泄漏和资源浪费。

6. **额外说明**:
   - 代码中使用了 `Handler` 处理从音乐播放服务返回的消息,更新界面上的播放进度和歌曲总时长显示。
   - 使用了 `ObjectAnimator` 实现了音乐图标的旋转动画效果,增强了用户体验。

总体而言,这段代码实现了一个简单的音乐播放器界面,通过服务绑定和控件监听实现了基本的音乐播放、暂停、切换和进度控制功能。

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. xmlns:app="http://schemas.android.com/apk/res-auto"
  4. xmlns:tools="http://schemas.android.com/tools"
  5. android:layout_width="match_parent"
  6. android:layout_height="match_parent"
  7. android:background="#f9d7e7"
  8. android:orientation="vertical"
  9. tools:context=".Music.MusicActivity">
  10. <ImageView
  11. android:id="@+id/btn_exit"
  12. android:layout_width="20dp"
  13. android:layout_height="20dp"
  14. android:layout_marginStart="16dp"
  15. android:layout_marginTop="24dp"
  16. app:layout_constraintStart_toStartOf="parent"
  17. app:layout_constraintTop_toTopOf="parent"
  18. app:srcCompat="@drawable/back" />
  19. <TextView
  20. android:id="@+id/song_name"
  21. android:layout_width="wrap_content"
  22. android:layout_height="wrap_content"
  23. android:layout_gravity="center"
  24. android:text="光年之外"
  25. android:textColor="#000"
  26. android:textSize="24sp"
  27. app:layout_constraintBottom_toBottomOf="@+id/btn_exit"
  28. app:layout_constraintEnd_toEndOf="parent"
  29. app:layout_constraintStart_toStartOf="parent"
  30. app:layout_constraintTop_toTopOf="@+id/btn_exit" />
  31. <ImageView
  32. android:id="@+id/iv_music"
  33. android:layout_width="250dp"
  34. android:layout_height="250dp"
  35. android:layout_marginTop="80dp"
  36. android:src="@drawable/img_01"
  37. app:layout_constraintEnd_toEndOf="parent"
  38. app:layout_constraintStart_toStartOf="parent"
  39. app:layout_constraintTop_toBottomOf="@+id/btn_exit" />
  40. <SeekBar
  41. android:id="@+id/sb"
  42. android:layout_width="250dp"
  43. android:layout_height="20dp"
  44. android:layout_marginTop="80dp"
  45. app:layout_constraintEnd_toEndOf="parent"
  46. app:layout_constraintStart_toStartOf="parent"
  47. app:layout_constraintTop_toBottomOf="@+id/iv_music" />
  48. <TextView
  49. android:id="@+id/tv_progress"
  50. android:layout_width="wrap_content"
  51. android:layout_height="wrap_content"
  52. android:layout_marginEnd="5dp"
  53. android:text="00:00"
  54. app:layout_constraintBottom_toBottomOf="@+id/sb"
  55. app:layout_constraintEnd_toStartOf="@+id/sb"
  56. app:layout_constraintTop_toTopOf="@+id/sb" />
  57. <TextView
  58. android:id="@+id/tv_total"
  59. android:layout_width="wrap_content"
  60. android:layout_height="wrap_content"
  61. android:layout_marginStart="5dp"
  62. android:text="00:00"
  63. app:layout_constraintBottom_toBottomOf="@+id/sb"
  64. app:layout_constraintStart_toEndOf="@+id/sb"
  65. app:layout_constraintTop_toTopOf="@+id/sb" />
  66. <ImageView
  67. android:id="@+id/btn_continue_play"
  68. android:layout_width="60dp"
  69. android:layout_height="60dp"
  70. android:background="@drawable/play"
  71. app:layout_constraintBottom_toBottomOf="@+id/btn_pre"
  72. app:layout_constraintEnd_toStartOf="@+id/btn_next"
  73. app:layout_constraintStart_toEndOf="@+id/btn_pre"
  74. app:layout_constraintTop_toTopOf="@+id/btn_pre" />
  75. <ImageView
  76. android:id="@+id/btn_pause"
  77. android:layout_width="60dp"
  78. android:layout_height="60dp"
  79. android:background="@drawable/pause"
  80. app:layout_constraintBottom_toBottomOf="@+id/btn_next"
  81. app:layout_constraintEnd_toStartOf="@+id/btn_next"
  82. app:layout_constraintStart_toEndOf="@+id/btn_pre"
  83. app:layout_constraintTop_toTopOf="@+id/btn_next" />
  84. <ImageView
  85. android:id="@+id/btn_pre"
  86. android:layout_width="40dp"
  87. android:layout_height="40dp"
  88. android:layout_marginStart="24dp"
  89. android:background="@drawable/pre"
  90. app:layout_constraintBottom_toBottomOf="@+id/btn_next"
  91. app:layout_constraintStart_toStartOf="@+id/tv_progress"
  92. app:layout_constraintTop_toTopOf="@+id/btn_next" />
  93. <ImageView
  94. android:id="@+id/btn_next"
  95. android:layout_width="40dp"
  96. android:layout_height="40dp"
  97. android:layout_marginTop="100dp"
  98. android:layout_marginEnd="24dp"
  99. android:background="@drawable/next"
  100. app:layout_constraintEnd_toEndOf="@+id/tv_total"
  101. app:layout_constraintTop_toBottomOf="@+id/tv_total" />
  102. <ImageView
  103. android:id="@+id/btn_play"
  104. android:layout_width="60dp"
  105. android:layout_height="60dp"
  106. android:background="@drawable/play"
  107. app:layout_constraintBottom_toBottomOf="@+id/btn_pre"
  108. app:layout_constraintEnd_toStartOf="@+id/btn_next"
  109. app:layout_constraintStart_toEndOf="@+id/btn_pre"
  110. app:layout_constraintTop_toTopOf="@+id/btn_pre" />
  111. </androidx.constraintlayout.widget.ConstraintLayout>

Get 项目模板源码

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/在线问答5/article/detail/775833
推荐阅读
相关标签