MỤC LỤC LỜI CẢM ƠN BẢNG TỪ VIẾT TẮT DANH MỤC HÌNH ẢNH LỜI CAM ĐOAN PHẦN MỞ ĐẦU 1. Đặt vấn đề 1 2. Tổng quan đề tài 1 CHƯƠNG 1: CƠ SỞ LÝ THUYẾT 3 1.1 Android và lịch sử phát triển 3 1.2 Kiến trúc của Android 4 1.2.1 Linux Kernel 4 1.2.2 Library và Android Runtime 5 1.2.3 Framework 7 1.2.4 Aplication 8 1.3 Các thành phần của Android 9 1.3.1 Thành phần của một chương trình Android 9 1.3.2 Các thành phần giao diện Widget 14 1.3.3 Bắt sự kiện trong Android 14 1.3.4 Menu 15 CHƯƠNG 2: PHÂN TÍCH THIẾT KẾ HỆ THỐNG 16 2.1. Mô tả quy trình của mạng xã hội chia sẻ video My Vid 16 2.1.1. Quy trình xem video 16 2.1.2. Quy trình nhận xét video 16 2.1.3. Quy trình chia sẻ video 16 2.1.4. Quy trình yêu thích video 16 2.1.5. Quy trình quay video 16 2.1.6. Quy trình lưu video 16 2.2. Sơ đồ usecase 17 2.2.1. Usecase tổng quát 17 2.2.2. Sơ đồ usecase phân rã tương tác đăng nhập 17 2.2.3. Sơ đồ usecase phân rã tương tác với video 19 2.2.4. Sơ đồ usecase phân rã tương tác với User 21 2.1.5. Sơ đồ usecase phân rã quản lý user 24 2.1.6. Sơ đồ usecase phân rã quản lý video 26 2.1.7. Sơ đồ usecase phân rã quản lý nhạc 28 2.1.8. Sơ đồ usecase phân rã quản lý nhạc 30 2.3. Sơ đồ lớp 38 2.3.1. Sơ đồ lớp tổng quan 38 2.3.2. Sơ đồ lớp user 39 2.3.3. Sơ đồ lớp device 40 2.3.4. Sơ đồ lớp video 40 2.3.5. Sơ đồ lớp category 41 2.5.7. Sơ đồ lớp lyric 41 2.5.8. Sơ đồ lớp thư viện nhạc 42 2.6. Cấu trúc dữ liệu Real Time database 42 2.6.1. Cấu trúc dữ liệu class User 42 2.6.2. Cấu trúc dữ liệu class ListMedia 44 2.6.3. Cấu trúc dữ liệu class ListVideo 46 2.6.4. Cấu trúc dữ liệu class Messenger 48 2.6.5. Cấu trúc dữ liệu class NotifyPrivate 49 CHƯƠNG 3 XÂY DỰNG ỨNG DỤNG 50 3.1. Mô hình hệ thống My Vid 50 3.1.1. Server My Vid 50 3.1.2. Server Firebase 50 3.1.3. Android client 51 3.2. Mô hình MVP 51 3.2.1. Khác nhau giữa MVP và MVC 52 3.2.2. Các điểm quan trọng khi sử dụng mô hình VMP 53 3.2.3. Lợi ích của mô hình MVP 53 KẾT LUẬN VÀ KIẾN NGHỊ PHỤ LỤC
TRƯỜNG ĐẠI HỌC TÀI NGUYÊN VÀ MÔI TRƯỜNG HÀ NỘI KHOA CÔNG NGHỆ THÔNG TIN PHÁT TRIỂN ỨNG DỤNG GIẢI TRÍ TRÊN NỀN TẢNG ANDROID HÀ NỘI - 2017 TRƯỜNG ĐẠI HỌC TÀI NGUYÊN VÀ MÔI TRƯỜNG HÀ NỘI KHOA CÔNG NGHỆ THÔNG TIN TRƯƠNG MINH PHÚC PHÁT TRIỂN ỨNG DỤNG GIẢI TRÍ TRÊN NỀN TẢNG ANDROID Chuyên ngành : Công nghệ thông tin Mã ngành : D480201 NGƯỜI HƯỚNG DẪN: ThS LÊ LAN ANH HÀ NỘI - 2017 LỜI CẢM ƠN Trên thực tế thành công mà không gắn liền với giúp đỡ người dù hay nhiều, dù trực tiếp hay gián tiếp Trong suốt thời gian học tập trình thực tập, em nhận nhiều quan tâm giúp đỡ nhiệt tình thầy cô, bạn bè gia đình Đầu tiên em xin gửi lời cảm ơn sâu sắc đến côLê Lan Anh, trực tiếp hướng dẫn giúp đỡ em nhiều thời gian làm đồ án Em xin gửi lời cảm ơn đến thầy cô khoa Công nghệ thông tin đồng thời giáo viên hướng dẫn cố Lê Lan Anh nhiệt tình giúp đỡ tạo điều kiện giúp em thuận lợi trình xây dựng đồ án Cuối cùng, em xin gửi lời cảm ơn chân thành tới gia đình bạn bè giúp đỡ, động viên tạo điều kiện tốt cho em suốt trình học tập sống Em xin chân thành cảm ơn! Sinh viên thực MỤC LỤC BẢNG TỪ VIẾT TẮT Từ viết tắt IDC SDK DEV CDMA GSM 3G 4G E CSS HTML AJAX DOM SQL OPEN GL JRE JVM API GPS APK CPU XML MVP MVC Cụm từ đầy đủ International Data Group Software Development Kit Deverlop Code Division Multiple Access Global System for Mobile ommunication Third Generation For Generation EDGE Cascading Style Sheets HyperText Markup Language Asynchronous JavaScript and XML Document Object Model Structured Query Language Open Graphics Library Java Virtual Machine Java Virtual Machine Application Programming Interface Global positioning system Android application package Central Processing Unit eXtensible Markup Language Model View Presenter Model - View - Controller DANH MỤC HÌNH ẢNH LỜI CAM ĐOAN Sinh viên: Trương Minh Phúc cam đoan ứng dụng độc lập riêng cá nhân sinh viên Các liệu sử dụng đồ án có nguồn gốc rõ ràng, công bố theo quy định Nếu có gian lận xin chịu hoàn toàn trách nhiệm nội dung đồ án Khoa công nghệ thông tin - trường đại học Tài Nguyên Môi Trường Hà Nội không liên quan đến vi phạm tác quyền, quyền gây trình thực PHẦN MỞ ĐẦU Đặt vấn đề Mạng điện thoại di độngxuất Việt Nam từ đầu năm 1990 theo thời gian số lượng thuê bao nhà cung cấp dịch vụ động Việt Nam ngày tăng Do nhu cầu trao đổi thông tin ngày tăng nhu cầu sử dụng sản phẩm công nghệ cao nhiều tính năng, cấu hình cao, chất lượng tốt, kiểu dáng mẫu mà đẹp, phong phú nên nhà cung cấp phải luôn cải thiện, nâng cao sản phẩm Do việc xây dựng ứng dụng cho điện thoại di động ngành công nghiệp đầy tiềm hứa hẹn nhiều phát triển vượt bậc ngành khoa học kĩ thuật Cùng với phát triển thị trường điện thoại di động phát triển mạnh mẽ xu hướng lập trình phần mềmứng dụng cho thiết bị di động Phần mềm, ứng dụng cho điện thoại di động đa dạng phong phú hệ điều hành di động phát triển mạnh mẽ thay đổi từ ngày Các hệ điều hành J2ME, Android, IOS, Hybrid, Web Based Mobile Application có phát triển thị trường truyền thông di động Trong vài năm trở lại đây, hệ điều hành Android đời với kế thừa ưu việt hệ điều hành đời trước kết hợp nhiều công nghệ tiên tiến nay, nhà phát triển công nghệ tiếng Google Android nhanh chóng đối thủ cạnh tranh mạnh mẽ với hệ điều hành trước hệ điều hành di động tương lai nhiều người ưa chuộng Ngày nay, với phát triển nhanh chóng xã hội, nhu cầu cập nhật tin tức xã hội lúc nơi cần thiết, em chọn đề tài “Phát triển ứng dụng giải trí tảng Android” với mục đích phục vụ nhu cầu giải trí tìm hiểu người cách nhanh chóng tiện lợi Tổng quan đề tài Ứng dụng giải trí có tên là: My Vid My Vid mạng xã hội chia sẻ video, khác với mạng xã hội khác youtube,1news…… My Vid cho phép bạn quay đoạn video ghép với đoạn nhạc hát đăng chia sẻ đoạn video Nghĩa ứng dụng cung cấp cho người dùng danh sách hát hay đoạn nhạc người dùng thể cho phù hợp với nội dung hát Có thể dùng ngôn ngữhay dùng phi ngôn ngữ để thể hát hay đoạn nhạc My Vid cho phép người dùng quay trực tiếp ứng dụng, My Vid hộ trợ trình xem video, chỉnh hiệu ứng video để người dùng chọn video ưng ý sau sử dụng lọc hình ảnh Ngoài việc quay video chỉnh sửa video, My Vid cho phép bạn upload, chia sẻ hay lưu lại video với bạn bè, tính bình luận trò chuyện tích hợp My Vid My Vid giới động dành riêng cho việc xả stress Nếu biết cách tận dụng My Vid tạo thu nhập cho người dùng CHƯƠNG 1: CƠ SỞ LÝ THUYẾT 1.1 Android lịch sử phát triển Android tảng phần mềm dựa mã nguồn mở Linux OS (Kernel 2.6) cho máy di động, máy tính bảng phần mềm trung gian (middleware) Nó không đơn hệ điều hành, công cụ lập trình hay phần mềm trung gian mà gồm tất Ban đầu, Android hệ điều hành cho thiết bị cầm tay dựa lõi Linux công ty Android Inc (California, Mỹ) thiết kế Công ty sau Google mua lại vào năm 2005 bắt đầu xây dựng Android Platform Và sau tiếp, vào cuối năm 2007, thuộc Liên minh thiết bị cầm tay mã nguồn mở(Open Handset Alliance) Mục tiêu liên minh nhanh chóng đổi để đáp ứng tốt cho nhu cầu người tiêu dùng kết tảng Android Android thiết kế để phục vụ nhu cầu nhà sản xuất thiết, nhà khai thác lập trình viên thiết bị cầm tay Phiên SDK lần phát hành vào tháng 11 năm 2007, hãng T-Mobile công bố điện thoại Android T-Mobile G1, smartphone dựa tảng Android Một vài ngày sau đó, Google lại tiếp tục công bố mắt phiên Android SDK release Candidate 1.0.Trong tháng 10 năm 2008, Google cấp giấy phép mã nguồn mở cho Android Platform Khi Android phát hành số mục tiêu kiến trúc cho phép ứng dụng tương tác với sử dụng lại thành phần từ ứng dụng khác Việc tái sử dụng không áp dụng cho cho dịch vụ mà áp dụng cho thành phần liệu giao diện người dùng Vào cuối năm 2008, Google cho phát hành thiết bị cầm tay gọi Android Dev Phone chạy ứng dụng Android mà không bị ràng buộc vào nhà cung cấp mạng điện thoại di động Mục tiêu thiết bị cho phép nhà phát triển thực thí nghiệm thiết bị thực chạy hệ điều hành Android mà ký hợp đồng Vào khoảng thời gian Google cho phát hành phiên vản vá lỗi 1.1 10 hệ điều hành này.Ở cảhai phiên 1.0 1.1 Android chưa hỗ trợ softkeyboard mà đòi hỏi thiết bịphải sử dụng bàn phím vật lý Android cố định vấn đề cách phát hành SDK 1.5 vào tháng Tư năm 2009, với số tính khác Chẳng hạn nâng cao khả ghi âm truyền thông, vật dụng, live folder 1.2 Kiến trúc Android Mô hình tổng quát thành phầncủa hệ điều hành Android Hình 1.1: Mô hình tổng quát thành phần Android 1.2.1 Linux Kernel Hệ điều hành Android phát dựa hạt nhân linux, cụ thể hạt nhân linux phiên 2.6, điều thể lớp Tất hoạt động điện thoại muốn thi hành thực mức cấp thấp lớp bao gồm quản lý nhớ (memory management), giao tiếp với phần cứng (driver model), thực bảo mật (security), quản lý tiến trình (process) Hình 1.2 Linux kernel Hướng dẫn trả lời bình luận Chuyển sang hình thông tin cá nhân Thả tim cho bình luận hay Bình luận Màn hình chi tiết bình luận video Hướng dẫn kiện chi tiết Thả tim cho hát hay Chuyển sang hình thông tin cá nhân Màn hình chi tiết hát Hướng dẫn đánh giá hát Cho đánh giá chất lượng hát Màn hình nhập đánh giá chất lượng hát Thả tim cho bình luận hay Màn hình hiển thị đánh giá Hướng dẫn nhắn tin Chuyển sang hình thông tin cá nhân Nhập nội dung tin nhắn Hình Màn hình chat Hướng dẫn xem người theo dõi người theo dõi Màn hình danh sách người theo dõi Hướng dẫn quay Chọn ẩn, lời hát Chuyển chế độ camera Chuyển sang hình chi tiết hát Hiện danh sách nhạc hot Chọn hiệu ứng khung hình Màn hình quay video Hướng dẫn chỉnh sửa màu sắc Chọn hiệu ứng màu sắc, chế độ Chuyển sang hình chọn ảnh Màn hình chọn hiệu ứng Hướng dẫn chọn ảnh upload Chuyển sang hình video chưa tải lên thực thi upload video Màn hình chọn ảnh upload Hướng dẫn tải video Bấm vào để chọn tải video Màn hình video chưa tải lên Hướng dẫn trang cá nhân Bấm vào để xem người dùng theo dõi ai, hay theo dõi người đùng Màn hình thông tin cá nhân Thư viện mã nguồn mở (open source) - com.google.dagger:dagger-compiler - com.google.dagger:dagger - com.jakewharton:butterknife - com.android.support:recyclerview-v7 - io.reactivex:rxjava - io.reactivex:rxandroid - javax.annotation:jsr250-api - com.android.support:design - com.github.bumptech.glide:glide - net.soulwolf.widget:ratiolayout - org.androidannotations:androidannotations-api - com.android.support:support-v13 - com.jakewharton:butterknife-compiler - com.android.support:percent - com.android.support:appcompat-v7 - joda-time:joda-time - org.greenrobot:eventbus - com.facebook.android:facebook-android-sdk - com.google.firebase:firebase-core - com.google.firebase:firebase-messaging - com.google.firebase:firebase-database - com.facebook.android:audience-network-sdk - com.google.android.gms:play-services-analytics - org.parceler:parceler-api - org.parceler:parceler - com.antonyt.infiniteviewpager:library - com.afollestad.material-dialogs:commons - org.mockito:mockito-core - com.google.dexmaker:dexmaker - com.google.dexmaker:dexmaker-mockito - com.android.support.test.espresso:espresso-core - com.android.support.test:testing-support-lib - javax.annotation:jsr250-api - javax.inject:javax.inject - io.reactivex:rxjava - junit:junit - org.mockito:mockito-core - com.google.dagger:dagger-compiler - com.google.dagger:dagger - com.squareup.okhttp:okhttp - com.google.code.gson:gson - io.reactivex:rxjava: - io.reactivex:rxandroid - javax.annotation:jsr250-api - javax.inject:javax.inject - com.squareup.retrofit2:retrofit - com.squareup.retrofit2:converter-gson - com.squareup.retrofit2:adapter-rxjava2 - com.squareup.okhttp3:logging-interceptor - nl.qbusict:cupboard - com.google.firebase:firebase-config - org.assertj:assertj-core - org.mockito:mockito-core - org.robolectric:robolectric: - hanks.xyz:smallbang-library:0.1.2 - de.hdodenhof:circleimageview:2.1.0 - uk.co.chrisjenx:calligraphy:2.2.0 - com.google.firebase:firebase-auth:10.0.1 - com.google.firebase:firebase-core:10.0.1 - uk.co.chrisjenx:calligraphy:2.2.0 - com.danikula:videocache:2.7.0 - com.android.support:appcompat-v7:25.3.1 - com.android.support.constraint:constraint-layout:1.0.2 - org.greenrobot:greendao-generator:3.2.0 - com.weiwangcn.betterspinner:library:1.1.0 - com.google.android.exoplayer:exoplayer:r2.2.0 - com.facebook.rebound:rebound:0.3.8 - com.squareup.retrofit2:converter-scalars:2.1.0 - com.loopj.android:android-async-http:1.4.9 - io.reactivex.rxjava2:rxandroid:2.0.1 - com.afollestad.material-dialogs:core:0.9.4.2 - nl.qbusict:cupboard:0.3.1 - com.koushikdutta.async:androidasync:2.1.9 - com.tiagosantos:enchantedviewpager:1.0.0 - com.nineoldandroids:library:2.4.0' - com.daimajia.slider:library:1.1.5@aar - com.squareup.okhttp:okhttp-urlconnection:2.2.0 - com.squareup.picasso:picasso:2.4.0 - com.google.gms.google-services - com.android.support.constraint:constraint-layout:1.0.1 - io.realm:realm-gradle-plugin:3.1.3 - com.github.hiteshsondhi88.libffmpeg - org.wysaid.camera Thuật toán forcus điểm public synchronized void focusAtPoint(float x, float y, float radius, final Camera.AutoFocusCallback callback) { if(mCameraDevice == null) { Log.e(LOG_TAG, "Error: focus after release."); return; } mParams = mCameraDevice.getParameters(); if(mParams.getMaxNumMeteringAreas() > 0) { int focusRadius = (int) (radius * 1000.0f); int left = (int) (x * 2000.0f - 1000.0f) - focusRadius; int top = (int) (y * 2000.0f - 1000.0f) - focusRadius; Rect focusArea = new Rect(); focusArea.left = Math.max(left, -1000); focusArea.top = Math.max(top, -1000); focusArea.right = Math.min(left + focusRadius, 1000); focusArea.bottom = Math.min(top + focusRadius, 1000); List meteringAreas = new ArrayList(); meteringAreas.add(new Camera.Area(focusArea, 800)); try { mCameraDevice.cancelAutoFocus(); mParams.setFocusMode(Camera.Parameters.FOCUS_MODE_AUTO); mParams.setFocusAreas(meteringAreas); mCameraDevice.setParameters(mParams); mCameraDevice.autoFocus(callback); } catch (Exception e) { Log.e(LOG_TAG, "Error: focusAtPoint failed: " + e.toString()); } } else { Log.i(LOG_TAG, "The device does not support metering areas "); try { mCameraDevice.autoFocus(callback); } catch (Exception e) { Log.e(LOG_TAG, "Error: focusAtPoint failed: " + e.toString()); } } } Thuật toán code tùy chỉnh kích thước khung hình public synchronized void setPictureSize(int width, int height, boolean isBigger) { if(mCameraDevice == null) { mPictureWidth = width; mPictureHeight = height; return; } mParams = mCameraDevice.getParameters(); List picSizes = mParams.getSupportedPictureSizes(); Camera.Size picSz = null; if(isBigger) { Collections.sort(picSizes, comparatorBigger); for(Camera.Size sz : picSizes) { if(picSz == null || (sz.width >= width && sz.height >= height)) { picSz = sz; } } } else { Collections.sort(picSizes, comparatorSmaller); for(Camera.Size sz : picSizes) { if(picSz == null || (sz.width