Комплекс мобильных приложений по оказанию автомобильной помощи на дорогах
Обзор существующих приложений в сфере оказания автомобильной помощи. Рассмотрение алгоритмического конструирования комплекса мобильных приложений по оказанию автомобильной помощи на дорогах. Оценка тестирования авторизации в приложении для водителя.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | дипломная работа |
Язык | русский |
Дата добавления | 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