Комплекс мобильных приложений по оказанию автомобильной помощи на дорогах

Обзор существующих приложений в сфере оказания автомобильной помощи. Рассмотрение алгоритмического конструирования комплекса мобильных приложений по оказанию автомобильной помощи на дорогах. Оценка тестирования авторизации в приложении для водителя.

Рубрика Программирование, компьютеры и кибернетика
Вид дипломная работа
Язык русский
Дата добавления 12.02.2018
Размер файла 1,9 M

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK |

Intent.FLAG_ACTIVITY_CLEAR_TOP);

PendingIntent pendingIntent = PendingIntent.getActivity(GetOrderService.this, 0, intent,

PendingIntent.FLAG_CANCEL_CURRENT);

mBuilder.setContentIntent(pendingIntent);

mBuilder.mNotification.flags |= Notification.FLAG_AUTO_CANCEL;

notificationManager.notify(0, mBuilder.build());

}

stopSelf();

break;

}

}

}

@Override

public void onFailure(Call<DataOrder> call, Throwable t) {

}

});

} catch (Exception e) {

e.printStackTrace();

}

}

});

}

Д.2.2 Исходный код класса MainMapFragment

public class MainMapFragment extends Fragment implements OnMapReadyCallback, GoogleApiClient.ConnectionCallbacks,

GoogleApiClient.OnConnectionFailedListener, com.google.android.gms.location.LocationListener,

android.location.LocationListener, RoutingListener {

private final static int PLAY_SERVICES_RESOLUTION_REQUEST = 1000;

private static int UPDATE_INTERVAL = 0; // 10 sec

private static int FATEST_INTERVAL = 0; // 5 sec

private static int DISPLACEMENT = 0; // 10 meters

private GoogleMap map;

private GoogleApiClient googleApiClient;

private LocationRequest locationRequest;

private ImageButton find_me_BTN;

private boolean isLocated;

private FragmentTransaction fragmentTransaction;

private Order order = Order.getInstance();

private MyLocation myLocation = MyLocation.getInstance();

private List<Polyline> polylines;

private SharedPreferences sharedPreferences;

private float zoom;

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

polylines = new ArrayList<>();

zoom = 15;

if (checkPlayServices()) {

buildGoogleApiClient();

createLocationRequest();

} else {

Toast.makeText(getContext(), "Google Play Services не поддерживаются данным устройством!", Toast.LENGTH_SHORT).show();

}

}

@Override

public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {

View view = inflater.inflate(R.layout.main_map_fragment, container, false);

SupportMapFragment mapFragment = (SupportMapFragment) this.getChildFragmentManager().findFragmentById(R.id.map);

mapFragment.getMapAsync(this);

find_me_BTN = (ImageButton) view.findViewById(R.id.find_me_BTN);

find_me_BTN.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v) {

if(order.getOrder_status() == Order.OnTheWay){

DrawRoute(true);

}

else {

Location temp = getMyLocation();

myLocation.setLatitude(temp.getLatitude());

myLocation.setLongitude(temp.getLongitude());

moveCameraToMyLocation(true);

}

}

});

return view;

}

@Override

public void onMapReady(GoogleMap googleMap) {

map = googleMap;

map.getUiSettings().setZoomControlsEnabled(true);

map.getUiSettings().setCompassEnabled(true);

map.setOnCameraMoveListener(new GoogleMap.OnCameraMoveListener() {

@Override

public void onCameraMove() {

zoom = map.getCameraPosition().zoom;

}

});

map.setOnMapLoadedCallback(new GoogleMap.OnMapLoadedCallback() {

@Override

public void onMapLoaded() {

if(order.getOrder_status()==Order.OnTheWay){

DrawRoute(true);

}

}

});

}

private void checkPermission() {

if (ActivityCompat.checkSelfPermission(getContext(),

android.Manifest.permission.ACCESS_FINE_LOCATION)

!= PackageManager.PERMISSION_GRANTED

&& ActivityCompat.checkSelfPermission(getContext(),

android.Manifest.permission.ACCESS_COARSE_LOCATION)

!= PackageManager.PERMISSION_GRANTED) {

ActivityCompat.requestPermissions(getActivity(),

new String[]{android.Manifest.permission.ACCESS_FINE_LOCATION}, 1);

}

}

protected synchronized void buildGoogleApiClient() {

googleApiClient = new GoogleApiClient.Builder(getContext())

.addConnectionCallbacks(this)

.addOnConnectionFailedListener(this)

.addApi(LocationServices.API).build();

}

private boolean checkPlayServices() {

int resultCode = GooglePlayServicesUtil

.isGooglePlayServicesAvailable(getActivity());

if (resultCode != ConnectionResult.SUCCESS) {

if (GooglePlayServicesUtil.isUserRecoverableError(resultCode)) {

GooglePlayServicesUtil.getErrorDialog(resultCode, getActivity(),

PLAY_SERVICES_RESOLUTION_REQUEST).show();

} else {

Toast.makeText(getContext(), "Телефон не поддерживает Google Play Services!", Toast.LENGTH_LONG).show();

getActivity().finish();

}

return false;

}

return true;

}

protected void createLocationRequest() {

locationRequest = new LocationRequest();

locationRequest.setInterval(UPDATE_INTERVAL);

locationRequest.setFastestInterval(FATEST_INTERVAL);

locationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);

locationRequest.setSmallestDisplacement(DISPLACEMENT);

}

protected void startLocationUpdates() {

checkPermission();

LocationServices.FusedLocationApi.requestLocationUpdates(googleApiClient, locationRequest, this);

}

protected void stopLocationUpdates() {

LocationServices.FusedLocationApi.removeLocationUpdates(googleApiClient, this);

}

private Location getMyLocation() {

checkPermission();

if (googleApiClient.isConnected()) {

return LocationServices.FusedLocationApi.getLastLocation(googleApiClient);

}

return null;

}

//работа с картой

private void moveCameraToMyLocation(boolean flag){

if(myLocation!=null){

if(map!=null){

isLocated = true;

map.clear();

if(flag){

CameraPosition cameraPosition = new CameraPosition.Builder()

.target(new LatLng(myLocation.getLatitude(), myLocation.getLongitude()))

.zoom(zoom)

.build();

CameraUpdate cameraUpdate = CameraUpdateFactory.newCameraPosition(cameraPosition);

map.animateCamera(cameraUpdate, 300, new GoogleMap.CancelableCallback() {

@Override

public void onFinish() {

}

@Override

public void onCancel() {

}

});

}

map.addMarker(new MarkerOptions().position(new LatLng(myLocation.getLatitude(), myLocation.getLongitude())));

}

else {

Toast.makeText(getContext(), "Карта не может отобразить Ваше местоположение!", Toast.LENGTH_SHORT).show();

}

}

else {

Toast.makeText(getContext(), "Не могу определить местоположение. Попробуйте еще раз!", Toast.LENGTH_SHORT).show();

}

}

private void DrawRoute(boolean flag){

if(map!=null){

map.clear();

if(flag){

LatLngBounds.Builder builder = new LatLngBounds.Builder();

builder.include(new LatLng(myLocation.getLatitude(), myLocation.getLongitude()))

.include(new LatLng(order.getLatitude(), order.getLongitude()));

CameraUpdate cameraUpdate = CameraUpdateFactory.newLatLngBounds(builder.build(), 200);

map.moveCamera(cameraUpdate);

}

else{

CameraPosition cameraPosition = new CameraPosition.Builder()

.target(new LatLng(myLocation.getLatitude(), myLocation.getLongitude()))

.zoom(zoom)

.build();

CameraUpdate cameraUpdate = CameraUpdateFactory.newCameraPosition(cameraPosition);

map.animateCamera(cameraUpdate);

}

map.addMarker(new MarkerOptions().position(new LatLng(order.getLatitude(),

order.getLongitude()))).setIcon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_BLUE));

map.addMarker(new MarkerOptions().position(new LatLng(myLocation.getLatitude(),

myLocation.getLongitude()))).setIcon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_RED));

LatLng start = new LatLng(myLocation.getLatitude(), myLocation.getLongitude());

LatLng end = new LatLng(order.getLatitude(), order.getLongitude());

Routing routing = new Routing.Builder().travelMode(Routing.TravelMode.DRIVING).withListener(this)

.waypoints(start, end).build();

routing.execute();

}

else {

Toast.makeText(getContext(), "Карта не может отобразить Ваше местоположение!", Toast.LENGTH_SHORT).show();

}

}

@Override

public void onRoutingStart() {

}

@Override

public void onRoutingSuccess(ArrayList<Route> route, int shortestRouteIndex) {

if(polylines.size()>0) {

for (Polyline poly : polylines) {

poly.remove();

}

}

polylines = new ArrayList<>();

for (int i = 0; i <route.size(); i++) {

PolylineOptions polyOptions = new PolylineOptions();

polyOptions.color(Color.CYAN);

polyOptions.width(10 + i * 3);

polyOptions.addAll(route.get(i).getPoints());

Polyline polyline = map.addPolyline(polyOptions);

polylines.add(polyline);

}

}

@Override

public void onProviderEnabled(String provider) {

}

@Override

public void onConnectionFailed(@NonNull ConnectionResult connectionResult) {

Toast.makeText(getContext(), "Установить GPS соединение не удалось!", Toast.LENGTH_SHORT).show();

}

@Override

public void onLocationChanged(Location location) {

if((location.getLatitude() == myLocation.getLatitude()) && (location.getLongitude() == myLocation.getLongitude())){

myLocation.setNew(false);

}

else {

myLocation.setLatitude(location.getLatitude());

myLocation.setLongitude(location.getLongitude());

myLocation.setNew(true);

}

if(order.getOrder_status()==Order.OnTheWay){

DrawRoute(false);

return;

}

if(order.getOrder_status()==Order.Performing){

moveCameraToMyLocation(true);

return;

}

if(isLocated){

return;

}

else {

myLocation.setLatitude(location.getLatitude());

myLocation.setLongitude(location.getLongitude());

moveCameraToMyLocation(true);

}

}

@Override

public void onStop() {

super.onStop();

if (googleApiClient.isConnected()) {

googleApiClient.disconnect();

}

}

@Override

public void onStart() {

super.onStart();

if (googleApiClient != null) {

googleApiClient.connect();

}

}

@Override

public void onPause() {

super.onPause();

stopLocationUpdates();

LocalBroadcastManager.getInstance(getContext()).unregisterReceiver(broadcastReceiver);

}

@Override

public void onResume() {

super.onResume();

if (checkPlayServices() && googleApiClient.isConnected()) {

startLocationUpdates();

}

IntentFilter intentFilter = new IntentFilter();

intentFilter.addAction(MyAction.Order);

intentFilter.addAction(MyAction.OrderCanceledByClient);

intentFilter.addAction(MyAction.StartedImplementation);

intentFilter.addAction(MyAction.DrawTwoMarks);

intentFilter.addAction(MyAction.OrderCompleted);

LocalBroadcastManager.getInstance(getContext()).registerReceiver(broadcastReceiver, intentFilter);

switch (order.getOrder_status()){

case Order.Awaiting:{

SelectionFragment selectionFragment = new SelectionFragment();

fragmentTransaction = getActivity().getSupportFragmentManager().beginTransaction();

fragmentTransaction.replace(R.id.info_container_fragment, selectionFragment).commit();

break;

}

case Order.OnTheWay:{

OnTheWayFragment onTheWayFragment = new OnTheWayFragment();

fragmentTransaction = getActivity().getSupportFragmentManager().beginTransaction();

fragmentTransaction.replace(R.id.info_container_fragment, onTheWayFragment).commit();

break;

}

case Order.Performing:{

moveCameraToMyLocation(true);

PerformingFragment performingFragment = new PerformingFragment();

fragmentTransaction = getActivity().getSupportFragmentManager().beginTransaction();

fragmentTransaction.replace(R.id.info_container_fragment, performingFragment).commit();

break;

}

case Order.CanceledByClient:{

moveCameraToMyLocation(true);

Intent intent_order = new Intent(getActivity(), GetOrderService.class);

getContext().startService(intent_order);

break;

}

default:{

StartFragment startFragment = new StartFragment();

fragmentTransaction = getActivity().getSupportFragmentManager().beginTransaction();

fragmentTransaction.replace(R.id.info_container_fragment, startFragment).commit();

break;

}

}

}

private BroadcastReceiver broadcastReceiver = new BroadcastReceiver() {

@Override

public void onReceive(Context context, Intent intent) {

switch (intent.getAction()){

case MyAction.Order:{

SelectionFragment selectionFragment = new SelectionFragment();

fragmentTransaction = getActivity().getSupportFragmentManager().beginTransaction();

fragmentTransaction.replace(R.id.info_container_fragment, selectionFragment).commit();

break;

}

case MyAction.OrderCanceledByClient:{

Toast.makeText(context, "Заказ бы отменен клиентом!", Toast.LENGTH_SHORT).show();

fragmentTransaction = getActivity().getSupportFragmentManager().beginTransaction();

StartFragment startFragment = new StartFragment();

fragmentTransaction.replace(R.id.info_container_fragment, startFragment).commit();

Intent new_intent = new Intent(context, GetOrderService.class);

getActivity().startService(new_intent);

moveCameraToMyLocation(true);

break;

}

case MyAction.DrawTwoMarks:{

DrawRoute(true);

break;

}

case MyAction.StartedImplementation:{

moveCameraToMyLocation(true);

break;

}

case MyAction.OrderCompleted:{

sharedPreferences = getContext().getSharedPreferences("API_KEY",Context.MODE_PRIVATE);

String api_key = sharedPreferences.getString("api_key", "");

App.getApi().getOrderInfo(api_key, order.getOrder_id()).enqueue(new Callback<OrderInfo>() {

@Override

public void onResponse(Call<OrderInfo> call, Response<OrderInfo> response) {

if(response==null){

Toast.makeText(getContext(), "Получить информацию о заказе не удалось!",

Toast.LENGTH_SHORT).show();

Intent intent = new Intent(getContext(), NavigationDrawerActivity.class);

intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);

getContext().startActivity(intent);

}

else {

switch (response.code()){

case STATUS.Ok:{

Bundle bundle = new Bundle();

bundle.putInt("order_id", response.body().order_id);

bundle.putString("company", response.body().company);

bundle.putDouble("distance", response.body().distance);

bundle.putDouble("summary", response.body().summary);

Intent activity_intent = new Intent(getContext(), OrderInfoActivity.class);

activity_intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);

activity_intent.putExtra("data", bundle);

getContext().startActivity(activity_intent);

break;

}

case STATUS.BadRequest:{

break;

}

case STATUS.Unauthorized:{

break;

}

case STATUS.NotFound:{

break;

}

default:{

break;

}

}

}

}

@Override

public void onFailure(Call<OrderInfo> call, Throwable t) {

}

});

break;

}

default:{

break;

}

}

}

};

Приложение Е

Акт приемки/сдачи программного средства

Утверждаю

Зав. каф. «ПОВТиАС»

д.ф. - м.н., проф. А. Н. Карапетянц

«____» _________________ 2017 г.

Студент Кравченко Андрей Геннадьевич

Руководитель Кузин Александр Павлович

Наименование темы «Комплекс мобильных приложений по оказанию автомобильной помощи на дорогах»

Перечень подлежащих проверке функций программного обеспечения

Основные функции, выполняемые программным средством

Выполнение

Алгоритм

ПС

1

Регистрация и авторизация в приложениях

2

Определение и отображение местоположения в приложениях

3

Отображение списка фирм, в которых возможно совершить заказ

4

Отправка запроса на заказ и отмену эвакуатора

5

Уведомление о прибытии эвакуатора

6

Отображение эвакуатора на карте при выполнении заказа

7

Отображение детальной информации о выполненном заказе

8

Изменение статуса оператора эвакуатора

9

Уведомление о заказе с возможностью принять или отменить

10

Отображение заказчика на карте и построение маршрута до него

11

Просмотр истории совершенных заказов в приложениях

Оценка экспертом свойств программного средства

Проверяемые свойства представленного ПО

Оценка эксперта

Соответствие заявленных к проверке функций техническому заданию

Размер программного кода (В том числе соотношение кода созданного вручную к общему объему кода)

Удобство эксплуатации (Трудоемкость установки программного средства, удобство пользовательского интерфейса, наличие контекстной и полнотекстовой помощи)

Сопровождаемость ПО (Сложность/простота конструкции, структурированность программного кода, оформление текста программ, наличие комментариев-заголовков для модулей и комментариев к основным процедурам и функциям)

Надежность ПО (Устойчивость функционирования ПО при наличии ошибок во входных данных и ошибочных ситуациях)

Уровень владения исходным кодом

Краткий отзыв эксперта на представленное программное обеспечение:

Исходные тексты в полном объеме представлены

Эксперт / Гнедина О.А. /

Перечень подлежащих проверке свойств ПО подтверждаю

Руководитель / Кузин А.П. /

Приложение Ж

Протокол предзащиты

заседания комиссии по предварительной защите выпускной квалификационной работы

от «___» июня 2017 г.

Присутствовали:

СЛУШАЛИ: доклад студента группы ВПР41 Кравченко А. Г. по защите выпускной квалификационной работы «Комплекс мобильных приложений по оказанию автомобильной помощи на дорогах».

Были заданы вопросы:

решено отметить следующее:

ПОСТАНОВИЛИ: доклад студента о проделанной работе и ответы на вопросы соответствуют требованиям, предъявляемым к выпускным квалификационным работам, и рекомендует студента Кравченко А. Г. к защите.

Члены комиссии:

Размещено на Allbest.ru


Подобные документы

  • Современное состояние рынка мобильных приложений. Основные подходы к разработке мобильных приложений. Обоснование выбора целевой группы потребителей приложения. Этапы проектирования и разработки мобильного приложения для операционной системы Android.

    курсовая работа [987,1 K], добавлен 27.06.2019

  • Основы создания мидлетов (midlet) - MIDP приложений для мобильных устройств на языке Java. Особенности устройств, для которых мидлеты предназначены. Библиотеки javax.microedition. Практические примеры создания MIDP приложений для телефона и их запуск.

    методичка [25,9 K], добавлен 30.06.2009

  • Анализ архитектуры информационной системы, в структуру которой входят системы файл-сервер и клиент-сервер. Сравнение языков запросов SQL и QBE. Принципы разработки приложений архитектуры клиент-сервер при помощи структурированного языка запросов SQL.

    курсовая работа [88,9 K], добавлен 11.04.2010

  • Архитектура операционной системы Android, набор библиотек для обеспечения базового функционала приложений и виртуальная машина Dalvik. Объектно-ориентированный язык программирования Java как инструмент разработки мобильных приложений для ОС Android.

    дипломная работа [1,6 M], добавлен 08.07.2015

  • Разработка критериев оценки экрана веб-приложений. Основные подходы к защите веб-приложений. Анализ российских нормативных документов. Зарубежная практика выбора экрана веб-приложений. Разработка и обоснование общих требований к механизмам защиты.

    дипломная работа [68,7 K], добавлен 04.08.2016

  • Подходы и алгоритмы автоматизации тестирования. Анализ специфики работы с локальными и веб-приложениями, внедрение автоматических тестов в процесс контроля качества приложений Global XB, GCube и Thistle. Оптимальный инструмент разработки скриптов.

    дипломная работа [1,5 M], добавлен 15.01.2012

  • Преимущество построения Web-приложений для поддержки стандартных функций браузера. Настройка проекта Web-приложения. Создание и изменение исходных файлов. Изменение файла JavaServer Pages по умолчанию. Основные проблемы при выполнении Web-приложений.

    контрольная работа [362,8 K], добавлен 10.11.2013

  • Психолого-педагогические и обще-методические аспекты использования ИКТ в образовательном процессе. Анализ сред разработки мобильных приложений и языков программирования. Технология создания программно-методического комплекса для изучения чукотского языка.

    дипломная работа [5,8 M], добавлен 07.06.2014

  • Знакомство с этапами разработки трёх приложений для системы семейства Linux с использованием языка программирования С++. Анализ особенностей операционной системы Ubuntu 12.10. Характеристика способов тестирования команд с помощью стандартных средств.

    контрольная работа [732,1 K], добавлен 06.08.2013

  • Обзор рынка мобильных приложений, социальных сетей, аналогов. Обзор инструментов разработки: Android Studio, Microsoft visual С# 2012, PostgreeSQL, API Открытых данных Вологодской области, API Социальных сетей. Программный код, разработка интерфейса.

    дипломная работа [2,6 M], добавлен 10.07.2017

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.