Android Studio音频视频播放器课程设计

这个项目适合刚刚学习Android studio的初学者,实现音视频的基本播放功能,各项功能的页面都做的比较简单,特别适用于初学者,其特点在于本项目抛开了各种花里胡哨的制作,以最接近初学者的样式画面呈现,完全不用担心被质疑套用别人的项目,要是实在追求完美的话,本文末尾也附上了经过美化后的相同项目链接。

基于Android Studio的音视频播放系统设计与实现

一、问题描述

音视频播放系统包括:使用sqlite创建数据库用于存储用户信息、启动效果、用户注册、用户登录、显示用户信息、音乐播放、视频播放等功能。

二、功能描述

设计一个音视频播放器app,使之能够实现以下功能:

  1. 创建一个数据库用于存储用户信息。
  2. 启动效果:该App设计了启动页面,启动后倒计时3s后可进入app。
  3. 用户登录注册:该App提供用户登录和注册功能,用户可以创建新账户或使用现有账户登录。当用户注册完成后跳转回到登录页面进行用户登录。用户需要提供有效的用户名和密码进行身份验证。
  4. 显示用户信息:用户登录后可点击信息按钮查看用户信息,包括历史登录用户的用户信息。
  5. 音乐播放功能:用户登录后,可以通过该App浏览和播放音乐文件。App提供音乐列表,用户可以浏览并选择要播放的音乐。点击音乐后,将跳转到音乐播放页面,可进行音乐的播放、暂停、上一曲和下一曲以及拖动进度条来控制音乐播放。
  6.  视频播放功能:该App还提供视频播放功能。用户可以通过App浏览并选择要播放的视频文件。点击视频后,跳转到音乐播放页面,可以控制视频播放和暂停。

三、功能实现

项目目录:

 1.创建数据库,建立一个用户表,表结构如下:

2.实现app启动页面,页面效果如下:

 3.实现用户登录功能,用户需要提供有效的用户名和密码,否侧提示用户名无效或密码无效:

4.实现用户注册功能,点击注册按钮跳转至用户注册页面,用户注册成功跳转回用户登录页面进行用户登录:

5.显示历史登录用户信息功能,登录成功后,点击信息后,跳转至用户信息显示界面,用户可查看历史登录用户信息。

6.实现音乐播放功能,登录成功后,默认显示音乐列表,点击音乐后,跳转至音乐播放界面,用户可通过点击播放按钮进行音乐的播放、暂停、上一曲和下一曲操作,同时用户也可以通过拖动进度条控制音乐的播放进度:

7.实现视频播放功能,在默认页面点击视频按钮后,跳转至视频列表,点击视频可进入视频播放页面,用户可通过点击播放、暂停、继续播放按钮对视频进行播放控制。

四、源代码

1.用户类定义User.java

package and.yjg.music_app.Login;
public class User {public User() {}public User(String account, String password, String phone, String address) {this.account = account;this.password = password;this.phone = phone;this.address = address;}public String account;public String password;public String phone;public String address;public String getAccount() {return account;}public void setAccount(String account) {this.account = account;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}public void setPhone(String phone) {this.phone = phone;}public void setAddress(String address){this.address = address;}public String toString () {return "用户名:" + account + "\n" +"密码:" + password + "\n " +"电话:" + phone + "\n " +"地址:" + address + "\n";}}

2.UserDao.java

package and.yjg.music_app.Login;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteException;
import android.util.Log;
import and.yjg.music_app.DataBaseHelper;
public class UserDao {private Context context;       private DataBaseHelper dbHelper;private SQLiteDatabase db;   public UserDao(Context context) {this.context = context;}public void open() throws SQLiteException {dbHelper = new DataBaseHelper(context);try {db = dbHelper.getWritableDatabase();} catch (SQLiteException exception) {db = dbHelper.getReadableDatabase();}}public void close() {if (db != null) {db.close();db = null;}}public void addUser(User user) {ContentValues values = new ContentValues();values.put("account", user.account);values.put("password", user.password);values.put("phone", user.phone);values.put("address", user.address);db.insert("user", null, values);}public void deleteUser(User user) {db.delete("user", "account = ?", new String[]{user.account});}public void update(User user) {ContentValues values = new ContentValues();values.put("password", user.password);db.update("user", values, "account = ?", new String[]{user.account});}public boolean find(User user) {Cursor cursor = db.query("user", null, "account = ?", new String[]{user.account}, null, null, null);if (cursor == null || cursor.getCount() < 1) {return false;}if (cursor.moveToFirst()) {do {String acc = cursor.getString(cursor.getColumnIndex("account"));String pass = cursor.getString(cursor.getColumnIndex("password"));String pho = cursor.getString(cursor.getColumnIndex("phone"));String addr = cursor.getString(cursor.getColumnIndex("address"));Log.d("UserDao", "user account is" + acc);Log.d("UserDao", "user password is " + pass);Log.d("UserDao", "user phone is " + pho);Log.d("UserDao", "user address is " + addr);} while (cursor.moveToNext());}cursor.close();return true;}public boolean isExist(String account) {Cursor cursor = db.query("user", null, "account = ?", new String[] {account}, null, null, null);return cursor != null && cursor.getCount() > 0;}public String getPassword(String account) {Cursor cursor = db.query("user", null, "account = ?", new String[] {account}, null, null, null);cursor.moveToFirst();String password = cursor.getString(cursor.getColumnIndex("password"));return password;}

3.启动效果WelcomeActivity.java

package and.yjg.music_app; 
import android.content.Intent;
import android.os.Bundle;
import android.os.CountDownTimer;
import android.widget.TextView;
import androidx.appcompat.app.AppCompatActivity;
import Login.LoginActivity;
public class WelcomeActivity extends AppCompatActivity {private TextView tvCountdown;private CountDownTimer countDownTimer;private long timeLeftInMillis = 3000;protected void onCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.activity_welcome);tvCountdown = findViewById(R.id.tv_countdown);startCountdown();}private void startCountdown() {countDownTimer = new CountDownTimer(timeLeftInMillis,1000){public void onTick(long millisUntilFinished){timeLeftInMillis = millisUntilFinished;int secondsRemaining = (int) (millisUntilFinished/1000);tvCountdown.setText(secondsRemaining+"s");}public void onFinish(){startActivity(new Intent(WelcomeActivity.this, LoginActivity.class));finish();}}.start();}
protected  void onDestroy(){super.onDestroy();if (countDownTimer != null){countDownTimer.cancel();}}
}

4.用户登录LoginActivity.java

package Login;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
import androidx.appcompat.app.ActionBar;
import androidx.appcompat.app.AppCompatActivity;
import and.yjg.music_app.MainActivity;
import and.yjg.music_app.R;
public class LoginActivity extends AppCompatActivity {private Button btn_login;    private Button btn_register;private EditText et_account;private EditText et_password;private UserDao dao;        @Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_login);initView();}public void initView() {ActionBar actionBar = getSupportActionBar();if(actionBar != null){actionBar.hide();}btn_login = findViewById(R.id.btn_login);btn_register = findViewById(R.id.btn_register);et_account = findViewById(R.id.et_account);et_password = findViewById(R.id.et_password);btn_login.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {String acc = et_account.getText().toString().trim();String pass = et_password.getText().toString().trim();dao = new UserDao(getApplicationContext());dao.open();if (dao.isExist(acc) == false) {Toast.makeText(LoginActivity.this,"账号不存在,请重新输入!", Toast.LENGTH_SHORT).show();} else {if (dao.getPassword(acc).equals(pass)) {Intent intent = new Intent(LoginActivity.this, MainActivity.class);startActivity(intent);finish();} else {Toast.makeText(LoginActivity.this, "密码错误,请重新输入!", Toast.LENGTH_SHORT).show();}}dao.close();}});btn_register.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {Intent intent = new Intent(LoginActivity.this, RegisterActivity.class);startActivityForResult(intent,1);}});}@Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data){super.onActivityResult(requestCode, resultCode, data);if(data != null){if(requestCode == 1 && resultCode == 1){String name = data.getStringExtra("acc");String password = data.getStringExtra("pass");et_account.setText(name);et_password.setText(password);}}

五、各类布局文件

  activity_welcom.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"tools:context=".WelcomeActivity"><TextViewandroid:id="@+id/tv_countdown"android:layout_width="100dp"android:layout_height="60dp"android:layout_alignParentRight="true"android:layout_alignParentBottom="true"android:layout_marginRight="6dp"android:layout_marginBottom="89dp"android:background="@color/Blue"android:gravity="center"android:text="3s"android:textSize="30dp" /><ImageViewandroid:layout_width="match_parent"android:layout_height="wrap_content"android:src="@mipmap/action" />
</RelativeLayout>

activity_login.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:background="@color/White"android:orientation="vertical"><ImageViewandroid:id='@+id/iv'android:layout_width="match_parent"android:layout_height="30dp"android:layout_centerHorizontal="true"android:layout_marginTop="0dp"android:background="@color/Black"/><LinearLayoutandroid:id="@+id/account"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_below="@id/iv"android:layout_centerVertical="true"android:layout_marginBottom="5dp"android:layout_marginLeft="10dp"android:layout_marginRight="10dp"android:layout_marginTop="40dp"android:orientation="horizontal"><TextViewandroid:id="@+id/tv_account"android:layout_width="wrap_content"android:layout_height="wrap_content"android:padding="10dp"android:text="账 号"android:textColor="#000"android:background="@drawable/text_style"android:textSize="25sp" /><Viewandroid:layout_width="1dp"android:layout_height="match_parent"android:background="@color/Gray"/><EditTextandroid:id="@+id/et_account"android:layout_width="match_parent"android:layout_height="match_parent"android:background="@drawable/edit_style"android:hint="请输入账号"android:textColor="@color/Gray"android:textSize="20sp"android:gravity="center"android:inputType="text"android:padding="10dp" /></LinearLayout><LinearLayoutandroid:id="@+id/password"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_below="@+id/account"android:layout_centerVertical="true"android:layout_marginLeft="10dp"android:layout_marginRight="10dp"android:orientation="horizontal"><TextViewandroid:id="@+id/tv_password"android:layout_width="wrap_content"android:layout_height="wrap_content"android:padding="10dp"android:text="密 码"android:background="@drawable/text_style"android:textColor="#000"android:textSize="25sp"/><Viewandroid:layout_width="1dp"android:layout_height="match_parent"android:background="@color/Gray"/><EditTextandroid:id="@+id/et_password"android:layout_width="match_parent"android:layout_height="match_parent"android:layout_toRightOf="@id/tv_password"android:hint="请输入密码"android:textColor="@color/Gray"android:textSize="20sp"android:gravity="center"android:background="@drawable/edit_style"android:inputType="textPassword"android:padding="10dp"/></LinearLayout><Buttonandroid:id="@+id/btn_login"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_marginTop="40dp"android:layout_marginLeft="10dp"android:layout_marginRight="10dp"android:background="@drawable/button_style"android:gravity="center"android:text="登录"android:textColor="#ffffff"android:textSize="30sp"android:layout_below="@+id/password"/><Buttonandroid:id="@+id/btn_register"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_marginTop="20dp"android:layout_marginLeft="10dp"android:layout_marginRight="10dp"android:background="@drawable/button_style"android:gravity="center"android:text="注册"android:textColor="#ffffff"android:textSize="30sp"android:layout_below="@+id/btn_login" />
</RelativeLayout>

总结:在这次基于Android Studio的音视频播放系统设计与实现的课程设计中,我不仅掌握了一系列关键技术和工具,还对整个项目开发流程有了更深入的理解。:熟悉并掌握了Android Studio的开发环境,包括如何设置、配置项目,以及使用内置的工具如模拟器进行测试。深入了解了Android SDK和相关API,特别是与音视频播放相关的部分,如MediaPlayer、VideoView等。

此外,这次实验中,我还遇到一些数据传递中断问题,所以我还查看了一些使用断电调试的方法,也是得我掌握了一些关于断点调试的有关用法,这也让我意识到断点调试与良好的代码组织和注释习惯是相辅相成的。一个清晰、有良好注释的代码结构使得断点调试更为有效,因为你可以快速了解每一部分代码的作用和相互关系。

通过这次课程设计,我不仅提高了技术能力,更重要的是学会了如何综合运用这些技术来解决实际问题。

由于篇幅限制,此处就只放了部分代码,其实也还够用,有需要的尽可拿去用。另外在这里附上这个项目的完整代码链接https://download.csdn.net/download/weixin_74924162/89248276​​​​​​

这里分享一个做了页面美化的版本链接给有需要的伙伴:Android studio音频视频播放器课程设计(继上一个项目,这里做了稍许的美化改动以及部分功能的改动)-CSDN博客

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/44274.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

20240711 每日AI必读资讯

&#x1f3a8;Runway Gen-3 Alpha 详细使用教程以及提示词指南大全 - 7月9日&#xff0c;著名生成式AI平台Runway在官网公布了&#xff0c;最新发布的文生视频模型Gen-3 Alpha的文本提示教程。 - 从技术层面来说&#xff0c;输入的文本提示会被转换成“向量”&#xff0c;这些…

深入理解Python密码学:使用PyCrypto库进行加密和解密

深入理解Python密码学&#xff1a;使用PyCrypto库进行加密和解密 引言 在现代计算领域&#xff0c;信息安全逐渐成为焦点话题。密码学&#xff0c;作为信息保护的关键技术之一&#xff0c;允许我们加密&#xff08;保密&#xff09;和解密&#xff08;解密&#xff09;数据。P…

通过Umijs从0到1搭建一个React项目

有一阵时间没写react了&#xff0c;今天通过umi搭建一个demo项目复习一下react&#xff1b;umi是一个可扩展的企业级前端应用框架&#xff0c;在react市场中还是比较火的一个框架。 Umi官方文档&#xff1a;Umi 介绍 (umijs.org) 一、构建项目。 1、安装包管理工具。 官方推…

力扣题解(设计跳表)

1206.设计跳表 已解答 不使用任何库函数&#xff0c;设计一个 跳表 。 跳表 是在 O(log(n)) 时间内完成增加、删除、搜索操作的数据结构。跳表相比于树堆与红黑树&#xff0c;其功能与性能相当&#xff0c;并且跳表的代码长度相较下更短&#xff0c;其设计思想与链表相似。 …

【观成科技】Websocket协议代理隧道加密流量分析与检测

Websocket协议代理隧道加密流量简介 攻防场景下&#xff0c;Websocket协议常被用于代理隧道的搭建&#xff0c;攻击者企图通过Websocket协议来绕过网络限制&#xff0c;搭建一个低延迟、双向实时数据传输的隧道。当前&#xff0c;主流的支持Websocket通信代理的工具有&#xf…

构建高精度室内定位导航系统,从3DGIS到AI路径规划的全面解析

室内定位导航系统是一种利用多种技术实现室内精准定位和导航的智能系统&#xff0c;即便没有卫星信号&#xff0c;也能实现精准导航。维小帮室内定位导航系统是基于自研的地图引擎与先进定位技术&#xff0c;结合智能路径规划算法&#xff0c;解决了人们在大型复杂室内场所最后…

【深度学习】图形模型基础(6):模型优化理论

1.引言 在之前的讨论中&#xff0c;我们构建了一个理论模型来表达最优决策规则&#xff0c;这是建立在我们对数据的概率模型有充分理解的基础上的。相对地&#xff0c;经验风险最小化&#xff08;Empirical Risk Minimization, ERM&#xff09;策略则在缺乏精确概率模型的情况…

Java语言程序设计——篇三(1)

选择结构 概述选择单分支if语句例题讲解 双分支if-else语句例题讲解 条件运算符多分支的if-else语句例题讲解 嵌套的if语句例题讲解 switch语句结构例题讲解代码演示运行结果 概述 Java中的控制结构&#xff0c;包括&#xff1a; 1、选择结构( if、if-else、switch ) 2、循环结…

仕考网:非应届生可以参加公务员考试吗?

往届生有资格参加国家公务员考试。根据《公务员录用规定》&#xff0c;只要满足一系列资格条件&#xff0c;就符合报考资格。 1、年龄在18到35岁之间。 2、具备良好的品德&#xff0c;身体健康且心理素质稳定&#xff0c;拥有拟任职位所需的工作能力。 3、至少为大学专科以上…

【排序 - 归并排序】

归并排序&#xff08;Merge Sort&#xff09;是一种高效的排序算法&#xff0c;基于分治&#xff08;Divide and Conquer&#xff09;策略。它将待排序数组分成两个较小的子数组&#xff0c;分别对它们进行排序&#xff0c;然后将排好序的子数组合并成一个整体有序的数组。归并…

愚人杯的RE题

easy_pyc pyc反编译成py文件 # uncompyle6 version 3.9.1 # Python bytecode version base 2.7 (62211) # Decompiled from: Python 3.11.8 (tags/v3.11.8:db85d51, Feb 6 2024, 22:03:32) [MSC v.1937 64 bit (AMD64)] # Embedded file name: enpyc.py # Compiled at: 2023…

html5——列表、表格

目录 列表 无序列表 有序列表 自定义列表 表格 基本结构 示例 表格的跨列 表格的跨行 列表 无序列表 <ul>【声明无序列表】 <li>河间驴肉火烧</li>【声明列表项】 <li>唐山棋子烧饼</li> <li>邯郸豆沫</li> <l…

opencv实现目标检测功能----20240704

早在 2017 年 8 月,OpenCV 3.3 正式发布,带来了高度改进的“深度神经网络”(dnn)模块。 该模块支持多种深度学习框架,包括 Caffe、TensorFlow 和 Torch/PyTorch。这次我们使用Opencv深度学习的功能实现目标检测的功能,模型选用MobileNetSSD_deploy.caffemodel。 模型加载…

机器学习与深度学习:区别与联系(含工作站硬件推荐)

一、机器学习与深度学习区别 机器学习&#xff08;ML&#xff1a;Machine Learning&#xff09;与深度学习&#xff08;DL&#xff1a;Deep Learning&#xff09;是人工智能&#xff08;AI&#xff09;领域内两个重要但不同的技术。它们在定义、数据依赖性以及硬件依赖性等方面…

空中交通新动能!2024深圳eVTOL展动力电池展区核心内容抢先看!

空中交通新动能&#xff01;2024深圳eVTOL展动力电池展区核心内容抢先看&#xff01; 关键词&#xff1a;2024深圳eVTOL展 动力电池 高能量密度电池 高性能电池材料 作为2024深圳eVTOL展重要组成部分&#xff0c;2024深圳eVTOL动力电池展将于9月23-25日在深圳坪山燕子湖国际会…

基于JAVA+SpringBoot+Vue的社区普法平台

✌全网粉丝20W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取项目下载方式&#x1f345; 一、项目背景介绍&#xff1a; 社区普法平台旨在为社…

Python程序封装成Windows服务实践

1. WinSW 工具概述 WinSW&#xff08;Windows Service Wrapper&#xff09;是一个轻量级的、开源的工具&#xff0c;用于将任何可执行文件&#xff08;包括exe、jar、脚本文件等&#xff09;包装成一个Windows服务。这意味着&#xff0c;原本设计为命令行应用或需要手动启动的…

内存条必备知识

什么是内存条&#xff1f; 内存条&#xff1a;又称为随机存取存储器&#xff08;RAM&#xff09;&#xff0c;也叫主存&#xff0c;是与CPU直接交换数据的内部存储器。它可以随时读写&#xff08;刷新时除外&#xff09;&#xff0c;而且速度很快&#xff0c;通常用来暂时存储…

了解劳动准备差距:人力资源专业人员的战略

劳动准备差距是一个紧迫的问题&#xff0c;在全球人事部门回应&#xff0c;谈论未开发的潜力和错过的机会。想象一下&#xff0c;人才和需求之间的悬崖之间有一座桥&#xff0c;这促使雇主思考&#xff1a;我们是否为员工提供了足够的设备来应对未来的考验&#xff1f; 这种不…

碳化硅陶瓷膜的基本性能

碳化硅陶瓷膜作为一种由碳化硅(SiC)材料制成的高温陶瓷膜&#xff0c;以其独特的性能在多个领域得到了广泛的应用。以下是碳化硅陶瓷膜的基本性能&#xff0c;详细阐述如下&#xff1a; 一、电绝缘性 碳化硅陶瓷膜通常具有较好的电绝缘性&#xff0c;这一特性在高温环境中尤为重…