这个项目适合刚刚学习android studio的初学者,实现音视频的基本播放功能,各项功能的页面都做的比较简单,特别适用于初学者,其特点在于本项目抛开了各种花里胡哨的制作,以最接近初学者的样式画面呈现,完全不用担心被质疑套用别人的项目,要是实在追求完美的话,本文末尾也附上了经过美化后的相同项目链接。
基于android studio的音视频播放系统设计与实现
一、问题描述
音视频播放系统包括:使用sqlite创建数据库用于存储用户信息、启动效果、用户注册、用户登录、显示用户信息、音乐播放、视频播放等功能。
二、功能描述
设计一个音视频播放器app,使之能够实现以下功能:
- 创建一个数据库用于存储用户信息。
- 启动效果:该app设计了启动页面,启动后倒计时3s后可进入app。
- 用户登录注册:该app提供用户登录和注册功能,用户可以创建新账户或使用现有账户登录。当用户注册完成后跳转回到登录页面进行用户登录。用户需要提供有效的用户名和密码进行身份验证。
- 显示用户信息:用户登录后可点击信息按钮查看用户信息,包括历史登录用户的用户信息。
- 音乐播放功能:用户登录后,可以通过该app浏览和播放音乐文件。app提供音乐列表,用户可以浏览并选择要播放的音乐。点击音乐后,将跳转到音乐播放页面,可进行音乐的播放、暂停、上一曲和下一曲以及拖动进度条来控制音乐播放。
- 视频播放功能:该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;
@override
protected 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() {
@override
public 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() {
@override
public void onclick(view v) {
intent intent = new intent(loginactivity.this, registeractivity.class);
startactivityforresult(intent,1);
}
});
}
@override
protected 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">
<textview
android: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" />
<imageview
android: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">
<imageview
android:id='@+id/iv'
android:layout_width="match_parent"
android:layout_height="30dp"
android:layout_centerhorizontal="true"
android:layout_margintop="0dp"
android:background="@color/black"/>
<linearlayout
android: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">
<textview
android: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" />
<view
android:layout_width="1dp"
android:layout_height="match_parent"
android:background="@color/gray"/>
<edittext
android: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>
<linearlayout
android: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">
<textview
android: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"/>
<view
android:layout_width="1dp"
android:layout_height="match_parent"
android:background="@color/gray"/>
<edittext
android: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>
<button
android: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"/>
<button
android: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等。
此外,这次实验中,我还遇到一些数据传递中断问题,所以我还查看了一些使用断电调试的方法,也是得我掌握了一些关于断点调试的有关用法,这也让我意识到断点调试与良好的代码组织和注释习惯是相辅相成的。一个清晰、有良好注释的代码结构使得断点调试更为有效,因为你可以快速了解每一部分代码的作用和相互关系。
通过这次课程设计,我不仅提高了技术能力,更重要的是学会了如何综合运用这些技术来解决实际问题。
由于篇幅限制,此处就只放了部分代码,其实也还够用,有需要的尽可拿去用。另外在这里附上这个项目的完整代码链接。
这里分享一个做了页面美化的版本链接给有需要的伙伴:android studio音频视频播放器课程设计(继上一个项目,这里做了稍许的美化改动以及部分功能的改动)-csdn博客
发表评论