Добавлен: 24.04.2023
Просмотров: 314
Скачиваний: 2
СОДЕРЖАНИЕ
1.1 Обзор мобильной ОС Android
1.3 Основы программирования на Android
1.4 Архитектура Android приложения
2.1 Выбор инструментов и технологи
2.2 Проектирование прототипа графического интерфейса
2.5 Описание пользовательского интерфейса
2.6 Проектирование и разработка базы данных
2.7.1 Обзор Amazon Web Services (AWS)
2.8 Аутентификация пользователя
2.8.1 Создание нового аккаунта
2.8.2 Вход пользователя в аккаунт
2.9 Список необходимых разрешений
Теперь сервер готов к работе с приложением, и появилась возможность загружать и выгружать фотографии с сервера.
2.8 Аутентификация пользователя
Множество приложений должны знать личность пользователя. Знание идентификатора позволяет приложению безопасно сохранять пользовательские данные в облаке и обеспечивать персонализированный интерфейс на всех устройствах пользователя.
Для аутентификации пользователей в данном приложении используется Firebase Authentication – набор backend сервисов, простых в использовании SDK (Software Development Kit) и готовые библиотеки пользовательского интерфейса для аутентификации пользователей в приложении. Он поддерживает аутентификацию с использованием паролей и электронной почты, телефонных номеров, Google, Facebook и т.д.
Firebase Authentication тесно интегрируется с другими сервисами Firebase и использует такие стандарты, как OAuth 2.0 и OpenID Connect, поэтому он может быть легко интегрирован с пользовательским backend'ом [9].
В данном приложении Firebase Authentication используется для того, чтобы позволить пользователям приложения проходить аутентификацию с помощью Firebase, используя их адреса электронной почты и пароли.
Чтобы приступить к работе, для начала необходимо добавить Firebase в проект Android Studio через Tools: выбрать Firebase и следовать инструкциям ассистента. В build.gradle файл нужно добавить строчку:
compile 'com.google.firebase:firebase-auth:10.2.6'
Следующий пункт – настройка способа входа в приложение. Для этого в консоли Firebase необходимо зайти в папку с проектом, выбрать вкладку Аутентификация и включить провайдер «Адрес электронной почты и пароль».
2.8.1 Создание нового аккаунта
Для создания нового аккаунта пользователя с паролем, нужно выполнить следующие шаги:
В методе onCreate деятельности с учетными записями (SignupActivity.java) получить экземпляр объекта FirebaseAuth следующим образом:
private FirebaseAuth mAuth;
//…
mAuth = FirebaseAuth.getInstance();
Проверить, зашел ли пользователь в систему в настоящий момент:
@Override
public void onStart() {
super.onStart();
FirebaseUser currentUser = mAuth.getCurrentUser();
updateUI(currentUser);
Создать новую учетную запись, передав адрес электронной почты и пароль нового пользователя в createNewUserWithEmailAndPassw:
mAuth.createNewUserWithEmailAndPassw(email, password)
.addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
@Override
public void onComplete(@NonNull Task<AuthResult> task) {
if (task.isSuccessful()) {
Log.d(TAG, "createNewUser: success");
FirebaseUser user = mAuth.getCurrentUser();
updateUI(user);
} else {
Log.w(TAG, "createNewUser: failure", task.getException());
Toast.makeText(SignupActivity.this, "Authentication failed.",
Toast.LENGTH_SHORT).show();
updateUI(null);
}
hideProgressDialog();
}
});
Если учетная запись была создана, то пользователь автоматически заходит в систему.
2.8.2 Вход пользователя в аккаунт
Процедура входа в учетную запись с электронной почтой и паролем аналогична операциям для создания нового аккаунта. Для входа в приложение нужно осуществить следующие действия:
1) В точности повторить первые два шага алгоритма создания новой учетной записи
2) Передать e-mail и пароль пользователя в signInWithEmailAndPassw:
mAuth.signInWithEmailAndPassw(email, password)
.addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
@Override
public void onComplete(@NonNull Task<AuthResult> task) {
if (task.isSuccessful()) {
Log.d(TAG, "signInWithEmail: success");
FirebaseUser user = mAuth.getCurrentUser();
updateUI(user);
} else {
Log.w(TAG, "signInWithEmail: failure", task.getException());
Toast.makeText(SigninActivity.this, "Authentication failed.",
Toast.LENGTH_SHORT).show();
updateUI(null);
}
if (!task.isSuccessful()) {
mStatusTextView.setText(R.string.authent_failed);
}
hideProgressDialog();
}
});
}
Таким образом, после входа пользователя в первый раз, создается новый аккаунт, связанный с его учетными данными, такими, как адрес электронной почты и пароль. Данная учетная запись хранится как часть проекта Firebase и может использоваться для идентификации пользователя в приложении.
2.9 Список необходимых разрешений
Для легкой работы разрабатываемого приложения, в ходе разработки необходимо добавлять необходимые разрешения в файл AndroidManifext.xml. Ниже приведен список с пояснением их функционала.
<uses-permission android:name="android.permission.CAMERA" /> - запрос на использование камеры
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> - запись или удаление файлов на карте памяти. При наличии данного разрешения READ_EXTERNAL_STORAGE используется автоматически, поэтому для чтения данных с карты памяти, в этом случае, вводить необязательно
<uses-feature android:name="android.hardware.camera" android:required="true"/> - требование приложением наличия камеры
<uses-permission android:name="android.permission.INTERNET" /> - разрешение на использование Интернета
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> - разрешение на доступ к сетевым подключениям
2.10 Создание иконки приложения
После установки мобильного приложения, он обозначается особым значком, называемым иконкой. Она помогает пользователям быстрее находить приложение из множества других.
Для мобильного приложения по управлению личными коллекциями была создана иконка (рис. 15) с помощью онлайн-сервиса Android Asset Studio.
Рис. 15. Иконка приложения
Этот сервис понятен тем, что не требует установки на компьютер, имеет хороший выбор иконок и стилей, и, главное, в результате загружается не одна маленькая картинка, а архив, состоящий из 5 папок с иконками для различных разрешений экрана.
2.11 Тестирование
В ходе использования приложение поэтапно тестировалось как на реальном устройстве (Samsung Galaxy A5), так и на разных эмуляторах с различными диагоналями экрана и разными версиями Android с помощью программного обеспечения Genymotion с целью исследования неточностей и ошибок.
Приложение удачно прошло проверку и исправно запускалось на различных типах смартфонов на OC Android.
Заключение
В моей курсовой работе были получены следующие результаты:
Был произведен обзор ОС Android, и основ программирования для Android
Было спроектировано и разработано приложение на платформе Android для управления личными коллекциями, соответствующее ТЗ
Был произведен обзор применяемых в разрабатываемом приложении технологий
Была продемонстрирована функциональность приложения
Приложение тестировано как на реальном устройстве, так и на различных по своим характеристикам и параметрам эмуляторах из программы Genymotion.
Список использованной литературы и источников
[1] Felker, Donn, and Joshua Dobbs. Android App Development for Dummies. 3rd ed. Vol. 357, Indianapolis, Indiana, Wiley Publishing, Inc., 2011.
[2] Лозовский В. iOS и Android «съели» 98,4% рынка смартфонов [Электронный ресурс]. 2016. URL: https://www.iphones.ru/iNotes/538609 (дата обращения: 18.02.2017).
[3] ТопОбзор. Обзор 10+ облачных хранилищ данных [Электронный ресурс]. 2016. URL: http://www.topobzor.com/obzor-10-oblachnyx-xranilishh-dannyx/.html (дата обращения: 18.02.2017).
[4] AWS Storage Services Overview. A Look at Storage Services Offered by AWS. Vol. 48, Amazon Web Services, Inc., December 2016.
[5] Amazon Web Services. Amazon CloudFront – Сеть доставки контента (CDN) [Электронный ресурс]. URL: https://aws.amazon.com/ru/cloudfront/?nc2=h_m1 (дата обращения: 20.03.2017).
[6] AWS Mobile SDK. Set Up the AWS Mobile SDK for Android [Электронный ресурс]. URL: http://docs.aws.amazon.com/mobile/sdkforandroid/developerguide/setup.html (дата обращения: 20.03.2017).
[7] AWS Mobile SDK. Store and Retrieve Files with Amazon S3 [Электронный ресурс]. URL: https://docs.aws.amazon.com/mobile/sdkforandroid/developerguide/s3transferutility.html (дата обращения: 20.03.2017).
[8] Android Developers [Электронный ресурс]. 2016. URL: http://developer.android.com (дата обращения: 05.02.2017).
[9] Firebase. Authentication [Электронный ресурс]. 2016. URL: https://firebase.google.com (дата обращения: 05.04.2017).
Приложение
Код загрузки фотографии на сервер (AmazonImageUploadManager.java):
import android.content.Context;
import android.util.Log;
import com.amazonaws.auth.CognitoCachingCredentialsProvider;
import com.amazonaws.mobileconnectors.s3.transferutility.TransferListener;
import com.amazonaws.mobileconnectors.s3.transferutility.TransferObserver;
import com.amazonaws.mobileconnectors.s3.transferutility.TransferState;
import com.amazonaws.mobileconnectors.s3.transferutility.TransferUtility;
import com.amazonaws.regions.Regions;
import com.amazonaws.services.s3.AmazonS3Client;
import java.io.File;
import rx.Observable;
import rx.Subscriber;
import static android.content.ContentValues.TAG;
public class AmazonImageUploadManager {
Context mContext;
public AmazonImageUploadManager(Context mContext) {
this.mContext = mContext;
}
public Observable<String> getUploadFileObservable(final File uploadFile, final String filePath) {
return Observable.create(new Observable.OnSubscribe<String>() {
@Override
public void call(final Subscriber<? super String> subscriber) {
CognitoCachingCredentialsProvider credentialsProvider = new CognitoCachingCredentialsProvider(
mContext.getApplicationContext(),
mContext.getString(R.string.aws_bucket_pool_id),
Regions.EU_CENTRAL_1
);
AmazonS3Client s3Client = new AmazonS3Client(credentialsProvider);
TransferUtility transferUtility = new TransferUtility(s3Client, mContext.getApplicationContext());
Log.d(TAG, "local file = " + uploadFile.getPath());
TransferObserver observer = transferUtility.upload(
mContext.getString(R.string.aws_bucket_name),
filePath,
uploadFile
);
Log.d(TAG, "uploading " + "https://s3.eu-central-1.amazonaws.com/" + mContext.getString(R.string.aws_bucket_name) + "/" + filePath);
observer.setTransferListener(new TransferListener() {
@Override
public void onStateChanged(int id, TransferState state) {
if (state == TransferState.COMPLETED) {
subscriber.onNext("https://s3.eu-central-1.amazonaws.com/" + mContext.getString(R.string.aws_bucket_name) + "/" + filePath);
}
}
Код класса ItemDecoration.java, позволяющий располагать фотографии на экране приложения по 3 в строке:
public class ItemDecoration extends RecyclerView.ItemDecoration {
private int mSpace;
public ItemDecoration(int space) {
mSpace = space;
}
@Override
public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
int position = parent.getChildAdapterPosition(view);
outRect.top = mSpace;
if (position % 3 == 0) {
outRect.right = mSpace;
}
if ((position + 1) % 3 == 0) {
outRect.left = mSpace;
}
}
Код класса SquareImage.java, позволяющий представлять загруженные фотографии в виде квадратов для более удобного представления:
public class SquareImage extends ImageView {
public SquareImage(Context context) {
super(context);
}
public SquareImage(Context context, AttributeSet attrs) {
super(context, attrs);
}
public SquareImage(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}