Tải bản đầy đủ (.docx) (59 trang)

lập trình di động chủ đề ứng dụng nghe nhạc

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (1.22 MB, 59 trang )

<span class="text_page_counter">Trang 1</span><div class="page_container" data-page="1">

ĐẠI HỌC QUỐC GIA TP. HỒ CHÍ MINH

<b>TRƯỜNG ĐẠI HỌC AN GIANG</b>

<b>KHOA CƠNG NGHỆ THƠNG TIN</b>

</div><span class="text_page_counter">Trang 3</span><div class="page_container" data-page="3">

MỤC LỤC

Lời Nói Đầu...3

<b>I. MỤC TIÊU YÊU CẦU...4</b>

<b>II.1 Mục Tiêu...4</b>

<b>I.2 Yêu Cầu...5</b>

II. ĐỐI TƯỢNG SỬ DỤNG...6

II.1. Nhà phát triển ứng dụng:...6

II.2. Người quản lý nội dung âm nhạc:...6

II.3. Người dùng cuối (End Users):...6

III. PHÂN TÍCH THIẾT KẾ HỆ THỐNG...8

IV. GIAO DIỆN ỨNG DỤNG...9

IV.1. Giao diện Đăng nhập, Đăng ký...9

IV.2. Giao diện Quên mật khẩu và Đổi mật khẩu...10

IV.3. Giao diện Trang chủ người dùng...11

IV.4. Giao diện Chức năng người dùng...12

IV.5. Giao diện Phát nhạc và List nhạc đang phát...13

IV.6. Giao diện Thông báo phát nhạc...14

IV.7. Giao diện Nhạc đang phát mà trở về màn hình chính...15

IV.8. Giao diện Danh sách (List) tất cả nhạc của hệ thống...16

IV.9. Giao diện Các bài hát nổi bật...17

IV.10. Giao diện Các bài hát mới nhất...18

IV.11. Giao diện Kết nối với các diễn đàn và mạng xã hội...19

IV.12. Giao diện Đóng góp ý kiến về ứng dụng...20

IV.13. Giao diện Người quản trị (admin)...21

IV.13. Giao diện Thêm nhạc dành cho Người quản trị...22

IV.14. Giao diện Cập nhật nhạc dành cho Người quản trị...23

</div><span class="text_page_counter">Trang 4</span><div class="page_container" data-page="4">

V.8. Hiển thị danh sách bài hát mới nhất...44

V.9. Hiển thị danh sách bài hát đã yêu thích...46

V.10. Hiển thị tất cả các bài hát trên hệ thống...49

V.11. Kết nối đến mạng xã hội...51

V.12. Đổi mật khẩu...53

V.13. Thêm bài hát mới hoặc sửa bài hát...54

VI. TÀI LIỆU THAM KHẢO...58

<b>VI.1. Kho lưu trữ GitHub:...58</b>

<b>VI.2. Video YouTube:...58</b>

Lời Nói Đầu

Mơn học “Lập trình di động” là một phần quan trọng trongchương trình đào tạo ngành Cơng nghệ thơng tin. Trong khóa học này,sinh viên chúng em sẽ được trang bị kiến thức và kỹ năng cần thiết đểphát triển các ứng dụng di động cho các thiết bị như điện thoại thơngminh, máy tính bảng và các thiết bị di dộng khác. Nó giúp chúng em đãcùng nhau khám phá thế giới của ứng dụng di động.

Ngày nay, điện thoại thông minh và máy tính bảng đã trởthành một phần không thể thiếu của cuộc sống của chúng em . Chúngem sử dụng chúng để nghe nhạc, xem phim, đọc tin tức, và thậm chí làlàm việc. Và để tạo ra những ứng dụng tuyệt vời cho các thiết bị này,chúng em cần phải hiểu rõ về lập trình di động.

Chủ đề báo cáo của môn học này là “Ứng dụng Nghe Nhạc,”một lĩnh vực thú vị và phổ biến trong cuộc sống hàng ngày. chúng emsẽ học cách phát triển một ứng dụng nghe nhạc từ đầu đến cuối. Chúngem sẽ tìm hiểu về việc kết nối với các dịch vụ nhạc trực tuyến, xâydựng giao diện người dùng thân thiện, và tối ưu hóa hiệu suất ứngdụng. Điều này sẽ giúp các bạn có kiến thức thực tế và sẵn sàng ápdụng vào công việc sau khi tốt nghiệp.

4

</div><span class="text_page_counter">Trang 5</span><div class="page_container" data-page="5">

<b>I. MỤC TIÊU YÊU CẦU</b>

<b>II.1 Mục Tiêu</b>

<b> 1. Giao diện người dùng thân thiện:</b>

Thiết kế giao diện đơn giản, dễ sử dụng với các biểu tượng rõ ràng.

Đảm bảo giao diện phù hợp với mọi đối tượng người dùng, từ người mới sử dụng đến người dùng kỳ cựu.

<b> 2. Chức năng cơ bản của ứng dụng:</b>

<b>Phát nhạc: Hỗ trợ phát các tập tin âm thanh ở nhiều định dạng phổ biến (MP3, </b>

FLAC, AAC, vv.).

<b>Tìm kiếm nhạc: Cho phép người dùng tìm kiếm theo nghệ sĩ, album, bài hát, thể </b>

loại, và hiển thị kết quả chính xác.

<b>Danh sách phát yêu thích: Cho phép người dùng tạo danh sách nhạc yêu thích để </b>

dễ dàng truy cập.

<b>Điều chỉnh âm lượng và chất lượng âm thanh: Cung cấp thanh điều chỉnh âm </b>

lượng và tùy chọn chất lượng âm thanh.

<b>Hỗ trợ tai nghe và loa ngoài: Tự động chuyển đổi giữa loa ngoài và tai nghe khi </b>

cắm hoặc rút tai nghe.

<b> 3. Tính năng nâng cao (tùy chọn):</b>

<b>Chia sẻ nhạc: Hỗ trợ chia sẻ bài hát với bạn bè qua mạng xã </b>

hội hoặc ứng dụng nhắn tin.

<b>Gợi ý nhạc: Dựa trên sở thích của người dùng, gợi ý các bài hát</b>

<b> 4. Kiểm tra ổn định và hiệu suất:</b>

Thử nghiệm ứng dụng trên các thiết bị di động phổ biến (Android, iOS) để đảm bảo hoạt động ổn định và mượt mà.

5

</div><span class="text_page_counter">Trang 6</span><div class="page_container" data-page="6">

Xử lý các vấn đề liên quan đến tốc độ phản hồi, tiêu thụ tài nguyên, và khả năng phát nhạc liên tục.

 Tổng quát: Phát triển một ứng dụng nghe nhạc di động hồn chỉnh, đáp ứng nhu cầu giải trí và nghe nhạc của người dùng.

<b>I.2 Yêu Cầu</b>

<b> 1. Yêu cầu về chức năng: </b>

Ứng dụng phải đáp ứng đầy đủ các chức năng cơ bản của một ứng dụng nghe nhạc di động như đã nêu ở mục trên.

Các chức năng nâng cao (nếu có) phải được triển khai một cáchhồn chỉnh và hiệu quả.

Ứng dụng phải tương thích với nhiều phiên bản hệ điều hành Android phổ biến.

<b> 2. Yêu cầu về kỹ thuật: </b>

Ứng dụng được phát triển bằng ngơn ngữ lập trình Java.Sử dụng Android Studio làm mơi trường phát triển chính.Thiết kế giao diện người dùng đẹp mắt, thân thiện và dễ sử dụng.

Sử dụng các thư viện và API phù hợp để tối ưu hóa hiệu suất và tính năng của ứng dụng.

Viết code tuân theo các quy tắc lập trình tốt nhất, đảm bảo tínhbảo mật và dễ bảo trì.

<b> 3. u cầu về tài liệu: </b>

Báo cáo tài liệu đầy đủ, chi tiết về quá trình thiết kế, phát triển và thử nghiệm ứng dụng.

Bao gồm hướng dẫn sử dụng ứng dụng dành cho người dùng.Cung cấp mã nguồn đầy đủ của ứng dụng.

6

</div><span class="text_page_counter">Trang 7</span><div class="page_container" data-page="7">

II. ĐỐI TƯỢNG SỬ DỤNGII.1. Nhà phát triển ứng dụng:

<b>Quản lý nội dung toàn diện: </b>

Người quản lý nội dung âm nhạc có quyền truy cập vào các công cụ quản lý mạnh mẽ để tảilên, quản lý và phân loại các bài hát, album và nghệ sĩ.

Họ có thể thêm thơng tin chi tiết về âm nhạc, chỉnh sửa metadata, tạo danh sách phát vàsắp xếp nội dung theo nhiều tiêu chí khác nhau.

Điều này giúp đảm bảo tính chính xác, nhất quán và dễ dàng tìm kiếm nội dung âm nhạccho người dùng.

<b>Quyền kiểm soát nội dung: </b>

Người quản lý nội dung âm nhạc có thể kiểm sốt quyền truy cập vào nội dung, cho phéphọ giới hạn quyền truy cập vào một số nội dung nhất định hoặc cung cấp quyền truy cập độcquyền cho người dùng cụ thể.

Điều này hữu ích cho việc quản lý bản quyền, phân phối nội dung độc quyền hoặc tạo cácgói đăng ký trả phí.

II.3. Người dùng cuối (End Users):

<b>Ứng dụng nghe nhạc di động có thể được sử dụng bởi rất nhiều đối tượng, bao gồm:</b>

<b>Học sinh, sinh viên: </b>

o

Giải trí trong giờ nghỉ ngơi, thư giãn sau giờ học căng thẳng.

o

Nghe nhạc khi học tập, giúp tăng khả năng tập trung và ghi nhớ.

7

</div><span class="text_page_counter">Trang 8</span><div class="page_container" data-page="8">

<b>Người đi làm: </b>

o

Nghe nhạc khi di chuyển trên đường đi làm, giúp giảm bớt căng thẳng và mệt mỏi.

o

Nghe nhạc trong giờ nghỉ trưa để thư giãn và giải trí.

<b>Người cao tuổi: </b>

o

Nghe nhạc để thư giãn, giảm bớt stress và cải thiện sức khỏe tinh thần.

o

Nghe nhạc quen thuộc để gợi nhớ về những kỷ niệm đẹp trong quá khứ.

<b>Các vận động viên: </b>

o

Nghe nhạc trước khi tập luyện để tăng cường động lực và tinh thần.

o

Nghe nhạc khi tập luyện để giúp cơ thể vận động nhịp nhàng và hiệu quả hơn.

<b>Nghệ sĩ: </b>

o

Nghe nhạc để lấy cảm hứng sáng tác.

o

Nghe nhạc của các nghệ sĩ khác để học hỏi và trau dồi kỹ năng âm nhạc.

<b>Ngoài ra, ứng dụng này cịn có thể được sử dụng cho nhiều mục đích khác nhau như:</b>

<b>Giáo dục: </b>

o

Nghe nhạc tiếng Anh để học ngoại ngữ.

o

Nghe nhạc thiếu nhi để giáo dục trẻ em.

<b>Kinh doanh: </b>

o

Phát nhạc trong cửa hàng để tạo bầu khơng khí mua sắm thoải mái.

o

Sử dụng nhạc quảng cáo để thu hút khách hàng.

</div><span class="text_page_counter">Trang 9</span><div class="page_container" data-page="9">

III. PHÂN TÍCH THIẾT KẾ HỆ THỐNG

9

</div><span class="text_page_counter">Trang 10</span><div class="page_container" data-page="10">

IV. GIAO DIỆN ỨNG DỤNG IV.1. Giao diện Đăng nhập, Đăng ký

10

</div><span class="text_page_counter">Trang 11</span><div class="page_container" data-page="11">

IV.2. Giao diện Quên mật khẩu và Đổi mật khẩu

11

</div><span class="text_page_counter">Trang 12</span><div class="page_container" data-page="12">

IV.3. Giao diện Trang chủ người dùng

12

</div><span class="text_page_counter">Trang 13</span><div class="page_container" data-page="13">

IV.4. Giao diện Chức năng người dùng

13

</div><span class="text_page_counter">Trang 14</span><div class="page_container" data-page="14">

IV.5. Giao diện Phát nhạc và List nhạc đang phát

14

</div><span class="text_page_counter">Trang 15</span><div class="page_container" data-page="15">

IV.6. Giao diện Thông báo phát nhạc

15

</div><span class="text_page_counter">Trang 16</span><div class="page_container" data-page="16">

IV.7. Giao diện Nhạc đang phát mà trở về màn hình chính

16

</div><span class="text_page_counter">Trang 17</span><div class="page_container" data-page="17">

IV.8. Giao diện Danh sách (List) tất cả nhạc của hệ thống

17

</div><span class="text_page_counter">Trang 18</span><div class="page_container" data-page="18">

IV.9. Giao diện Các bài hát nổi bật

18

</div><span class="text_page_counter">Trang 19</span><div class="page_container" data-page="19">

IV.10. Giao diện Các bài hát mới nhất

19

</div><span class="text_page_counter">Trang 20</span><div class="page_container" data-page="20">

IV.11. Giao diện Kết nối với các diễn đàn và mạng xã hội

20

</div><span class="text_page_counter">Trang 21</span><div class="page_container" data-page="21">

IV.12. Giao diện Đóng góp ý kiến về ứng dụng

21

</div><span class="text_page_counter">Trang 22</span><div class="page_container" data-page="22">

IV.13. Giao diện Người quản trị (admin)

22

</div><span class="text_page_counter">Trang 23</span><div class="page_container" data-page="23">

IV.13. Giao diện Thêm nhạc dành cho Người quản trị

23

</div><span class="text_page_counter">Trang 24</span><div class="page_container" data-page="24">

IV.14. Giao diện Cập nhật nhạc dành cho Người quản trị

24

</div><span class="text_page_counter">Trang 25</span><div class="page_container" data-page="25">

V. CÁC CHỨC NĂNG CỦA ỨNG DỤNGV.1. Kết nối với firebase (Sử lý trong hệ thống)

<b>* Mô tả</b>

Để kết nối ứng dụng với Firebase ta cần khởi tạo 1 dự án trên Firebase và kết nối ứngdụng với Firebase thông qua tên của gói (name-package của dự án) và thêm fileservices.json của firebase bằng cách tải về và thêm vào thư mục có tên là app để thực hiệnkết nối.

Tiếp theo cần dán đường link dự án trên Firebase vào file MyApplication. File nàyđược tạo ra để kết nối với Firebase. Và lấy các liên kết đến các bảng dữ liệu trên Firebase.Để thực hiện các việc như lấy dữ liệu, thêm dữ liệu và xóa dữ liệu.

public static MyApplication get(Context context) {

return (MyApplication) context.getApplicationContext(); }

private void createChannelNotification() {

if (Build.VERSION.<i>SDK_INT </i>>= Build.VERSION_CODES.<i>O</i>) {

NotificationChannel channel = new NotificationChannel(<i>CHANNEL_ID</i>, <i>CHANNEL_NAME</i>, NotificationManager.<i>IMPORTANCE_MIN</i>);

25

</div><span class="text_page_counter">Trang 26</span><div class="page_container" data-page="26">

channel.setSound(null, null);

NotificationManager manager = getSystemService(NotificationManager.class); manager.createNotificationChannel(channel);

} }

public DatabaseReference getSongsDatabaseReference() { return mFirebaseDatabase.getReference("/songs"); }

public DatabaseReference getFeedbackDatabaseReference() { return mFirebaseDatabase.getReference("/feedback"); }

public DatabaseReference getCountViewDatabaseReference(long songId) {

return <i>FirebaseDatabase.getInstance().getReference(</i>"/songs/" + songId + "/count"); }

package com.medium.music.activity;import android.os.Bundle;

import android.widget.Toast;import com.medium.music.R;

import com.medium.music.constant.Constant;

import com.medium.music.constant.GlobalFunction;

import com.medium.music.databinding.ActivitySignUpBinding;import com.medium.music.model.User;

import com.medium.music.prefs.DataStoreManager;import com.medium.music.utils.StringUtil;

import com.google.firebase.auth.FirebaseAuth;import com.google.firebase.auth.FirebaseUser;

public class SignUpActivity extends BaseActivity {

private ActivitySignUpBinding mActivitySignUpBinding; @Override

protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState);

mActivitySignUpBinding =

26

</div><span class="text_page_counter">Trang 27</span><div class="page_container" data-page="27">

setContentView(mActivitySignUpBinding.getRoot()); mActivitySignUpBinding.rdbUser.setChecked(true);

mActivitySignUpBinding.imgBack.setOnClickListener(v -> onBackPressed());

mActivitySignUpBinding.layoutSignIn.setOnClickListener(v -> finish());

mActivitySignUpBinding.btnSignUp.setOnClickListener(v -> onClickValidateSignUp());

} else if (StringUtil.isEmpty(strPassword)) {

<i> Toast.makeText(SignUpActivity.this, </i>

getString(R.string.<i>msg_password_require</i>), Toast.<i>LENGTH_SHORT</i>).show();

} else if (!StringUtil.isValidEmail(strEmail)) {

<i> Toast.makeText(SignUpActivity.this, </i>

getString(R.string.<i>msg_email_invalid</i>), Toast.<i>LENGTH_SHORT</i>).show();

} else {

signUpUser(strEmail, strPassword); }

return; }

if (strEmail.contains(Constant.<i>ADMIN_EMAIL_FORMAT</i>)) {

<i> Toast.makeText(SignUpActivity.this, </i>

getString(R.string.<i>msg_email_invalid_user</i>), Toast.<i>LENGTH_SHORT</i>).show();

} else {

signUpUser(strEmail, strPassword); }

} }

27

</div><span class="text_page_counter">Trang 28</span><div class="page_container" data-page="28">

private void signUpUser(String email, String password) { showProgressDialog(true);

<i> FirebaseAuth firebaseAuth = FirebaseAuth.getInstance();</i>

firebaseAuth.createUserWithEmailAndPassword(email, password)

.addOnCompleteListener(this, task -> { showProgressDialog(false);

if (task.isSuccessful()) { FirebaseUser user =

</div><span class="text_page_counter">Trang 29</span><div class="page_container" data-page="29">

import com.medium.music.prefs.DataStoreManager;

import com.medium.music.utils.StringUtil;

import com.google.firebase.auth.FirebaseAuth;

import com.google.firebase.auth.FirebaseUser;

public class SignInActivity extends BaseActivity {

private ActivitySignInBinding mActivitySignInBinding; @Override

protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState);

mActivitySignInBinding =

setContentView(mActivitySignInBinding.getRoot());

// mặc định khởi đầu là check người dùng

mActivitySignInBinding.rdbUser.setChecked(true);

mActivitySignInBinding.layoutSignUp.setOnClickListener(

<i> v -> GlobalFunction.startActivity(SignInActivity.</i>this, SignUpActivity.class));

private void onClickForgotPassword() {

<i> GlobalFunction.startActivity(</i>this, ForgotPasswordActivity.class); }

private void onClickValidateSignIn() { String strEmail =

mActivitySignInBinding.edtEmail.getText().toString().trim(); String strPassword =

mActivitySignInBinding.edtPassword.getText().toString().trim(); if <i>(StringUtil.isEmpty(strEmail)) {</i>

return; }

</div><span class="text_page_counter">Trang 30</span><div class="page_container" data-page="30">

signInUser(strEmail, strPassword); }

} }

private void signInUser(String email, String password) { showProgressDialog(true);

<i> FirebaseAuth firebaseAuth = FirebaseAuth.getInstance();</i>

// thực hiện quá trình đăng nhập từ phía firebase khi truyền vào gmail và pass

FirebaseUser user = firebaseAuth.getCurrentUser(); if (user != null) {

User userObject = new User(user.getEmail(),

//Kiểm tra xem email của người dùng có chứa định dạng email của quản trị viên (kiểm tra với hằng số Constant.ADMIN_EMAIL_FORMATđã được định nghĩa)

if (user.getEmail() != null && user.getEmail().contains(Constant.<i>ADMIN_EMAIL_FORMAT</i>)) { userObject.setAdmin(true); }

<i> DataStoreManager.setUser(userObject);</i>

<i> GlobalFunction.startActivity(SignInActivity.</i>this, MainActivity.class);

finishAffinity(); // đóng các tác vụ khác đang chạy

} } else {

<i> Toast.makeText(SignInActivity.</i>this, getString(R.string.<i>msg_sign_in_error</i>),

Toast.<i>LENGTH_SHORT</i>).show(); }

}); }

</div><span class="text_page_counter">Trang 31</span><div class="page_container" data-page="31">

protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState);

mActivityForgotPasswordBinding =

setContentView(mActivityForgotPasswordBinding.getRoot());

mActivityForgotPasswordBinding.imgBack.setOnClickListener(v -> onBackPressed());

<i> Toast.makeText(ForgotPasswordActivity.</i>this,

</div><span class="text_page_counter">Trang 32</span><div class="page_container" data-page="32">

Khi người dùng đăng nhập thành cơng vào giao diện chính (HomeScreen) dữ liệutừ database trên Firebase sẽ được tải xuống. Quá trình này nhanh hay chậm phụ thuộcvào internet của thiết bị. Để lấy dữ liệu từ Firebase tại code này cần phải kết nối đếnfile MyApplication đây là file thực hiện việc kết nối đến cơ sở dữ liệu trên Firebase(Mục kết nối file Firebase bên trên có nói rõ). Giao diện chính sẽ gọi đến fileMyApplication rồi từ file MyApplication sẽ kết nối với cơ sở dữ liệu và lấy dữ liệu rồitrả về cho nơi yêu cầu lấy là tại giao diện HomeScreen này.

import androidx.annotation.NonNull;

import androidx.annotation.Nullable;

public class HomeFragment extends Fragment {

private FragmentHomeBinding mFragmentHomeBinding; private List<Song> mListSong;

private List<Song> mListSongBanner;

private final Handler mHandlerBanner = new Handler();

32

</div><span class="text_page_counter">Trang 33</span><div class="page_container" data-page="33">

private final Runnable mRunnableBanner = new Runnable() { @Override

public void run() {

if (mListSongBanner == null || mListSongBanner.isEmpty()) { return;

g viewpager2.setCurrentItem(mFragmentHomeBinding.viewpager2.getCurrentItem() +

} };

@Nullable @Override

public View onCreateView(@NonNull LayoutInflater inflater, @Nullable

ViewGroup container, @Nullable Bundle savedInstanceState) {

mFragmentHomeBinding <i>= FragmentHomeBinding.inflate(inflater, </i>

container, false);

getListSongFromFirebase(""); initListener();

return mFragmentHomeBinding.getRoot(); }

private void initListener() {

mFragmentHomeBinding.edtSearchName.addTextChangedListener(new

TextWatcher() {

@Override

public void beforeTextChanged(CharSequence s, int start, int

count, int after) {

// Do nothing }

@Override

public void onTextChanged(CharSequence s, int start, int before,

int count) {

// Do nothing }

@Override

public void afterTextChanged(Editable s) { String strKey = s.toString().trim();

if (strKey.equals("") || strKey.length() == 0) { if (mListSong != null) mListSong.clear(); getListSongFromFirebase("");

} } });

mFragmentHomeBinding.imgSearch.setOnClickListener(view -> searchSong());

mFragmentHomeBinding.edtSearchName.setOnEditorActionListener((v, actionId, event) -> {

if (actionId == EditorInfo.<i>IME_ACTION_SEARCH</i>) { searchSong();

33

</div>

×