You are on page 1of 43

TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI

VIỆN ĐIỆN TỬ - VIỄN THÔNG

BÁO CÁO LẬP TRÌNH NÂNG CAO

Đề tài:
Thiết kế phần mềm nhật ký sử dụng son môi cho
phái nữ trên điện thoại nền tảng Android

Giảng viên hướng dẫn: TS. Phạm Doãn Tĩnh

Sinh viên thực hiện: Lê Quang Minh 20159503


Nguyễn Duy Thịnh 20149575
Nguyễn Minh Thành 20115752
Hoàng Tuấn 20146973

Hà Nội, 5 - 2016
LỜI NÓI ĐẦU
Hiện nay, với việc phát triển vô cùng nhanh chóng của các công nghệ phần
mềm, việc hỗ trợ cuộc sống hàng ngày của con người ngày càng được chú trọng.
Một trong những xu hướng phổ biến nhất hiện nay đó là sự xuất hiện rộng rãi các
máy điện thoại di động chạy trên nền tảng Android. Với nền tảng mở này, hàng loạt
các ứng dụng phần mềm ra đời để phục vụ các mục đích khác nhau của con người
như: nhắn tin, ghi chú, thiết lập thời gian, soạn thảo văn bản… Mỗi một ứng dụng
đều phục vụ một mục đích cụ thể và là công cụ hỗ trợ mãnh mẽ bên cạnh mỗi người
sử dụng điện thoại.
Với vấn đề nêu trên, được sự hướng dẫn và định hướng của thầy, nhóm em
đã lựa chọn đề tài: “Thiết kế phần mềm nhật ký sử dụng son môi cho phái nữ trên
điện thoại Android”. Đề tài này sẽ tập trung vào việc nghiên cứu và xây dựng một
ứng dụng dựa trên một số kiến thức nền tảng như sau:
 Tìm hiểu lý thuyết lập trình android.
 Nghiên cứu về cơ sở dữ liệu
 Công nghệ Barcode
Mặc dù đã cố gắng và nỗ lực hết sức nhưng chắc chắn đề tài của em vẫn còn
nhiều thiếu sót, em rất mong nhận được sự đóng góp ý kiến và đánh giá của thầy.
Em cũng xin được chân thành cảm ơn sự hướng dẫn nhiệt tình của thầy giáo đã giúp
đỡ em trong quá trình thực tập để hoàn thành đề tài này.

MỤC LỤC

1
LỜI NÓI ĐẦU....................................................................................................................................................1

MỤC LỤC..........................................................................................................................................................2

DANH SÁCH HÌNH VẼ...................................................................................................................................3

CHƯƠNG 1. MỞ ĐẦU.....................................................................................................................................4
1.1 Đặt vấn đề................................................................................................................................................4
1.2 Mục đích đề tài.........................................................................................................................................4
1.3 Hướng phát triển đề tài............................................................................................................................5

CHƯƠNG 2. CƠ SỞ LÝ THUYẾT.................................................................................................................5
2.1 Cơ sở dữ liệu............................................................................................................................................5
2.1.1 Khái niệm..........................................................................................................................................5
2.1.2 Một số ưu điểm CSDL......................................................................................................................5
2.1.3 Phân loại...........................................................................................................................................7
2.2 Công nghệ quét Barcode..........................................................................................................................8
2.2.1 Định nghĩa.........................................................................................................................................8
2.2.2 Phân loại...........................................................................................................................................9
2.2.3 Công nghệ quét...............................................................................................................................10
2.3 Lập trình android...................................................................................................................................11
2.3.1 Tìm hiểu về android........................................................................................................................11
2.3.2 Kiến trúc Android...........................................................................................................................11
2.3.3 Môi trường lập trình android..........................................................................................................12
2.3.4 Các thành phần cơ bản của một project Android trên Eclipse........................................................13

CHƯƠNG 3. Thiết kế phần mềm trên điện thoại Android.........................................................................15


3.1 Sơ đồ khối cho ứng dụng........................................................................................................................15
3.2 Lập trình các khối..................................................................................................................................16
3.2.1 Khối cơ sở dữ liệu...........................................................................................................................16
3.2.2 Khối quản lý cơ sở dữ liệu..............................................................................................................16
3.2.3 Khối khởi tạo bộ khung hiển thị dữ liệu.........................................................................................18
3.2.4 Khối Adapter...................................................................................................................................18
3.2.5 Khối quét barcode...........................................................................................................................19
3.2.6 Khối Branch....................................................................................................................................23
3.2.7 Khối Home......................................................................................................................................27
3.3 Thiết kế giao diện...................................................................................................................................30
3.3.1 Giao diện cho lớp Main..................................................................................................................30
3.3.2 Giao diện cho lớp Barcode.............................................................................................................30
3.3.3 Giao diện cho lớp Trend.................................................................................................................31
3.3.4 Giao diện kết nối cơ sở dữ liệu với listview...................................................................................31
3.3.5 Giao diện chỉnh sửa cơ sở dữ liệu...................................................................................................32
3.4 File cấu hình cho hệ thống:....................................................................................................................34

CHƯƠNG 4. ĐÁNH GIÁ KẾT QUẢ............................................................................................................35


4.1 Giao diện và chức năng phần mềm........................................................................................................36
4.1.1 MainActivity...................................................................................................................................36
4.1.2 Các giao diện chức năng.................................................................................................................37
4.1.3 Giao diện nhập liệu.........................................................................................................................39
4.1.4 Giao diện Scanbarcode...................................................................................................................40
4.2 Đánh giá kết quả....................................................................................................................................41

KẾT LUẬN......................................................................................................................................................42

2
TÀI LIỆU THAM KHẢO...............................................................................................................................42

DANH SÁCH HÌNH VẼ

Hình 1.1 Facebook- một ứng dụng phổ biến nhất trên điện thoại................................................................4

Hình 2.1 Minh họa cho một hệ CSDL..............................................................................................................6

Hình 2.2 Một mô hình CSDL thực tế...............................................................................................................8

Hình 2.3 Một thiết bị quét barcode đơn giản..................................................................................................9

Hình 2.4 Mã barcode.........................................................................................................................................9

Hình 2.5 Mã QRCode......................................................................................................................................10

Hình 2.6 Quét barcode trên điện thoại..........................................................................................................10

Hình 2.7 Kiến trúc Android............................................................................................................................11

Hình 3.1 Sơ đồ khối ứng dụng........................................................................................................................15

Hình 4.1 Giao diện phần mềm khi khởi động...............................................................................................36

Hình 4.2 Giao diện khi có navigation view....................................................................................................37

Hình 4.3 Giao diện Trend...............................................................................................................................37

Hình 4.4 Giao diện Daily.................................................................................................................................38

Hình 4.5 Giao diện Color................................................................................................................................38

Hình 4.6 Giao diện nhập.................................................................................................................................39

Hình 4.7 Giao diện danh sách.........................................................................................................................40

Hình 4.8 giao diện Scanbarcode.....................................................................................................................41

3
CHƯƠNG 1. MỞ ĐẦU

1.1 Đặt vấn đề


Hiện nay, rất nhiều các ứng dụng trên điện thoại được ra đời nhằm mục đích
phục vụ các nhu cầu từ lớn tới nhỏ nhất của người dùng sao cho thuận lợi nhất.

Hình 1.1 Facebook- một ứng dụng phổ biến nhất trên điện thoại
Với việc ra đời nhiều ứng dụng hỗ trợ người dùng như vậy, việc ra đời một
ứng dụng chuyên biệt dành riêng cho sở thích của phái nữ là vô cùng cần thiết để
giúp cuộc sống của họ trở nên hoàn thiện hơn với chiếc điện thoại thông minh của
mình.

4
1.2 Mục đích đề tài
Từ vấn đề nêu trên, dựa vào việc tìm hiểu về thói quen sử dụng của phái nữ,
một ứng dụng mang tính chất ghi chú, lưu trữ dữ liệu và hỗ trợ đọc dữ liệu từ mã
sản phẩm được ra đời.
Trong ứng dụng này của nhóm chúng em, các chức năng đều hướng tới việc
sao cho cung cấp một cách hiệu quả nhất các thông tin về son môi cũng như giúp
người sử dụng ghi chú lại những gợi ý hay mẹo dùng sao cho thuận tiện nhất. Đơn
giản hơn, người dùng có thể sử dụng phần mềm như một lựa chọn sáng giá trong
thời gian rảnh của mình.

1.3 Hướng phát triển đề tài


Đây là một đề tài có hướng phát triển rất lớn. Nếu có thể, ứng dụng tích hợp
thêm một số chức năng như nhận diện và ra lệnh bằng giọng nói, phản hồi người
dùng bằng ngôn ngữ tiếng việt cùng với khả năng kết nối như một mạng xã hội.
Bên cạnh đó, khi ứng dụng được thương mại hóa, việc quảng cáo đối với các
nhãn hàng son môi sẽ trở nên dễ dàng hơn khi họ có một nơi để tiếp cận khách hàng
tốt hơn bao giờ hết.

CHƯƠNG 2. CƠ SỞ LÝ THUYẾT
Để có thể tạo ra một ứng dụng có khả năng ghi chép, lưu trữ và hiển thị dữ
liệu, cần có những kiến thức cơ bản về cơ sở dữ liệu. Sau khi đã tổng hợp được
những kiến thức cơ bản về cơ sở dữ liệu, nhóm em cần nắm được việc lập trình
Android diễn ra như thế nào và những yếu tố cần thiết để tạo ra một ứng dụng chạy
ổn định trên nền tảng này. Với nhiệm vụ đọc được mã sản phẩm, việc sử dụng và
điều khiển camera của điện thoại là việc không thể thiếu trong quá trình lập trình.
Dưới đây là phần trình bày cơ sở lý thuyết của nhóm chúng em.

5
2.1 Cơ sở dữ liệu

2.1.1 Khái niệm


Cơ sở dữ liệu (viết tắt CSDL; tiếng Anh là database) được hiểu theo cách
định nghĩa kiểu kĩ thuật thì nó là một tập hợp thông tin có cấu trúc. Tuy nhiên, thuật
ngữ này thường dùng trong công nghệ thông tin và nó thường được hiểu rõ hơn
dưới dạng một tập hợp liên kết các dữ liệu, thường đủ lớn để lưu trên một thiết bị
lưu trữ như đĩa hay băng. Dữ liệu này được duy trì dưới dạng một tập hợp các tập
tin trong hệ điều hành hay được lưu trữ trong các hệ quản trị cơ sở dữ liệu.

2.1.2 Một số ưu điểm CSDL

 Giảm sự trùng lặp thông tin xuống mức thấp nhất. Do đó đảm bảo thông tin
có tính nhất quán và toàn vẹn dữ liệu.
 Đảm bảo dữ liệu có thể được truy xuất theo nhiều cách khác nhau.
 Nhiều người có thể sử dụng một cơ sở dữ liệu.

Hình 2.1 Minh họa cho một hệ CSDL

 CSDL có thể giải quyết được :


o Tính chủ quyền của dữ liệu.
o Thể hiện ở phương diện an toàn dữ liệu.

6
o Khả năng biểu diễn mỗi liên hệ ngữ nghĩa của dữ liệu và tính
chính xác của dữ liệu.
o Người khai thác cơ sở dữ liệu phải cập nhật cho CSDL những
thông tin mới nhất.
 Tính bảo mật và quyền khai thác thông tin của người sử dụng.
o Do ưu điểm CSDL có thể cho nhiều người khai thác đồng thời.
nên cần phải có một cơ chế bảo mật phân quyền khai thác
CSDL.
o Các hệ điều hành nhiều người sử dụng hay cục bộ đều cung
cấp cơ chế này.
 Tranh chấp dữ liệu.

o Khi nhiều người cùng truy nhập CSDL với các mục đích khác
nhau. Rất có thể sẽ xảy ra hiện tượng tranh chấp dữ liệu.
o Cần có cơ chế ưu tiên khi truy cập CSDL. Ví dụ: admin luôn
có thể truy cập cơ sở dữ liệu.
o Cấp quyền ưu tiên cho từng người khai thác.
 Đảm bảo an toàn dữ liệu khi có sự cố.
o Khi CSDL nhiều và được quản lý tập trung. Khả năng rủi ro
mất dữ liệu rất cao. Các nguyên nhân chính là mất điện đột
ngột hoặc hỏng thiết bị lưu trữ.
o Hiện tại có một số hệ điều hành đã có cơ chế tự động sao lưu ổ
cứng và fix lỗi khi có sự cố xảy ra.
o Tuy nhiên: cẩn tắc vô áy náy. Chúng ta nên sao lưu dự phòng
cho dữ liệu đề phòng trường hợp xấu xảy ra.

2.1.3 Phân loại


Cơ sở dữ liệu được phân chia ra nhiều loại khác nhau :

 Cơ sở dữ liệu dạng file: dữ liệu được lưu trữ dưới dạng các file có thể là
text, ascii, *.dbf. Tiêu biểu cho cơ sở dữ liệu dạng file là*.mdb Foxpro

7
 Cơ sở dữ liệu quan hệ: dữ liệu được lưu trữ trong các bảng dữ liệu gọi là các
thực thể, giữa các thực thể này có mối liên hệ với nhau gọi là các quan hệ,
mỗi quan hệ có các thuộc tính, trong đó có một thuộc tính là khóa chính. Các
hệ quản trị hỗ trợ cơ sở dữ liệu quan hệ như: MS SQL
server, Oracle, MySQL...
 Cơ sở dữ liệu hướng đối tượng: dữ liệu cũng được lưu trữ trong các bảng dữ
liệu nhưng các bảng có bổ sung thêm các tính năng hướng đối tượng như lưu
trữ thêm các hành vi, nhằm thể hiện hành vi của đối tượng. Mỗi bảng xem
như một lớp dữ liệu, một dòng dữ liệu trong bảng là một đối tượng. Các hệ
quản trị có hỗ trợ cơ sở dữ liệu hướng đối tượng như: MS SQL server,
Oracle, Postgres
 Cơ sở dữ liệu bán cấu trúc: dữ liệu được lưu dưới dạng XML, với định dạng
này thông tin mô tả về đối tượng thể hiện trong các tag. Đây là cơ sở dữ liệu
có nhiều ưu điểm do lưu trữ được hầu hết các loại dữ liệu khác nhau nên cơ
sở dữ liệu bán cấu trúc là hướng mới trong nghiên cứu và ứng dụng.

Hình 2.2 Một mô hình CSDL thực tế

2.2 Công nghệ quét Barcode

2.2.1 Định nghĩa


Đây là một công nghệ dùng để nhận dạng và thu thập dữ liệu, dựa vào một mã số
hoặc chữ số cho một đối tượng nào đó. Mã vạch này bao gồm dãy vạch có độ lớn
nhỏ khác nhau và có khoảng trống song song xen kẽ, chúng được sắp xếp theo một
quy tắc mã hóa nhất định nào đó để các máy quét, máy đọc mã vạch có thể đọc

8
được thông tin. Hay định nghĩa một cách dễ hiểu nhất là mã vạch chính là sự thể
hiện thông tin dưới dạng nhìn thấy được trên các bề mặt của sản phẩm, hàng hóa mà
con người chúng ta có thể nhìn thấy và máy móc có thể đọc được.

Hình 2.3 Một thiết bị quét barcode đơn giản

2.2.2 Phân loại

 Loại 1 : Một là mã vạch tuyến tính hay còn biết đến là mã vạch 1 chiều
(1D). Cách để nhận biết mã vạch tuyến tính này là, mã vạch này là các
đường thẳng song song với nhau và có độ rộng chênh lệch với nhau. Tiêu
biểu và được sử dụng rộng rãi nhất mã vạch tuyến tính đó chính là loại EAN-
UCC. Đây là loại mã được sử dụng phổ biến in trên các sản phẩm trên thế
giới.

Hình 2.4 Mã barcode

9
 Loại 2: Hai là mã vạch 2 chiều hay còn gọi là mã ma trận. Nhưng ưu điểm
của nó so với mã vạch tuyến tính thì nó lưu trữ nhiều thông tin hơn. Tiêu
biểu trong đây có thể kể đến QR code

Hình 2.5 Mã QRCode

2.2.3 Công nghệ quét


Với ứng dụng trên điện thoại di động, ta sử dụng camera để quét barcode nên
công nghệ được sử dụng dựa trên nguyên lý Máy quét mã vạch 2D được sử dụng
bằng công nghệ chụp ảnh ma trận.
 Công nghệ chụp ảnh ma trận được sử dụng bằng camera.
 Cách thức vận hành: Máy quét mã vạch 2D sẽ chụp ảnh mã vạch và đưa vào
bộ xử lý trong máy để giải mã các ma trận thành các đoạn văn bản thuần túy.

Các loại mã vạch 2D thường gặp:


 Datamatrix, QR Code
 PDF417

Hình 2.6 Quét barcode trên điện thoại

10
2.3 Lập trình android

2.3.1 Tìm hiểu về android


Android là một "Hệ Điều Hành" được cài đặt trên một số phần cứng riêng
biệt mà ở đây chủ yếu là cài đặt trên các thiết bị smartphone (của SamSung, LG,
HTC, Motorola ... ). Cũng giống như các hệ điều hành khác trên điện thoại (window
phone 7, ios, blackberry ...), Android là một hệ điều hành dành cho điện thoại được
viết từ java, mã nguồn mở hoàn toàn giúp có các lập trình viên cài đặt các ứng dụng
trên thiết bị do chính mình viết ra.
Các nhà phát triển viết ứng dụng cho Android dựa trên ngôn ngữ Java. Sự ra
mắt của Android vào ngày 5 tháng 11 năm 2007 gắn với sự thành lập của liên minh
thiết bị cầm tay mã nguồn mở, bao gồm 78 công ty phần cứng, phần mềm và viễn
thông nhằm mục đính tạo nên một chuẩn mở cho điện thoại di động trong tương lai.

2.3.2 Kiến trúc Android

Hình 2.7 Kiến trúc Android

Tầng 1 :tầng Application là tầng ở trên cùng cách xa với phần cứng nhất:
Chứa các ứng dụng mà lập trình viên phát triển như : browser, Contacts,
media.
Tầng 2:Application Framework
• Activity Manager - quản lý vòng đời của các ứng dụng.
• Windows Manager - quản lý form của các ứng dụng.

11
• Content Providers - cho phép các ứng dụng truy cập dữ liệu từ các
ứng dụng khác hoặc để chia sẻ dữ liệu của riêng ứng dụng
• Google xây dựng cho các developer để phát triển các ứng dụng
của họ trên Android chỉ bằng cách gọi các API.
• View UI - để xây dựng layout của ứng dụng bao gồm: list view,
text field, button, dialog, form …
• Resource Manager - cung cấp cách thức truy cập đến non-code
resources như các asset, graphic, image, music, video …
• Notification Manager - cho phép tất cả các ứng dụng hiển thị
thông báo của mình trên hệ điều hành.

Tầng 3:Libraries
Là các thư viện được viết bằng ngôn ngữ C/C++ sẽ được các developer phát
triển ứng dụng android thông qua tầng Android Framework. Có thể kể ra đây một
số thư viện quen thuộc với các lập trình viên như:
• Media Libraries – mở rộng từ PacketVideo’s OpenCORE. Hỗ trợ
nhiều định dạng video và image phổ biến: MPEG4, H.264, MP3,
AAC, AMR, JPG, and PNG
• Surface Manager – quản lý việc hiển thị và kết hợp đồ họa 2D và
3D.
• LibWebCore – dùng webkit engine cho việc render trình duyệt
mặc định của HDH Android browser và cho dạng web nhúng (như
HTML nhúng)
• OpenGL|ES – thư viện đồ họa 2D và 3D
• SQLite – quản lý database của ứng dụng
• Runtime Android một tập hợp các thư viện Java Core.
• Máy ảo Dalvik thực thi các file định dạng .dex (Dalvik Excutable)
• Mỗi ứng dụng Android chạy trên tiến trình riêng của máy ảo
Dalvik. Dalvik được viết để chạy nhiều máy ảo cùng một lúc một
cách hiệu quả trên cùng một thiết bị.
Tầng 4: Kernel Linux layer:
Dựa trên Kernel Linux version 2.6 bởi nó cung cấp các trình điều khiển các
thiết bị phần cứng(driver), quản lý tiến trình, quản lý tài nguyên, bảo mật,... như
sau:
• Security system
• Memory management
• Process management
• Network stack
• Driver model.

2.3.3 Môi trường lập trình android


Android SDK bao gồm các công cụ riêng lẻ như: debugger, các thư viện,
trình giả lập điện thoại Android, các tài liệu hỗ trợ và code mẫu. Hiện Android cung

12
cấp bộ công cụ này trên nhiều nền tảng hệ điều hành khác nhau (Windows, Linux,
Mac,...), miễn là có sẵn Java Development Kit, Apache Ant và Python2.2 trở lên.
Android SDK cung cấp các công cụ và API cần thiết để bắt đầu phát triển
các ứng dụng trên nền tảng Android bằng cách sử dụng ngôn ngữ lập trình Java.
Những đặc tính
• Ứng dụng framework cho phép tái sử dụng và thay thế các thành phần
• Dalvik máy ảo được tối ưu hóa cho các thiết bị di động
• Tích hợp trình duyệt dựa trên động cơ WebKit mã nguồn mở
• Tối ưu hóa đồ họa được hỗ trợ bởi một tùy chỉnh đồ họa 2D thư viện; đồ
họa 3D dựa trên những đặc điểm kỹ thuật OpenGLES 1,0 (Tùy chôn tăng tốc phần
cứng ) • SQLite cho việc lưu trữ dữ liệu cấu trúc
• Phương tiện truyền thông hỗ trợ cho âm thanh phổ biến, video, và vẫn còn
định dạng hình ảnh (MPEG4, H.264, MP3, AAC, AMR, JPG, PNG, GIF) • GSM
điện thoại (phụ thuộc phần cứng)
• Bluetooth, EDGE, 3G và WiFi (phụ thuộc phần cứng)
• Camera, GPS, la bàn, và gia tốc (phụ thuộc phần cứng)
• Môi trường phát triển phong phú bao gồm một mô phỏng thiết bị, công cụ
để gỡ lỗi, bộ nhớ và profiling hiệu suất, và một plugin cho IDE Eclipse Kiến trúc
Android Sơ đồ dưới đây cho thấy các thành phần chính của hệ điều hành Android.
Mỗi phần được mô tả chi tiết hơn dưới đây.

Môi trường lập trình (IDE) chính thức của Android là Eclipse (từ phiên bản
3.2) với sự hỗ trợ của plugin Android Development Tools (ADT). Tuy nhiên, người
lập trình có thể sử dụng bất kỳ 1 IDE hay trình soạn thảo văn bản nào để viết code
Java và XML rồi biên dịch nên ứng dụng hoàn chỉnh bằng cách sử dụng dòng lệnh
(command lines).

Ứng dụng Android được đóng gói thành các file .apk và đuợc lưu trong thư mục
/data/app của hệ điều hành Android.Java Development Kit (JDK) 5.0.

Một số công cụ hỗ trợ lập trình Android tiêu biểu:

SQLite Manager: Là một addon của Firefox giúp quản lí cơ sở dữ liệu SQLite của
Android.
DroidDraw: Giúp thiết kế file XML giao diện ứng dụng.
Balsamiq Mockups và AdobeFireworks: Giúp nhanh chóng phác thảo ý tưởng và
giao diện sơ bộ của ứng dụng.
StarUML: Vẽ các lược đồ UML hỗ trợ phân tích thiết kế.

2.3.4 Các thành phần cơ bản của một project Android trên Eclipse
AndroidManifest.xml: file XML mô tả ứng dụng và các thành phần đuợc
cung cấp bởi ứng dụng (activities, services,...). Là nền tảng của mọi ứng dụng
Android, file AndroidManifest.xml được đặt trong thư mục root và cho biết những
thành phần có trong ứng dụng của: các activities, các services,...cũng như cách các
thành phần ấy gắn bó với nhau. Các thành phần của AndroidManifest.xml:

13
• uses-persmission: chỉ định các quyền mà ứng dụng của ta đuợc cấp
để hoạt động trôi chảy (như đã nói, các ứng dụng Android nằm
dưới nhiều lớp bảo mật khác nhau).
• permission: chỉ định các quyền mà các activities hay services yêu
cầu các ứng dụng khác phaỉ có mới được truy cập dữ liệu của ứng
dụng của ta.
• instrumentation: chỉ định phần code cần được gọi khi xảy ra những
sự kiện quan trọng (chẳng hạn khởi động activities) nhằm phục vụ
việc ghi chú (logging) và tra soát (monitoring)
• uses-library: nhằm kết nối với các thành phần có sẵn của Android
(như service tra bản đồ,...)
• uses-sdk: có thể có hoặc không, chỉ ra phiên bản củaAndroid mà
ứng dụng này yêu cầu.
• application: định nghĩa phần trung tâm của ứng dụng của file
manifest.
build.xml: Một file chứa mã script Ant (ant.apache.com) nhằm compile và
cài đặt ứng dụng lên máy.
default.properties: file property tạo bởi script Ant trên.

bin/ : nơi chứa ứng dụng sau khi được compile.

bin/classes/ : chứa các lớp Java đã được compile.

bin/classes.dex : chứa các file executable tạo bởi các lớp Java.

bin/yourapp.ap_ : chứa các tài nguyên của ứng dụng, đóng gói thành 1 file
zip.

bin/yourapp-debug.apk hay bin/yourapp-unsigned.apk : chứa chính ứngdụng


Android của ta.

libs/ : nơi chứa các file Java JAR ứng dụng yêu cầu (third party).

src/ : nơi chứa mã nguồn Java của ứng dụng.

res/ : chứa các tài nguyên của ứng dụng, như các icons, GUI layouts,...

res/drawable/ : chứa file hình ảnh (PNG, JPEG,...).

res/layout/ : chứa UI layout, dưới dạng XML.

res/menu/ : chi tiết các menu, dưới dạng XML.

res/raw/ : chứa các file khác (CSV chứa thông tin account,...).

res/values/ : chứa các strings, dimensions,...

14
res/zml/ : chứa các file XML khác cần cho ứng dụng.

assets/ : nơi chứa các files tĩnh (static) được yêu cầu đi kèm với ứng dụng.

CHƯƠNG 3. Thiết kế phần mềm trên điện thoại Android


Để điện thoại android có khả năng phục vụ đúng chức năng đã được đề ra
trong mục yêu cầu, cần có một bản thiết kế cụ thể các khối Activity cho phần mềm.
Về cơ bản, phần mềm sẽ bao gồm các Activity có khả năng hiển thị trực quan các
chức năng bên trong nó. Dữ liệu được nhập xuất đồng thời lưu trữ trong cơ sở dữ
liệu. Việc điều khiển camera trong ứng dụng cũng được viết dưới dạng một activity,
không khởi tạo thành một luồng riêng để tránh các xung đột không đáng có.

3.1 Sơ đồ khối cho ứng dụng

Hình 3.1 Sơ đồ khối ứng dụng

 Khối Hobby: tùy chọn theo sở thích người dùng.


 Khối Trend: thông tin về xu hướng chung hiện nay.
 Khối Daily: lưu trữ dữ liệu sử dụng hang ngày của người dùng.
 Khối Barcode: Quét mã vạch sản phẩm để đối chiếu với dữ liệu có sẵn.
 Khối MainActiviy: màn hình đăng nhập chính.
 Khối cơ sở dữ liệu: lưu trữ dữ liệu

15
 Khối camera: điều khiển camera

Toàn bộ ứng dụng được lập trình bằng ngôn ngữ Java, dựa trên nền tảng
Android.

3.2 Lập trình các khối

3.2.1 Khối cơ sở dữ liệu


Các thành phần cơ bản của một cơ sở dữ liệu được khai báo trong
DatabaseHelper:
public class DatabaseHelper extends SQLiteOpenHelper {
public static final String DB_NAME = "BARCODE.DB";
public static final String TABLE_NAME = "LIPSTICK";
public static final String ID = "id";
public static final String CODE = "CODE";
public static final String NAME = "NAME";
public static final String PRICE = "PRICE";
public static final int DB_VERSION = 1;
//
private static final String CREATE_TABLE = "create table "+
TABLE_NAME+"("+ ID+ " INTEGER PRIMARY KEY AUTOINCREMENT, "+ CODE +
" TEXT NOT NULL, "+ NAME + " TEXT NOT NULL, " + PRICE + "
TEXT);";

public DatabaseHelper(Context context) {


super(context, DB_NAME, null, DB_VERSION);
}

@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(CREATE_TABLE);
}

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int
newVersion) {
db.execSQL("DROP TABLE IF EXIST "+TABLE_NAME);
onCreate(db);
}
}

3.2.2 Khối quản lý cơ sở dữ liệu


Đây là khối được thiết kế chứa các phương thức quản lý một cơ sở dữ
liệu
public class DBManager {
private DatabaseHelper dbHelper;
private Context context;
private SQLiteDatabase database;

public DBManager(Context c) {
context = c;
}

16
public DBManager open() throws SQLException {
dbHelper = new DatabaseHelper(context);
database = dbHelper.getWritableDatabase();
return this;
}

public void insert(String code, String name, String price) {


ContentValues contentValues = new ContentValues();
contentValues.put(DatabaseHelper.CODE, code);
contentValues.put(DatabaseHelper.NAME, name);
contentValues.put(DatabaseHelper.PRICE, price);
database.insert(DatabaseHelper.TABLE_NAME, null, contentValues);
}

public int update(long id, String code, String name, String price) {
ContentValues contentValues = new ContentValues();
contentValues.put(DatabaseHelper.CODE, code);
contentValues.put(DatabaseHelper.NAME, name);
contentValues.put(DatabaseHelper.PRICE, price);
int i = database.update(DatabaseHelper.TABLE_NAME, contentValues,
DatabaseHelper.ID + " = " + id, null);
return i;
}

public Cursor fetch() {


String[] col = new String[]{DatabaseHelper.ID,
DatabaseHelper.CODE, DatabaseHelper.NAME, DatabaseHelper.PRICE};
Cursor cursor = database.query(DatabaseHelper.TABLE_NAME, col,
null, null, null, null, null, null);
if (cursor != null) {
cursor.moveToFirst();
}
return cursor;
}

public void delete(long id) {


database.delete(DatabaseHelper.TABLE_NAME, DatabaseHelper.ID +
"=" + id, null);
}

public void deleteall() {


database.delete(DatabaseHelper.TABLE_NAME, null, null);
}

public boolean checkData(String TableName, String Col, String Value)


{
String Query = "Select * from " + TableName + " where " + Col + "
= " + Value;
Cursor cursor = database.rawQuery(Query, null);
if (cursor.getCount() <= 0) {
cursor.close();
return false;
}
cursor.close();
return true;
}

public String[] getValue(String code) {


database = dbHelper.getReadableDatabase();
String[] col = new String[]{DatabaseHelper.ID,

17
DatabaseHelper.CODE, DatabaseHelper.NAME, DatabaseHelper.PRICE};
Cursor cursor = database.query(DatabaseHelper.TABLE_NAME, col,
DatabaseHelper.CODE + "=?", new String[]{String.valueOf(code)}, null,
null, null, null);
if(cursor!=null)
cursor.moveToFirst();
return new String[]{cursor.getString(1), cursor.getString(2),
cursor.getString(3)};
}
}

3.2.3 Khối khởi tạo bộ khung hiển thị dữ liệu


Trong một listview hiển thị dữ liệu được lưu, cần có 1 generic ban đầu để tạo
ra chuẩn cho các dữ liệu được hiển thị đó.
public class InforData {
private Object field1;
private Object field2;
private Object field3;
public Object getField1() {
return field1;
}
public void setField1(Object field1) {
this.field1 = field1;
}
public Object getField2() {
return field2;
}
public void setField2(Object field2) {
this.field2 = field2;
}
public Object getField3() {
return field3;
}
public void setField3(Object field3) {
this.field3 = field3;
}
@Override
public String toString() {
// TODO Auto-generated method stub
return this.field1 +" - " +this.field2 +" - "+this.field3;
}
}

3.2.4 Khối Adapter


Đây là khối thực hiện chức năng liên kết cơ sở dữ liệu với listview thông qua 1
ArrayList
public class MySimpleArrayAdapter extends ArrayAdapter<InforData> {

private Activity context;


private int layout;
private List<InforData> list;
public MySimpleArrayAdapter(Context context, int textViewResourceId,
List<InforData> objects) {
super(context, textViewResourceId, objects);
// TODO Auto-generated constructor stub
this.context=(Activity) context;
this.layout=textViewResourceId;
this.list=objects;

18
}
@Override
public View getView(int position, View convertView, ViewGroup parent)
{
// TODO Auto-generated method stub
LayoutInflater flater=context.getLayoutInflater();
View row=flater.inflate(layout, parent,false);
TextView txt1=(TextView) row.findViewById(R.id.tv1_branch);
TextView txt2=(TextView) row.findViewById(R.id.tv2_branch);
TextView txt3=(TextView) row.findViewById(R.id.tv3_branch);
/*txt1.setTextAlignment(Gravity.LEFT);
txt2.setTextAlignment(Gravity.LEFT);
txt3.setTextAlignment(Gravity.LEFT);*/
InforData data=list.get(position);

txt1.setText(data.getField1()==null?"":data.getField1().toString());

txt2.setText(data.getField2()==null?"":data.getField2().toString());

txt3.setText(data.getField3()==null?"":data.getField3().toString());
if(position==0)
{
row.setBackgroundColor(Color.CYAN);
}
return row;
}
}

3.2.5 Khối quét barcode


Đây là khối có chức năng quét mã barcode sản phẩm, trả lại tên và giá
tiền sản phẩm nếu sản phẩm này đã tồn tại trong cơ sở dữ liệu
public class Scanbarcode extends AppCompatActivity
implements NavigationView.OnNavigationItemSelectedListener {
public int stateMediaPlayer;
public final int stateMP_Error = 0;
public final int stateMP_NotStarter = 1;
public MediaPlayer mediaPlayer;
private static final int RC_BARCODE_CAPTURE = 9001;
private static final String TAG = "BarcodeMain";
private CompoundButton autoFocus;
private CompoundButton useFlash;
private Button bt_check;
private TextView tv_name, tv_price;
private ListView lv;
private DBManager dbManager;
List <InforData> list = new ArrayList<InforData>();
MySimpleArrayAdapter adapter = null;

@Override

protected void onCreate(Bundle savedInstanceState) {


super.onCreate(savedInstanceState);
setContentView(R.layout.activity_barcode);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);

//getSupportActionBar().setDisplayShowHomeEnabled();

19
String title = getString(R.string.app_name);
bt_check = (Button) findViewById(R.id.bt_barcode_check);
autoFocus = (CompoundButton) findViewById(R.id.auto_focus);
useFlash = (CompoundButton) findViewById(R.id.use_flash);
tv_name = (TextView) findViewById(R.id.tv_barcode_name);
tv_price = (TextView)findViewById(R.id.tv_barcode_price);
lv = (ListView)findViewById(R.id.lv_barcode);
update();
if(!
dbManager.checkData(DatabaseHelper.TABLE_NAME,DatabaseHelper.CODE,"201595
03")){
dbManager.insert("20159503","channel","2000000");
}

getSupportActionBar().setTitle(title);
//
bt_check.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(Scanbarcode.this,
BarcodeCaptureActivity.class);
intent.putExtra(BarcodeCaptureActivity.AutoFocus,
autoFocus.isChecked());
intent.putExtra(BarcodeCaptureActivity.UseFlash,
useFlash.isChecked());
startActivityForResult(intent, RC_BARCODE_CAPTURE);
}
});

FloatingActionButton fab = (FloatingActionButton)


findViewById(R.id.fab);
fab.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
String s = "cái này đang là xu hướng mới này";
Intent intent = new Intent();
intent.setAction(intent.ACTION_SEND);
intent.putExtra(intent.EXTRA_TEXT,s);
intent.setType("text/plain");
startActivity(intent);
}
});

DrawerLayout drawer = (DrawerLayout)


findViewById(R.id.drawer_layout);
ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
this, drawer, toolbar, R.string.navigation_drawer_open,
R.string.navigation_drawer_close);
drawer.setDrawerListener(toggle);
toggle.syncState();

NavigationView navigationView = (NavigationView)


findViewById(R.id.nav_view);
navigationView.setNavigationItemSelectedListener(this);
}
public void update(){
dbManager = new DBManager(this);
dbManager.open();
if(dbManager!=null){
Cursor cursor = dbManager.fetch();

20
InforData header = new InforData();
header.setField1("mã sản phẩm");
header.setField2("tên sản phẩm");
header.setField3("giá sản phẩm");
list.add(header);
cursor.moveToFirst();
while(!cursor.isAfterLast()){
InforData data = new InforData();
data.setField1(cursor.getString(1));
data.setField2(cursor.getString(2));
data.setField3(cursor.getString(3));
list.add(data);
cursor.moveToNext();
}
cursor.close();
adapter = new
MySimpleArrayAdapter(Scanbarcode.this,R.layout.activity_layout_showbranch
,list);
lv.setAdapter(adapter);
}

@Override
public void onBackPressed() {
DrawerLayout drawer = (DrawerLayout)
findViewById(R.id.drawer_layout);
if (drawer.isDrawerOpen(GravityCompat.START)) {
drawer.closeDrawer(GravityCompat.START);
} else {
super.onBackPressed();
}
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main, menu);
return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
int id = item.getItemId();

//noinspection SimplifiableIfStatement
if (id == R.id.action_settings) {
return true;
}

return super.onOptionsItemSelected(item);
}

@SuppressWarnings("StatementWithEmptyBody")
@Override
public boolean onNavigationItemSelected(MenuItem item) {
// Handle navigation view item clicks here.
int id = item.getItemId();

if (id == R.id.nav_hobby) {
Intent intent = new Intent(Scanbarcode.this,Hobby.class);

21
startActivity(intent);
// Handle the camera action
} else if (id == R.id.nav_trend) {

Intent intent = new


Intent(Scanbarcode.this,TrendActivity.class);
startActivity(intent);

} else if (id == R.id.nav_daily) {


Intent intent = new Intent(Scanbarcode.this,Daily.class);
startActivity(intent);

} else if (id==R.id.nav_home){
Intent intent = new
Intent(Scanbarcode.this,MainActivity.class);
startActivity(intent);
}else if (id==R.id.nav_barcode){
Intent intent = new
Intent(Scanbarcode.this,Scanbarcode.class);
startActivity(intent);
}

DrawerLayout drawer = (DrawerLayout)


findViewById(R.id.drawer_layout);
drawer.closeDrawer(GravityCompat.START);
return true;
}

@Override
protected void onActivityResult(int requestCode, int resultCode,
Intent data) {
if (requestCode == RC_BARCODE_CAPTURE) {
if (resultCode == CommonStatusCodes.SUCCESS) {
if (data != null) {
Barcode barcode =
data.getParcelableExtra(BarcodeCaptureActivity.BarcodeObject);
String temp;
temp = barcode.displayValue;

if(dbManager.checkData(DatabaseHelper.TABLE_NAME,DatabaseHelper.CODE,temp
)== true){
String[] value = dbManager.getValue(temp);
tv_name.setText(value[1].toString());
tv_price.setText(value[2].toString());
}

",ed1.getText().toString(),formattedDate);

Log.d(TAG, "Barcode read: " + barcode.displayValue);


} else {
// statusMessage.setText(R.string.barcode_failure);
Log.d(TAG, "No barcode captured, intent data is
null");
}
} else {
}
}
else {
super.onActivityResult(requestCode, resultCode, data);
}

22
}
}

3.2.6 Khối Branch


Đây là khối mà cho phép quản lý thông tin về các thương hiệu sản phẩm
nổi tiếng trên toàn cầu . Khối này gồm 2 lớp chính là hiển thị và thêm, sửa dữ
liệu:
public class BranchActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_showbranch);
updateUI();
Button btn=(Button) findViewById(R.id.buttonBack);
btn.setOnClickListener(new View.OnClickListener() {

@Override
public void onClick(View v) {
// TODO Auto-generated method stub
Intent intent = new
Intent(BranchActivity.this,TrendActivity.class);
startActivity(intent);
}
});
}
List<InforData> list=new ArrayList<InforData>();
InforData dataClick=null;
SQLiteDatabase database=null;
MySimpleArrayAdapter adapter=null;
public void updateUI()
{
database=openOrCreateDatabase("branchdata.db",
SQLiteDatabase.CREATE_IF_NECESSARY, null);
if(database!=null)
{

Cursor cursor=database.query("tblBranch", null, null, null,


null, null, null);
startManagingCursor(cursor);
InforData header=new InforData();
header.setField1("No");
header.setField2("label");
header.setField3("description");
list.add(header);
cursor.moveToFirst();
while(!cursor.isAfterLast())
{
InforData data=new InforData();
data.setField1(cursor.getInt(0));
data.setField2(cursor.getString(1));
data.setField3(cursor.getString(2));
list.add(data);
cursor.moveToNext();
}
cursor.close();
adapter=new MySimpleArrayAdapter(BranchActivity.this,

23
R.layout.activity_layout_showbranch, list);
final ListView lv= (ListView)
findViewById(R.id.listViewShowData);
lv.setAdapter(adapter);
lv.setOnItemClickListener(new
AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> arg0, View arg1,
int arg2, long arg3) {
// TODO Auto-generated method stub
Toast.makeText(BranchActivity.this, "View -->" +
list.get(arg2).toString(), Toast.LENGTH_LONG).show();
Intent intent=new Intent(BranchActivity.this,
CreateBranch.class);
Bundle bundle=new Bundle();
bundle.putInt("KEY", 1);
bundle.putString("getField1",
list.get(arg2).getField1().toString());
bundle.putString("getField2",
list.get(arg2).getField2().toString());
bundle.putString("getField3",
list.get(arg2).getField3().toString());
intent.putExtra("DATA", bundle);
dataClick=list.get(arg2);
startActivityForResult(intent,
TrendActivity.OPEN_BRANCH_DIALOG);
}
});
lv.setOnItemLongClickListener(new
AdapterView.OnItemLongClickListener() {
@Override
public boolean onItemLongClick(AdapterView<?> arg0, View
arg1,
int arg2, long arg3) {
// TODO Auto-generated method stub
final InforData data=list.get(arg2);
final int pos=arg2;
Toast.makeText(BranchActivity.this, "Edit--
>"+data.toString(), Toast.LENGTH_LONG).show();
AlertDialog.Builder b=new
AlertDialog.Builder(BranchActivity.this);
b.setTitle("Remove");
b.setMessage("Xóa ["+data.getField2() +" -
"+data.getField3() +"] hả?");
b.setPositiveButton("Có", new
DialogInterface.OnClickListener() {

@Override
public void onClick(DialogInterface dialog, int
which) {
// TODO Auto-generated method stub
int n=database.delete("tblBranch", "id=?",
new String[]{data.getField1().toString()});
if(n>0)
{
Toast.makeText(BranchActivity.this,
"Remove ok", Toast.LENGTH_LONG).show();
list.remove(pos);
adapter.notifyDataSetChanged();
}
else

24
{
Toast.makeText(BranchActivity.this,
"Remove not ok", Toast.LENGTH_LONG).show();
}
}
});
b.setNegativeButton("Không", new
DialogInterface.OnClickListener() {

@Override
public void onClick(DialogInterface dialog, int
which) {
// TODO Auto-generated method stub
dialog.cancel();
}
});
b.show();
return false;
}
});
}
}
@Override
protected void onActivityResult(int requestCode, int resultCode,
Intent data) {
// TODO Auto-generated method stub
super.onActivityResult(requestCode, resultCode, data);
if(resultCode==TrendActivity.SEND_DATA_FROM_BRANCH_ACTIVITY)
{
Bundle bundle=data.getBundleExtra("DATA_BRANCH");
String f2=bundle.getString("label");
String f3=bundle.getString("description");
String f1=dataClick.getField1().toString();
ContentValues values=new ContentValues();
values.put("label", f2);
values.put("description", f3);
if(database!=null)
{
int n=database.update("tblBranch", values, "id=?", new
String[]{f1});

if(n>0)
{
Toast.makeText(BranchActivity.this, "update ok ok ok
", Toast.LENGTH_LONG).show();
dataClick.setField2(f2);
dataClick.setField3(f3);
if(adapter!=null)
adapter.notifyDataSetChanged();
}
}
}
}
}
public class CreateBranch extends MainActivity {

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_create_branch);
final ImageView des1 = (ImageView) findViewById(R.id.test1);

25
final Button btnInsert =(Button) findViewById(R.id.buttonInsert);
final EditText txtFirstname=(EditText)
findViewById(R.id.editTextFirstName);
final EditText txtLastname=(EditText)
findViewById(R.id.editTextLastName);
final Button btnBack = (Button) findViewById(R.id.buttonBack);
final Intent intent= getIntent();
btnBack.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent1 = new
Intent(CreateBranch.this,BranchActivity.class);
startActivity(intent1);
}
});
btnInsert.setOnClickListener(new View.OnClickListener() {

@Override
public void onClick(View v) {
// TODO Auto-generated method stub
Intent intent=new Intent();
Bundle bundle=new Bundle();
bundle.putString("label",
txtFirstname.getText().toString());
bundle.putString("description",
txtLastname.getText().toString());
intent.putExtra("DATA_BRANCH", bundle);
setResult(TrendActivity.SEND_DATA_FROM_BRANCH_ACTIVITY,
intent);
CreateBranch.this.finish();
}
});
final Button btnClear=(Button) findViewById(R.id.buttonClear);
btnClear.setOnClickListener(new View.OnClickListener() {

@Override
public void onClick(View v) {
// TODO Auto-generated method stub
txtFirstname.setText("");
txtLastname.setText("");
txtFirstname.requestFocus();
}
});

Bundle bundle= intent.getBundleExtra("DATA");


if(bundle!=null && bundle.getInt("KEY")==1)
{
final String f1=bundle.getString("getField1");
String f2=bundle.getString("getField2");
final String f3=bundle.getString("getField3");
txtFirstname.setText(f2);
txtLastname.setText(f3);
btnInsert.setText("Update");
this.setTitle("View Detail");
if (f1.equals("1")){
des1.setImageResource(R.drawable.hardred);
}
else if (f1.equals("2")){
des1.setImageResource(R.drawable.ysl);
}
else if (f1.equals("3")){

26
des1.setImageResource(R.drawable.chanel);
}
else if (f1.equals("4")){
des1.setImageResource(R.drawable.mac);
}
else if (f1.equals("5")){
des1.setImageResource(R.drawable.maybelline);
}
else if (f1.equals("6")){
des1.setImageResource(R.drawable.innisfree);
}
else if (f1.equals("7")){
des1.setImageResource(R.drawable.givenchy);
}
else if (f1.equals("8")){
des1.setImageResource(R.drawable.dior);
}
else if (f1.equals("9")){
des1.setImageResource(R.drawable.cle);
}
else if (f1.equals("10")){
des1.setImageResource(R.drawable.purecolor);
}

/*TableRow row=(TableRow) findViewById(R.id.tableRow3);


row.removeViewAt(0);
row.setGravity(Gravity.RIGHT);*/
}
}

3.2.7 Khối Home


Toàn bộ các khối kể trên đều được kết nối tới khối MainActivity, có
chức năng điều hướng chính cho ứng dụng.
public class MainActivity extends AppCompatActivity
implements NavigationView.OnNavigationItemSelectedListener {
private String TAG = "EMGLAB_BK";
public int stateMediaPlayer;
public final int stateMP_Error = 0;
public final int stateMP_NotStarter = 1;
public MediaPlayer mediaPlayer;
private String mHost = "http://118.69.135.22";
private ImageView ads1;
private ImageView ads2;
@Override

protected void onCreate(Bundle savedInstanceState) {


super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
//getSupportActionBar().setDisplayShowHomeEnabled();
String title = getString(R.string.app_name);
getSupportActionBar().setTitle(title);
ImageView ads1 = (ImageView) findViewById(R.id.ads1);
ImageView ads2 = (ImageView) findViewById(R.id.ads2);

27
ads1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// String s = "URASHOP8X.COM";
Uri uri =
Uri.parse("http://www.urashop8x.com/category/khuyen-mai");
Intent intent = new Intent(Intent.ACTION_VIEW,uri);
startActivity(intent);
}
});
ads2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// String s = "shoptotbenre.com";
Uri uri =
Uri.parse("http://www.urashop8x.com/category/khuyen-mai");
Intent intent = new Intent(Intent.ACTION_VIEW,uri);
startActivity(intent);
}
});

FloatingActionButton fab = (FloatingActionButton)


findViewById(R.id.fab);
fab.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
String s = "cái này đang là xu hướng mới này";
Intent intent = new Intent();
intent.setAction(intent.ACTION_SEND);
intent.putExtra(intent.EXTRA_TEXT,s);
intent.setType("text/plain");
startActivity(intent);
}
});

DrawerLayout drawer = (DrawerLayout)


findViewById(R.id.drawer_layout);
ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
this, drawer, toolbar, R.string.navigation_drawer_open,
R.string.navigation_drawer_close);
drawer.setDrawerListener(toggle);
toggle.syncState();

NavigationView navigationView = (NavigationView)


findViewById(R.id.nav_view);
navigationView.setNavigationItemSelectedListener(this);
}

@Override
public void onBackPressed() {
DrawerLayout drawer = (DrawerLayout)
findViewById(R.id.drawer_layout);
if (drawer.isDrawerOpen(GravityCompat.START)) {
drawer.closeDrawer(GravityCompat.START);
} else {
super.onBackPressed();
}
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {

28
// Inflate the menu; this adds items to the action bar if it is
present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();

//noinspection SimplifiableIfStatement
if (id == R.id.action_settings) {
return true;
}

return super.onOptionsItemSelected(item);
}

@SuppressWarnings("StatementWithEmptyBody")
@Override
public boolean onNavigationItemSelected(MenuItem item) {
// Handle navigation view item clicks here.
int id = item.getItemId();

if (id == R.id.nav_hobby) {
Intent intent = new Intent(MainActivity.this,Hobby.class);
startActivity(intent);
// Handle the camera action
} else if (id == R.id.nav_trend) {

Intent intent = new


Intent(MainActivity.this,TrendActivity.class);
startActivity(intent);

} else if (id == R.id.nav_daily) {


Intent intent = new Intent(MainActivity.this,Daily.class);
startActivity(intent);

} else if (id==R.id.nav_home){
Intent intent = new
Intent(MainActivity.this,MainActivity.class);
startActivity(intent);
}else if (id==R.id.nav_barcode) {
Intent intent = new Intent(MainActivity.this,
Scanbarcode.class);
startActivity(intent);
}

DrawerLayout drawer = (DrawerLayout)


findViewById(R.id.drawer_layout);
drawer.closeDrawer(GravityCompat.START);
return true;
}
}
Một số khối còn lại có chức năng tương tự sẽ không được nêu trong phần này
nhưng sẽ có mô tả chi tiết chức năng trong phần đánh giá ứng dụng.

29
3.3 Thiết kế giao diện
Với android, để có thể tương tác với nội dung được lập trình thì cần phải
thiết kế giao diện cho ứng dụng. Giao diện được lập trình trên file xml bao gồm các
file như sau:

3.3.1 Giao diện cho lớp Main


<?xml version="1.0" encoding="utf-8"?>
<android.support.v4.widget.DrawerLayout
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:id="@+id/drawer_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true" tools:openDrawer="start">

<include layout="@layout/app_bar_main"
android:layout_width="match_parent"
android:layout_height="match_parent" />

<android.support.design.widget.NavigationView
android:id="@+id/nav_view"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_gravity="start" android:fitsSystemWindows="true"
app:headerLayout="@layout/nav_header_main"
app:menu="@menu/activity_main_drawer" />

</android.support.v4.widget.DrawerLayout>

3.3.2 Giao diện cho lớp Barcode


<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout
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:fitsSystemWindows="true"
tools:context=".TrendActivity">

<android.support.design.widget.AppBarLayout
android:layout_height="wrap_content"
android:layout_width="match_parent"
android:theme="@style/AppTheme.AppBarOverlay">

<android.support.v7.widget.Toolbar android:id="@+id/toolbar"
android:layout_width="match_parent" android:layout_height="?
attr/actionBarSize"
android:background="?attr/colorPrimary"
app:popupTheme="@style/AppTheme.PopupOverlay" />

</android.support.design.widget.AppBarLayout>

<include layout="@layout/barcode_activity" />

<android.support.design.widget.FloatingActionButton

30
android:id="@+id/fab"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="bottom|end"
android:layout_margin="@dimen/fab_margin"
android:src="@android:drawable/ic_dialog_email" />

</android.support.design.widget.CoordinatorLayout>

3.3.3 Giao diện cho lớp Trend


<?xml version="1.0" encoding="utf-8"?>
<android.support.v4.widget.DrawerLayout
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:id="@+id/drawer_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true" tools:openDrawer="start">

<include layout="@layout/app_bar_trend"
android:layout_width="match_parent"
android:layout_height="match_parent" />

<android.support.design.widget.NavigationView
android:id="@+id/nav_view"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_gravity="start" android:fitsSystemWindows="true"
app:headerLayout="@layout/nav_header_main"
app:menu="@menu/activity_main_drawer" />

</android.support.v4.widget.DrawerLayout>
Các lớp tương tự sẽ không được mô tả tại đây nhưng sẽ được nhắc tới trong quá trình
đánh giá ứng dụng.

3.3.4 Giao diện kết nối cơ sở dữ liệu với listview


<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal"
android:gravity="left"
>

<TextView
android:id="@+id/tv1_branch"
android:layout_width="60dp"
android:layout_height="wrap_content"
android:gravity="left"
android:text="Medium Text"
android:textAppearance="?android:attr/textAppearanceMedium" />

<TextView
android:id="@+id/tv2_branch"
android:layout_width="120dp"
android:layout_height="wrap_content"
android:layout_gravity="left"

31
android:layout_weight="0.03"
android:gravity="left"
android:text="Medium Text"
android:textAppearance="?android:attr/textAppearanceMedium" />

<TextView
android:id="@+id/tv3_branch"
android:layout_width="320dp"
android:layout_height="wrap_content"
android:layout_gravity="left"
android:layout_weight="0.14"
android:gravity="left"
android:text="Medium Text"
android:textAppearance="?android:attr/textAppearanceMedium" />

</LinearLayout>

3.3.5 Giao diện chỉnh sửa cơ sở dữ liệu


<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/LinearLayout1"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >

<TableLayout
android:layout_width="match_parent"
android:layout_height="wrap_content" >

<TableRow
android:id="@+id/tableRow1"
android:layout_width="wrap_content"
android:layout_height="wrap_content" >

<TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Color:"

android:textAppearance="?android:attr/textAppearanceMedium" />

<EditText
android:id="@+id/editTextFirstName"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:ems="10" >

<requestFocus />
</EditText>

</TableRow>

<TableRow
android:id="@+id/tableRow2"
android:layout_width="wrap_content"
android:layout_height="wrap_content" >

<TextView

32
android:id="@+id/textView2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Description:"

android:textAppearance="?android:attr/textAppearanceMedium" />

<EditText
android:id="@+id/editTextLastName"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:ems="10" />
<ImageView
android:id="@+id/test1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>

</TableRow>

<TableRow
android:id="@+id/tableRow3"
android:layout_width="wrap_content"
android:layout_height="wrap_content" >

<Button
android:id="@+id/buttonClear"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Clear" />

<Button
android:id="@+id/buttonInsert"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Save" />

</TableRow>

<TableRow
android:id="@+id/tableRow4"
android:layout_width="wrap_content"
android:layout_height="wrap_content" >
<Button
android:id="@+id/buttonBack"
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:text="Back"/>

</TableRow>
</TableLayout>

</LinearLayout>

33
3.4 File cấu hình cho hệ thống:
Như đã trình bày tại cơ sở lý thuyết, mỗi ứng dụng android đều cần có 1 file
AndroidManifest:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.minh.test_interface" >

<uses-sdk
android:minSdkVersion="21"
android:targetSdkVersion="22" />

<uses-permission android:name="android.permission.CAMERA" />


<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission
android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<application
android:allowBackup="true"
android:icon="@drawable/logoa"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme" >
<activity
android:name=".MainActivity"
android:label="@string/app_name"
android:theme="@style/AppTheme.NoActionBar" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />

<category android:name="android.intent.category.LAUNCHER"
/>
</intent-filter>
</activity>
<activity android:name="TrendActivity"
android:label="@string/trend_name"
android:theme="@style/AppTheme.NoActionBar">

</activity>
<activity android:name="Hobby"
android:label="@string/hobby_name"
android:theme="@style/AppTheme.NoActionBar">
</activity>
<activity android:name="Daily"
android:label="@string/daily_name"
android:theme="@style/AppTheme.NoActionBar">
</activity>
<activity android:name=".BranchActivity"
android:label="Branch"
android:theme="@style/AppTheme.NoActionBar">
</activity>
<activity android:name=".CreateBranch"
android:label="Create"
android:theme="@style/AppTheme.NoActionBar">
</activity>
<activity android:name="ColorActivity"
android:label="Color"
android:theme="@style/AppTheme.NoActionBar">
</activity>
<activity android:name=".CreateColor"
android:label="Create"

34
android:theme="@style/AppTheme.NoActionBar"
></activity>
<activity android:name=".CreateDaily"
android:label="Create"
android:theme="@style/AppTheme.NoActionBar"></activity>
<activity android:name=".DailyActivity"
android:label="DailyActivity"
android:theme="@style/AppTheme.NoActionBar"></activity>
<activity android:name=".Scanbarcode"
android:label="DailyActivity"
android:theme="@style/AppTheme.NoActionBar"></activity>
<activity android:name=".Barcode.BarcodeCaptureActivity"
android:label="DailyActivity"
android:theme="@style/AppTheme.NoActionBar"></activity>

</application>

</manifest>
Kết luận:
Theo những yêu cầu ban đầu được đề ra, việc lập trình đã đạt được một số
kết quả nhất định.

CHƯƠNG 4. ĐÁNH GIÁ KẾT QUẢ


Trải qua quá trình phân tích, thiết kế và thử nghiệm, nhóm đã thu được các
kết quả tích cực. Chương 4 sẽ đưa ra các kết quả thử nghiệm của phần mềm, bao
gồm các hoạt động của các lớp ứng dụng. Trong phần mềm này, các hoạt động đều
dựa trên sự tương tác trên màn hình, không có luồng hoạt động chạy song song, các
chức năng dựa trên bản mô tả yêu cầu đã đưa ra tại chương trước.

35
4.1 Giao diện và chức năng phần mềm

4.1.1 MainActivity

Hình 4.1 Giao diện phần mềm khi khởi động


Tại giao diện này, người dùng sẽ được tương tác với các ImageView, các
ImageView này đại diện cho các banner quảng cáo các nhãn hàng sản phẩm đang có
mặt trên thị trường. Khi kéo vuốt từ phải sang trái, một giao diện tùy chọn sẽ được
hiển thị để người dùng có thể lựa chọn hoạt động mà mình mong muốn.

36
Hình 4.2 Giao diện khi có navigation view

4.1.2 Các giao diện chức năng


Trong phần mềm ứng dụng này, các giao diện chức năng được chia làm bốn
phần chính, bao gồm: Hobby, Trend, Daily và Barcode.

Hình 4.3 Giao diện Trend

37
Tại giao diện này, người dùng sẽ được tương tác với 4 nút chính:
 Hot trend: với nút này, ứng dụng sẽ điều hướng tới trình duyệt để tìm
kiếm xu hướng mới nhất của năm thông qua google.
 Insert: chức năng nhập liệu cho phép người dùng tự nhập thông tin
mình mong muốn về dữ liệu xu hướng của bản thân
 Show: hiển thị toàn bộ thông tin người dùng đã nhập.
 Home: quay trở về màn hình chính.
Với các giao diện Hobby và Daily, các chức năng gần như tương tự.

Hình 4.4 Giao diện Daily

Hình 4.5 Giao diện Color

38
4.1.3 Giao diện nhập liệu
Đây là phần giao diện vô cùng quan trọng, giup người dùng có thể nhập dữ
liệu từ bàn phím vào ứng dụng của mình.

Hình 4.6 Giao diện nhập


Tạo giao diện này:
 branch sẽ dùng để nhập tên sản phẩm:
 Description sẽ là nhập mô tả cho sản phẩn.
 Clear là để xóa toàn bộ phần dữ liệu đã được nhập trong hai ô trên.
 Save khi người dùng đồng ý với những gì đã được nhập.
 Back là để trở về trang trước đó.

39
Hình 4.7 Giao diện danh sách
Giao diện danh sách: toàn bộ danh sách đã được nhập sẽ hiển thị vào danh
sách này. Trong danh sách sẽ có 3 cột tương ứng với các dữ liệu đã nêu.

4.1.4 Giao diện Scanbarcode


Với giao diện này, người dùng có thể thao tác công việc quét mã vạch sản
phẩm để có thể lấy ra được thông tin sản phẩm nào đã có trong danh sách của ứng
dụng. Việc này sẽ giúp người dùng nhận diện được sản phẩm đang có.

40
Hình 4.8 giao diện Scanbarcode
Các chức năng của giao diện:
 Auto focusvaf use flash: tùy chỉnh sử dụng cho camera
 Danh sách: danh sách các sản phẩm cùng mã số đã được lưu bên trong
cơ sở dữ liệu của ứng dụng.
 Nút Check: sau khi ấn nút này, ứng dụng sẽ truy cập tới module
camera của máy để tiến hành quét mã vạch sản phẩm, nếu phát hiện
được đúng sản phẩm đã có trong cơ sở dữ liệu thì sẽ hiển thị tại 2 ô
name và price.

4.2 Đánh giá kết quả


Sau khi đã hoàn thành việc lập trình cho ứng dụng, nhóm chúng em đã thu
được các kết quả như sau:
Ưu điểm:
 Phần mềm đã chạy đúng theo những yêu cầu đề ra ban đầu
 Cơ sở dữ liệu chạy ổn định
 Việc truy cập tới camera chạy ổn định
 Việc tương tác giữa các giao diện chức năng không gặp sự cố.
Hạn chế:
 Cơ sở dữ liệu chưa được tối ưu để tang tốc độ toàn bộ ứng dụng.
 Việc quét barcode còn phụ thuộc vào chất lượng phần cứng của
camera, chưa có sự cải thiện từ thuật toán trong quá trình lập trình.
 Giao diện còn rườm rà, chưa khoa học. thiết kế còn đơn giản.

41
KẾT LUẬN
Tìm hiểu và lập trình ứng dụng Android đang dần trở nên phổ biến trong thế
giới công nghệ phần mềm. Nhóm chúng em đã cố gắng nắm bắt xu hướng công
nghệ này và kết hợp với kiến thức java chúng em được học, nhóm đã thu được các
kết quả như sau:
 Nắm được cách tạo ra một ứng dụng Android cơ bản.
 Cách thiết lập, truy cập và sử dụng cơ sở dữ liệu trên điện thoại.
 Sử dụng khối phần cứng, điều khiển camera trên điện thoại
Trong thời gian thực tập tốt nghiệp lần này, tuy rằng thời gian là không nhiều
để em có thể nghiên cứu và phát triển một cách đầy đủ và hoàn thiện toàn bộ đề tài
nhưng bước đầu em đã có thể tạo dựng được một hệ thống cơ bản. Đây là cơ hội
cho những bạn sinh viên nghiên cứu về sau, cũng như là thách thức cho em trong
việc tối ưu hệ thống. Em mong rằng những ứng dụng như này sẽ được hỗ trợ để
phát triển thêm và tối ưu để có được sự hoàn thiện hơn nữa.

TÀI LIỆU THAM KHẢO


[1] http://javatechig.com/android/android-sqlite-database-tutorial
[2] https://developer.android.com/index.html
[3] https://www.mysql.com/

42

You might also like