<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	
	xmlns:georss="http://www.georss.org/georss"
	xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#"
	>

<channel>
	<title>Android - Inero Software - Rozwiązania IT i Konsulting</title>
	<atom:link href="https://inero-software.com/pl/tag/android-pl/feed/" rel="self" type="application/rss+xml" />
	<link>https://inero-software.com/pl/tag/android-pl/</link>
	<description>Tworzymy cyfrowe innowacje</description>
	<lastBuildDate>Fri, 08 Apr 2022 12:40:38 +0000</lastBuildDate>
	<language>pl-PL</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.1</generator>

<image>
	<url>https://inero-software.com/wp-content/uploads/2018/11/inero-logo-favicon.png</url>
	<title>Android - Inero Software - Rozwiązania IT i Konsulting</title>
	<link>https://inero-software.com/pl/tag/android-pl/</link>
	<width>32</width>
	<height>32</height>
</image> 
<site xmlns="com-wordpress:feed-additions:1">153509928</site>	<item>
		<title>Jak zaawansowany routing i optymalizacja może wspierać działania w sytuacjach kryzysowych &#8211; przykład użycia</title>
		<link>https://inero-software.com/pl/zaawansowany-routing/</link>
		
		<dc:creator><![CDATA[Adrian Chojnacki]]></dc:creator>
		<pubDate>Mon, 07 Feb 2022 13:00:17 +0000</pubDate>
				<category><![CDATA[Blog_pl]]></category>
		<category><![CDATA[Firma]]></category>
		<category><![CDATA[Technologie]]></category>
		<category><![CDATA[Android]]></category>
		<category><![CDATA[backend]]></category>
		<category><![CDATA[DeliverM8]]></category>
		<category><![CDATA[Java Spring]]></category>
		<category><![CDATA[Kiosk Mode]]></category>
		<category><![CDATA[nawigacja]]></category>
		<category><![CDATA[powiadomienia push]]></category>
		<category><![CDATA[sytuacje kryzysowe]]></category>
		<guid isPermaLink="false">https://inero-software.com/?p=4380</guid>

					<description><![CDATA[<p>Aplikacją, którą w ostatnim czasie opracowaliśmy dla jednego z naszych klientów korporacyjnych, jest system wspomagania decyzji w działaniach ratowniczych, mający na celu poprawę efektywności operacyjnej lokalnych akcji ratowniczych.</p>
<p>Artykuł <a href="https://inero-software.com/pl/zaawansowany-routing/">Jak zaawansowany routing i optymalizacja może wspierać działania w sytuacjach kryzysowych &#8211; przykład użycia</a> pochodzi z serwisu <a href="https://inero-software.com/pl">Inero Software - Rozwiązania IT i Konsulting</a>.</p>
]]></description>
										<content:encoded><![CDATA[<h3></h3>
<p>&nbsp;</p>
<div class="row"><div class="col-sm-3"></div><div class="col-sm-6">
<p style="text-align: left;"><span style="font-weight: 400;"><img decoding="async" class="alignleft wp-image-2873 " src="https://inero-software.com/wp-content/uploads/2019/10/inero-glify-08.png" alt="Paragraph icon" width="94" height="94" srcset="https://inero-software.com/wp-content/uploads/2019/10/inero-glify-08.png 208w, https://inero-software.com/wp-content/uploads/2019/10/inero-glify-08-80x80.png 80w, https://inero-software.com/wp-content/uploads/2019/10/inero-glify-08-50x50.png 50w" sizes="(max-width: 94px) 100vw, 94px" />Aspekty optymalizacji parametrów tras i tworzenia <a href="https://inero-software.com/pl/zarzadzanie-lancuchem-dostaw/">łańcucha dostaw</a> z wykorzystaniem <a href="https://inero-software.com/pl/uczenie-maszynowe/">sztucznej inteligencji</a> zostały niedawno przedstawione w naszych wpisach na blogu. Aplikacją, którą w ostatnim czasie opracowaliśmy dla jednego z naszych klientów korporacyjnych, jest system wspomagania decyzji w działaniach ratowniczych, mający na celu poprawę efektywności operacyjnej lokalnych akcji ratowniczych.</span></p>
<p style="text-align: left;">W tym poście opisaliśmy, w jaki sposób wykorzystaliśmy <a href="http://deliverm8.com">platformę optymalizacji logistyki DeliverM8</a>, jako wsparcie podmiotów w sytuacjach awaryjnych. Pokrótce przedstawimy, jak nowoczesne technologie informatyczne, takie jak aplikacje mobilne, powiadomienia push i aplikacje webowe mogą przynieść wymierne korzyści, a nawet poprawić bezpieczeństwo i efektywność działania, co jest kluczowe w sytuacjach awaryjnych.</p>
<p><img decoding="async" class="aligncenter wp-image-2770 " src="https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10.png" alt="Separating icon" width="105" height="105" srcset="https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10.png 208w, https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10-80x80.png 80w, https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10-50x50.png 50w" sizes="(max-width: 105px) 100vw, 105px" /></p>
<h3><span style="color: #800080;"><b>Przykład użycia</b></span></h3>
<p><b><span style="font-weight: 400;"><img decoding="async" class="wp-image-2873 alignleft" src="https://inero-software.com/wp-content/uploads/2019/10/inero-glify-08.png" alt="Paragraph icon" width="94" height="94" srcset="https://inero-software.com/wp-content/uploads/2019/10/inero-glify-08.png 208w, https://inero-software.com/wp-content/uploads/2019/10/inero-glify-08-80x80.png 80w, https://inero-software.com/wp-content/uploads/2019/10/inero-glify-08-50x50.png 50w" sizes="(max-width: 94px) 100vw, 94px" /></span></b>Opisywany w artykule przypadek użycia to system wspierający lokalne zespoły straży pożarnej w nawigacji i komunikacji w czasie rzeczywistym podczas akcji, który jest archiwizowany poprzez dostarczanie członkom zespołu aktualnego ruchu, blokady drogowej i ogólnej aktualnej świadomości sytuacyjnej w zakresie dostępności tras oraz wsparcie w czasie rzeczywistym.</p>
<p>Wdrożony system musi spełniać następujące wymagania:</p>
<ul>
<li><span style="font-weight: 400;">umożliwia wpisanie adresu zdarzenia,</span></li>
<li><span style="font-weight: 400;">generuje trzy alternatywne trasy do wybranego miejsca zdarzenia,</span></li>
<li>informuje straż pożarną za pomocą powiadomień push, wiadomości tekstowych lub innych opcji&#8230;</li>
<li>bezproblemowo przesyła trasę do wbudowanego urządzenia nawigacyjnego (Android),</li>
<li><span style="font-weight: 400;">wyświetla trasę i lokalizację infrastruktury ratunkowej (najbliższe hydranty, punkty ewakuacyjne itp.) wokół zdarzenia, umożliwiając wybór miejsca docelowego,</span></li>
<li><span style="font-weight: 400;">nawiguje do wybranego celu poprzez wbudowany system nawigacji.</span></li>
</ul>
<p>Wchodząc naprzeciw tym wymaganiom zbudowaliśmy architekturę trójwarstwową, w której baza danych znajduje się na centralnym serwerze, a dostęp do niej możliwy jest poprzez moduł zarządzania i przetwarzania danych. Serwer operacyjny udostępnia funkcjonalności dostępne poprzez REST API dla interfejsu użytkownika dedykowanego dla przeglądarek internetowych i aplikacji mobilnych. Strukturę komunikacji pomiędzy poszczególnymi komponentami przedstawiono na poniższym rysunku.</p>
<p><img loading="lazy" decoding="async" class="aligncenter wp-image-3242 size-full" src="https://inero-software.com/wp-content/uploads/2021/01/architecture.png" alt="The communication structure between the individual components" width="697" height="508" srcset="https://inero-software.com/wp-content/uploads/2021/01/architecture.png 697w, https://inero-software.com/wp-content/uploads/2021/01/architecture-300x219.png 300w, https://inero-software.com/wp-content/uploads/2021/01/architecture-412x300.png 412w" sizes="(max-width: 697px) 100vw, 697px" /></p>
<p>Docelowa aplikacja została zaimplementowana przy użyciu Java Spring z PostgreSQL, natomiast aplikację webową i na Androida dostarczył <a href="https://angular.io/">framework Angular</a>.</p>
<p><img loading="lazy" decoding="async" class="wp-image-2770 aligncenter" src="https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10.png" alt="Separating icon" width="116" height="116" srcset="https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10.png 208w, https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10-80x80.png 80w, https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10-50x50.png 50w" sizes="(max-width: 116px) 100vw, 116px" /></p>
<h3><span style="color: #800080;"><b>Przykład wykorzystania systemu</b></span></h3>
<p><span style="font-weight: 400;"><img loading="lazy" decoding="async" class="wp-image-2873 alignleft" src="https://inero-software.com/wp-content/uploads/2019/10/inero-glify-08.png" alt="Paragraph icon" width="118" height="118" srcset="https://inero-software.com/wp-content/uploads/2019/10/inero-glify-08.png 208w, https://inero-software.com/wp-content/uploads/2019/10/inero-glify-08-80x80.png 80w, https://inero-software.com/wp-content/uploads/2019/10/inero-glify-08-50x50.png 50w" sizes="(max-width: 118px) 100vw, 118px" />Jednym z najważniejszych czynników dla końcowego użytkownika pracy z proponowanym systemem jest odpowiednia obsługa przejezdności w czasie rzeczywistym wybranych tras. Dlatego zaproponowaliśmy rozwiązanie, w którym nasz system komunikuje się poprzez dedykowane interfejsy z wewnętrzną infrastrukturą naszych klientów i weryfikuje przejezdność wybranej trasy. W przypadku blokady drogowej system jest w stanie wybrać różne trasy, które płynnie przechodzą do urządzenia nawigacyjnego. Generowanie tras działa w oparciu o proces iteracyjny i sukcesywne omijanie punktów drogi, którymi w tym przypadku są przejazdy kolejowe. Posiadając wizualizację i niezbędne parametry, użytkownik może wybrać najlepszą w danym momencie alternatywę.</span></p>
<p><span style="font-weight: 400;">W celu zilustrowania działania systemu wygenerowane rozwiązanie pokazano na poniższym rysunku.</span></p>
<p><span style="font-weight: 400;"><img loading="lazy" decoding="async" class="aligncenter wp-image-3235 size-full" src="https://inero-software.com/wp-content/uploads/2021/01/article.png" alt="Visualisation of the system" width="1912" height="1225" srcset="https://inero-software.com/wp-content/uploads/2021/01/article.png 1912w, https://inero-software.com/wp-content/uploads/2021/01/article-300x192.png 300w, https://inero-software.com/wp-content/uploads/2021/01/article-768x492.png 768w, https://inero-software.com/wp-content/uploads/2021/01/article-1030x660.png 1030w, https://inero-software.com/wp-content/uploads/2021/01/article-468x300.png 468w, https://inero-software.com/wp-content/uploads/2021/01/article-466x300.png 466w" sizes="(max-width: 1912px) 100vw, 1912px" /></span></p>
<p>Dodatkowo, klikając w sekcję <em><strong>&#8222;Plan&#8221;</strong></em> jak na powyższym rysunku, użytkownik może przeanalizować dane dotyczące trasy, takie jak przejazdy kolejowe, odległość w kilometrach i ETA (szacowany czas dojazdu). Kolejnym krokiem jest wybranie trasy poprzez kliknięcie w mapę i wgranie jej do aplikacji nawigacyjnej dla brygady ratunkowej. Dzięki temu system informuje wbudowany podsystem nawigacji tablet o zdarzeniu od strony backendu m.in. poprzez powiadomienie push lub SMS.</p>
<p><img loading="lazy" decoding="async" data-attachment-id="4943" data-permalink="https://inero-software.com/pl/zaawansowany-routing/pushcomp-2/" data-orig-file="https://inero-software.com/wp-content/uploads/2022/02/pushcomp.gif" data-orig-size="660,996" data-comments-opened="0" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="pushcomp" data-image-description="" data-image-caption="" data-medium-file="https://inero-software.com/wp-content/uploads/2022/02/pushcomp-199x300.gif" data-large-file="https://inero-software.com/wp-content/uploads/2022/02/pushcomp.gif" tabindex="0" role="button" class="aligncenter wp-image-4943 size-full" src="https://inero-software.com/wp-content/uploads/2022/02/pushcomp.gif" alt="push notification" width="660" height="996" /></p>
<p>&nbsp;</p>
<p><span style="font-weight: 400;">Po zatwierdzeniu tego powiadomienia system wyświetla element mapy z trasą docelową oraz informacjami niezbędnymi do wykonania akcji ratunkowej, takimi jak lokalizacje hydrantów w pobliżu miejsca zdarzenia. Kliknięcie w cel umożliwia użytkownikowi nawigację za pomocą wbudowanego przycisku funkcji nawigacji. Pokazaliśmy to w poniższych animacjach GIF.</span></p>
<p><img loading="lazy" decoding="async" data-attachment-id="4944" data-permalink="https://inero-software.com/pl/zaawansowany-routing/mapcomp-2/" data-orig-file="https://inero-software.com/wp-content/uploads/2022/02/mapcomp.gif" data-orig-size="660,996" data-comments-opened="0" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="mapcomp" data-image-description="" data-image-caption="" data-medium-file="https://inero-software.com/wp-content/uploads/2022/02/mapcomp-199x300.gif" data-large-file="https://inero-software.com/wp-content/uploads/2022/02/mapcomp.gif" tabindex="0" role="button" class="aligncenter wp-image-4944 size-full" src="https://inero-software.com/wp-content/uploads/2022/02/mapcomp.gif" alt="map navigation" width="660" height="996" /><img loading="lazy" decoding="async" data-attachment-id="4945" data-permalink="https://inero-software.com/pl/zaawansowany-routing/navigationcomp-2/" data-orig-file="https://inero-software.com/wp-content/uploads/2022/02/navigationcomp.gif" data-orig-size="664,994" data-comments-opened="0" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="navigationcomp" data-image-description="" data-image-caption="" data-medium-file="https://inero-software.com/wp-content/uploads/2022/02/navigationcomp-200x300.gif" data-large-file="https://inero-software.com/wp-content/uploads/2022/02/navigationcomp.gif" tabindex="0" role="button" class="aligncenter wp-image-4945 size-full" src="https://inero-software.com/wp-content/uploads/2022/02/navigationcomp.gif" alt="map navigation" width="664" height="994" /> <img loading="lazy" decoding="async" class="wp-image-2770 aligncenter" src="https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10.png" alt="Separating icon" width="116" height="116" srcset="https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10.png 208w, https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10-80x80.png 80w, https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10-50x50.png 50w" sizes="(max-width: 116px) 100vw, 116px" /></p>
<h3><span style="color: #800080;"><b>Podsumowanie</b></span></h3>
<p><span style="font-weight: 400;"><img loading="lazy" decoding="async" class="wp-image-2873 alignleft" src="https://inero-software.com/wp-content/uploads/2019/10/inero-glify-08.png" alt="Paragraph icon" width="101" height="101" srcset="https://inero-software.com/wp-content/uploads/2019/10/inero-glify-08.png 208w, https://inero-software.com/wp-content/uploads/2019/10/inero-glify-08-80x80.png 80w, https://inero-software.com/wp-content/uploads/2019/10/inero-glify-08-50x50.png 50w" sizes="(max-width: 101px) 100vw, 101px" />W tym krótkim blogu dotyczącym przypadków użycia przedstawiliśmy, w jaki sposób nasza <a href="https://deliverm8.com">platforma do optymalizacji transportu logistycznego</a> pomaga we wspieraniu wykonywania działań ratowniczych w czasie rzeczywistym. Przykład wykorzystania w pełni połączonego systemu dla standardowego użytkownika zajmuje <em><strong>około minuty</strong></em> od wskazania celu do wysłania danych nawigacyjnych do tabletu mobilnego. Istnieje znaczna różnica czasu w porównaniu z poprzednim wykonaniem wszystkich czynności. Ponadto pożądana trasa jest wybierana na podstawie bloku decyzyjnego i informacji wejściowych analizowanych w czasie rzeczywistym. Dodatkowo system udostępnia specjalistyczne narzędzia dostosowane do potrzeb klienta, a mianowicie archiwizację i raportowanie wcześniejszych incydentów oraz ich wizualizację i analizę w dedykowanym responsywnym interfejsie użytkownika.</span></p>
<p><a href="https://inero-software.com/pl/"><span style="color: #800080;"><strong>Inero Software</strong></span></a> oferuje wiedzę i doświadczenie w zakresie skutecznego wykorzystywania najnowocześniejszych technologii i danych do kształtowania korporacyjnych produktów cyfrowych przyszłości.</p>
<p>W sekcji <a href="https://inero-software.com/pl/category/firma/"><span style="color: #800080;"><strong>BLOG</strong></span> </a>można znaleźć inne artykuły dotyczące nowoczesnych rozwiązań dla przedsiębiorstw.</p>
<p></p></div><div class="col-sm-3"></div></div>
<p>Artykuł <a href="https://inero-software.com/pl/zaawansowany-routing/">Jak zaawansowany routing i optymalizacja może wspierać działania w sytuacjach kryzysowych &#8211; przykład użycia</a> pochodzi z serwisu <a href="https://inero-software.com/pl">Inero Software - Rozwiązania IT i Konsulting</a>.</p>
]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">4380</post-id>	</item>
		<item>
		<title>Adroid Kiosk Mode &#8211; jak zmienić urządzenie z Androidem w urządzenie do dedykowanego użytku</title>
		<link>https://inero-software.com/pl/android-kiosk-mode/</link>
		
		<dc:creator><![CDATA[Andrzej Chybicki]]></dc:creator>
		<pubDate>Thu, 03 Feb 2022 14:08:19 +0000</pubDate>
				<category><![CDATA[Blog_pl]]></category>
		<category><![CDATA[Firma]]></category>
		<category><![CDATA[Technologie]]></category>
		<category><![CDATA[Tutorial]]></category>
		<category><![CDATA[Android]]></category>
		<category><![CDATA[android kiosk mode]]></category>
		<category><![CDATA[aplikacja]]></category>
		<category><![CDATA[urządzenia mobilne]]></category>
		<guid isPermaLink="false">https://inero-software.com/?p=4354</guid>

					<description><![CDATA[<p>W pełni zarządzane, dedykowane urządzenia służą określonemu celu. Dzięki temu możliwe jest maksymalne wykorzystanie urządzenia, przy jednoczesnym ograniczeniu korzystania z funkcji osobistych takich jak np. komunikatory. Z wieloma takimi urządzeniami mamy do czynienia na co dzień. Są to między innymi automaty, drukarki biletów czy parkomaty.</p>
<p>Artykuł <a href="https://inero-software.com/pl/android-kiosk-mode/">Adroid Kiosk Mode &#8211; jak zmienić urządzenie z Androidem w urządzenie do dedykowanego użytku</a> pochodzi z serwisu <a href="https://inero-software.com/pl">Inero Software - Rozwiązania IT i Konsulting</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<div class="row"><div class="col-sm-1"></div><div class="col-sm-10">
<p><img loading="lazy" decoding="async" class="wp-image-2770 aligncenter" src="https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10.png" alt="Separating icon" width="80" height="80" srcset="https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10.png 208w, https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10-80x80.png 80w, https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10-50x50.png 50w" sizes="(max-width: 80px) 100vw, 80px" /></p>
<p><span style="font-weight: 400;"><img loading="lazy" decoding="async" class="alignleft wp-image-2873 size-thumbnail" src="https://inero-software.com/wp-content/uploads/2019/10/inero-glify-08-80x80.png" alt="Paragraph icon" width="80" height="80" srcset="https://inero-software.com/wp-content/uploads/2019/10/inero-glify-08-80x80.png 80w, https://inero-software.com/wp-content/uploads/2019/10/inero-glify-08-50x50.png 50w, https://inero-software.com/wp-content/uploads/2019/10/inero-glify-08.png 208w" sizes="(max-width: 80px) 100vw, 80px" /></span></p>
<p>Systemu Android nie trzeba przedstawiać. Obecnie jest to najbardziej popularny system operacyjny dla smartfonów. Jednak Android nie jest już używany tylko w elektronice użytkowej. Dziś urządzenia z Androidem możemy spotkać na każdym kroku. System ten jest coraz częściej stosowany w takich branżach jak: bezpieczeństwo, automatyzacja, logistyka, sprzedaż, hotelarstwo itp. Ze względu na łatwość użytkowania, poziom dostosowania i niższe koszty, urządzenia z Androidem są wybierane przez wiele przedsiębiorstw. Jednak dla wielu firm systemy Android nie są uważane za wystarczająco bezpieczne do użytku w miejscu pracy. Jednym z najlepszych rozwiązań dla powyższych problemów jest narzędzie Kiosk Mode, które pozwala przekonwertować Twoje urządzenie z Androidem w dedykowaną aplikację, zapewniając jednocześnie dodatkowe bezpieczeństwo i redukując dodatkowe elementy rozpraszające uwagę. Życzymy miłej lektury!</p>
<p><img loading="lazy" decoding="async" class="aligncenter wp-image-2770 size-thumbnail" src="https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10-80x80.png" alt="Separating icon" width="80" height="80" srcset="https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10-80x80.png 80w, https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10-50x50.png 50w, https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10.png 208w" sizes="(max-width: 80px) 100vw, 80px" /></p>
<h2><span style="color: #800080;"><b>COSU &#8211; corporate-owned single use device (urządzenie do dedykowanego użytku dla firm)</b></span></h2>
<p><span style="font-weight: 400;"><img loading="lazy" decoding="async" class="alignleft wp-image-2873 size-thumbnail" src="https://inero-software.com/wp-content/uploads/2019/10/inero-glify-08-80x80.png" alt="Paragraph icon" width="80" height="80" srcset="https://inero-software.com/wp-content/uploads/2019/10/inero-glify-08-80x80.png 80w, https://inero-software.com/wp-content/uploads/2019/10/inero-glify-08-50x50.png 50w, https://inero-software.com/wp-content/uploads/2019/10/inero-glify-08.png 208w" sizes="(max-width: 80px) 100vw, 80px" />W pełni zarządzane, dedykowane urządzenia służą określonemu celu. Dzięki temu możliwe jest maksymalne wykorzystanie urządzenia, przy jednoczesnym ograniczeniu korzystania z funkcji osobistych takich jak np. komunikatory. Z wieloma takimi urządzeniami mamy do czynienia na co dzień. Są to między innymi automaty, drukarki biletów czy parkomaty. COSU umożliwia administratorom IT zdalne sterowanie wszystkimi tymi urządzeniami i blokowanie urządzeń dla określonej aplikacji. Uniemożliwia to użytkownikom korzystanie z innych aplikacji lub wykonywanie innych czynności na tych urządzeniach.</span></p>
<p><img loading="lazy" decoding="async" class="aligncenter wp-image-2770 size-thumbnail" src="https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10-80x80.png" alt="Separating icon" width="80" height="80" srcset="https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10-80x80.png 80w, https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10-50x50.png 50w, https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10.png 208w" sizes="(max-width: 80px) 100vw, 80px" /></p>
<h2><span style="color: #800080;"><b>Kiosk Mode</b></span></h2>
<p><span style="font-weight: 400;"><img loading="lazy" decoding="async" class="alignleft wp-image-2873 size-thumbnail" src="https://inero-software.com/wp-content/uploads/2019/10/inero-glify-08-80x80.png" alt="Paragraph icon" width="80" height="80" srcset="https://inero-software.com/wp-content/uploads/2019/10/inero-glify-08-80x80.png 80w, https://inero-software.com/wp-content/uploads/2019/10/inero-glify-08-50x50.png 50w, https://inero-software.com/wp-content/uploads/2019/10/inero-glify-08.png 208w" sizes="(max-width: 80px) 100vw, 80px" /></span></p>
<p><span style="font-weight: 400;">Kiosk Mode pozwala zamienić urządzenia z Androidem w urządzenia do dedykowanego użytku (Single-Use Device), uruchamiając tylko jedną aplikację lub określony zestaw aplikacji. Począwszy od Androida 5.0 Lollipop, system oferuje dwa sposoby blokowania urządzenia w określonym celu:</span></p>
<p>&nbsp;</p>
<ul>
<li aria-level="1">App pinning &#8211; korzystając z funkcji przypinania aplikacji, użytkownicy mogą tymczasowo przypiąć dowolną zainstalowaną aplikację na ekranie. Przyciski nawigacyjne są widoczne, ale nieaktywne. Użytkownik może wyjść z tego trybu, przytrzymując jednocześnie przycisk &#8222;Home&#8221; i &#8222;Recent apps&#8221;.</li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">Lock task mode &#8211; jest to jeszcze skuteczniejszy sposób na przekształcenie urządzenia z Androidem w dedykowane urządzenie o tylko jednym przeznaczeniu. Tylko aplikacje umieszczone na białej liście przez Device Policy Controller (DPC) mogą być blokowane. Przyciski nawigacyjne są ukryte. Jest to tryb dostępny tylko dla właścicieli urządzeń.</span></li>
</ul>
<p><span style="font-weight: 400;">Uruchomienie aplikacji w trybie Kiosk Mode daje nam szereg korzyści:</span></p>
<ul>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">urządzenie działa jako pojedyncza platforma,</span></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">ukryte przyciski nawigacyjne (lock task mode),</span></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">nieaktywny pasek stanu,</span></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">automatyczne uruchamianie aplikacji wraz ze startem systemu,</span></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">wyłączone powiadomienia,</span></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">zablokowane połączenia przychodzące,</span></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">nieaktywne przejście do ustawień,</span></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">praca w trybie pełnoekranowym,</span></li>
</ul>
<p><img loading="lazy" decoding="async" class="aligncenter wp-image-2770 size-thumbnail" src="https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10-80x80.png" alt="Separating icon" width="80" height="80" srcset="https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10-80x80.png 80w, https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10-50x50.png 50w, https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10.png 208w" sizes="(max-width: 80px) 100vw, 80px" /></p>
<h2><span style="color: #800080;"><b>Jak włączyć tryb Android Kiosk Mode?</b></span></h2>
<p><span style="font-weight: 400;"><img loading="lazy" decoding="async" class="alignleft wp-image-2873 size-thumbnail" src="https://inero-software.com/wp-content/uploads/2019/10/inero-glify-08-80x80.png" alt="Paragraph icon" width="80" height="80" srcset="https://inero-software.com/wp-content/uploads/2019/10/inero-glify-08-80x80.png 80w, https://inero-software.com/wp-content/uploads/2019/10/inero-glify-08-50x50.png 50w, https://inero-software.com/wp-content/uploads/2019/10/inero-glify-08.png 208w" sizes="(max-width: 80px) 100vw, 80px" /></span></p>
<p>&nbsp;</p>
<p><span style="font-weight: 400;">Pierwszym krokiem jest zaimplementowanie klasy dziedziczącej po klasie DeviceAdminReceiver:</span></p>
<p>&nbsp;</p>
<pre><span style="font-weight: 400;">class MyDeviceAdminReceiver : DeviceAdminReceiver() {</span>
<span style="font-weight: 400;">    companion object {</span>
<span style="font-weight: 400;">        fun getComponentName(context: Context): ComponentName {</span>
<span style="font-weight: 400;">            return ComponentName(context.applicationContext, MyDeviceAdminReceiver::class.java)</span>
<span style="font-weight: 400;">        }</span>
<span style="font-weight: 400;">    }</span>
<span style="font-weight: 400;">}</span></pre>
<p><span style="font-weight: 400;">DeviceAdminReceiver to klasa, która zapewnia wygodę w interpretacji surowych działań intencji, które są wysyłane przez system.</span></p>
<p><span style="font-weight: 400;">Następnie musimy poinformować system, że nasza aplikacja ma zostać administratorem urządzenia. Możemy to zrobić dodając odbiornik w pliku AndroidManifest.xml:</span></p>
<pre><span style="font-weight: 400;">&lt;application&gt;</span>
<span style="font-weight: 400;">          ...</span>
<span style="font-weight: 400;">      &lt;receiver</span>
<span style="font-weight: 400;">            android:name=".MyDeviceAdminReceiver"</span>
<span style="font-weight: 400;">            android:description="@string/app_desc"</span>
<span style="font-weight: 400;">            android:label="@string/app_name"</span>
<span style="font-weight: 400;">            android:permission="android.permission.BIND_DEVICE_ADMIN"&gt;</span>
<span style="font-weight: 400;">            &lt;meta-data</span>
<span style="font-weight: 400;">                android:name="android.app.device_admin" /&gt;</span>
<span style="font-weight: 400;">            &lt;intent-filter&gt;</span>
<span style="font-weight: 400;">                &lt;action android:name="android.app.action.DEVICE_ADMIN_ENABLED" /&gt;</span>
<span style="font-weight: 400;">            &lt;/intent-filter&gt;</span>
<span style="font-weight: 400;">        &lt;/receiver&gt;</span>
<span style="font-weight: 400;">    &lt;/application&gt;</span></pre>
<p><span style="font-weight: 400;">W tym momencie możemy przystąpić do instalacji aplikacji. Pamiętaj, że jeśli chcesz przyznać uprawnienia administracyjne do aplikacji, musisz usunąć wszystkich istniejących użytkowników. Najprostszym sposobem jest przywrócenie fabrycznych ustawień urządzenia. Ważne jest, aby podczas pierwszego uruchomienia po resecie nie dodawać konta Google do urządzenia. Lista kroków do poprawnej konfiguracji jest następująca:</span></p>
<ol>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">przywrócenie ustawień fabrycznych na urządzeniu mobilnym,</span></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">pominięcie dodawanie konta Google,</span></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">włączenie trybu deweloperskiego i debugowania USB na urządzeniu mobilnym,</span></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">zainstalowanie adb (Android Device Bridge) na swoim komputerze &#8211; jest on automatycznie instalowany z Android Studio,</span></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">zainstalowanie aplikacji na urządzeniu mobilnym za pomocą Android Studio lub wpisując w konsoli następujące polecenia: </span><span style="font-weight: 400;"> </span>
<ol>
<li style="font-weight: 400;" aria-level="1">
<pre>adb install path / to / kiosk / application.apk</pre>
</li>
</ol>
</li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">nadanie uprawnień administratora urządzenia aplikacji:</span>
<ol>
<li style="font-weight: 400;" aria-level="2">
<pre><span style="font-weight: 400;">adb shell dpm set-device-owner pl.inero.deliverM8 / .MyDeviceAdminReceiver</span></pre>
</li>
</ol>
</li>
</ol>
<p><span style="font-weight: 400;">Użyj następującego fragmentu kodu, aby sprawdzić czy proces przyznawania się powiódł:</span></p>
<pre><span style="font-weight: 400;">override fun onCreate(savedInstanceState: Bundle?) {</span>
<span style="font-weight: 400;">        super.onCreate(savedInstanceState)</span>
<span style="font-weight: 400;">        mDevicePolicyManager = getSystemService(Context.DEVICE_POLICY_SERVICE) as DevicePolicyManager</span>
<span style="font-weight: 400;">        val isAdmin = mDevicePolicyManager.isDeviceOwnerApp(packageName)</span>
<span style="font-weight: 400;">        if (isAdmin) {</span>
<span style="font-weight: 400;">            println("You are an admin")</span>
<span style="font-weight: 400;">        } else {</span>
<span style="font-weight: 400;">            println("You are not an admin")</span>
<span style="font-weight: 400;">        }</span>
<span style="font-weight: 400;">    }</span></pre>
<p><span style="font-weight: 400;">W zależności od potrzeb możemy umożliwić użytkownikowi wyłączenie Kiosk Mode poprzez interfejs (np. poprzez potwierdzenie hasłem) lub całkowicie zablokować wyjście z aplikacji. Za pomocą poniższych fragmentów kodu postaram się wyjaśnić, w jaki sposób możesz kontrolować ustawienia, aby uzyskać rozwiązanie najlepiej odpowiadające Twoim potrzebom.</span></p>
<p><span style="font-weight: 400;">Jednym z parametrów, które możemy kontrolować jest to, czy utrzymujemy urządzenie włączone, gdy jest ono podłączone. &#8222;0&#8221; oznacza, że nigdy nie pozostaje włączone, gdy jest podłączone.</span></p>
<pre><span style="font-weight: 400;">private fun enableStayOnWhilePluggedIn(active: Boolean) = if (active) {</span>
<span style="font-weight: 400;">        mDevicePolicyManager.setGlobalSetting(mAdminComponentName,</span>
<span style="font-weight: 400;">                Settings.Global.STAY_ON_WHILE_PLUGGED_IN,</span>
<span style="font-weight: 400;">                (BatteryManager.BATTERY_PLUGGED_AC</span>
<span style="font-weight: 400;">                        or BatteryManager.BATTERY_PLUGGED_USB</span>
<span style="font-weight: 400;">                        or BatteryManager.BATTERY_PLUGGED_WIRELESS).toString())</span>
<span style="font-weight: 400;">    } else {</span>
<span style="font-weight: 400;">        mDevicePolicyManager.setGlobalSetting(mAdminComponentName, Settings.Global.STAY_ON_WHILE_PLUGGED_IN, "0")</span>
<span style="font-weight: 400;">    }</span></pre>
<p>Jeżeli chcemy nałożyć ograniczenia na użytkownika, możemy skorzystać z metody addUserRestrictrion (ComponentName admin, String key). Użytkownik urządzenia musi mieć uprawnienia administratora, w przeciwnym razie zostanie zgłoszony wyjątek bezpieczeństwa. Tę metodę można wywołać na instancji DevicePolicyManager.</p>
<pre><span style="font-weight: 400;">mDevicePolicyManager = getSystemService (Context.DEVICE_POLICY_SERVICE) as DevicePolicyManager</span></pre>
<p><span style="font-weight: 400;">W naszym przypadku zablokowaliśmy użytkownikowi przywracanie ustawień fabrycznych, dodawanie nowych użytkowników, podłączanie nośników zewnętrznych, kontrolowanie głośności urządzenia i wyłączanie paska statusu:</span></p>
<pre><span style="font-weight: 400;">private fun setRestrictions(disallow: Boolean) {</span>
<span style="font-weight: 400;">        setUserRestriction(UserManager.DISALLOW_FACTORY_RESET, disallow)</span>
<span style="font-weight: 400;">        setUserRestriction(UserManager.DISALLOW_ADD_USER, disallow)</span>
<span style="font-weight: 400;">        setUserRestriction(UserManager.DISALLOW_MOUNT_PHYSICAL_MEDIA, disallow)</span>
<span style="font-weight: 400;">        setUserRestriction(UserManager.DISALLOW_ADJUST_VOLUME, disallow)</span>
<span style="font-weight: 400;">        mDevicePolicyManager.setStatusBarDisabled(mAdminComponentName, disallow)</span>
<span style="font-weight: 400;">    }
</span><span style="font-weight: 400;">private fun setUserRestriction(restriction: String, disallow: Boolean) = if (disallow) {</span>
<span style="font-weight: 400;">        mDevicePolicyManager.addUserRestriction(mAdminComponentName, restriction)</span>
<span style="font-weight: 400;">    } else {</span>
<span style="font-weight: 400;">        mDevicePolicyManager.clearUserRestriction(mAdminComponentName, restriction)</span>
<span style="font-weight: 400;">    }</span></pre>
<p><span style="font-weight: 400;">Jeżeli chcemy, aby nasza aplikacja startowała wraz ze startem systemu, to musimy dodać odpowiednie filtry:</span></p>
<pre><span style="font-weight: 400;">private fun setAsHomeApp(enable: Boolean) {</span>
<span style="font-weight: 400;">        if (enable) {</span>
<span style="font-weight: 400;">            val intentFilter = IntentFilter(Intent.ACTION_MAIN).apply {</span>
<span style="font-weight: 400;">                addCategory(Intent.CATEGORY_HOME)</span>
<span style="font-weight: 400;">                addCategory(Intent.CATEGORY_DEFAULT)</span>
<span style="font-weight: 400;">            }</span>
<span style="font-weight: 400;">            mDevicePolicyManager.addPersistentPreferredActivity(</span>
<span style="font-weight: 400;">                    mAdminComponentName, intentFilter, ComponentName(packageName, MainActivity::class.java.name))</span>
<span style="font-weight: 400;">        } else {</span>
<span style="font-weight: 400;">            mDevicePolicyManager.clearPackagePersistentPreferredActivities(</span>
<span style="font-weight: 400;">                    mAdminComponentName, packageName)</span>
<span style="font-weight: 400;">        }</span>
<span style="font-weight: 400;">    }</span></pre>
<p><span style="font-weight: 400;">W celu uruchomienia aplikacji w trybie pełnoekranowym należy dodać odpowiednie flagi:</span></p>
<pre><span style="font-weight: 400;">private fun setImmersiveMode(enable: Boolean) {</span>
<span style="font-weight: 400;">        if (enable) {</span>
<span style="font-weight: 400;">            val flags = (View.SYSTEM_UI_FLAG_LAYOUT_STABLE</span>
<span style="font-weight: 400;">                    or View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION</span>
<span style="font-weight: 400;">                    or View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN</span>
<span style="font-weight: 400;">                    or View.SYSTEM_UI_FLAG_HIDE_NAVIGATION</span>
<span style="font-weight: 400;">                    or View.SYSTEM_UI_FLAG_FULLSCREEN</span>
<span style="font-weight: 400;">                    or View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY</span>
<span style="font-weight: 400;">                    )</span>
<span style="font-weight: 400;">            window.decorView.systemUiVisibility = flags</span>
<span style="font-weight: 400;">            window.decorView.setOnSystemUiVisibilityChangeListener {</span>
<span style="font-weight: 400;">                window.decorView.systemUiVisibility = flags;</span>
<span style="font-weight: 400;">            }</span>
<span style="font-weight: 400;">        } else {</span>
<span style="font-weight: 400;">            val flags = (View.SYSTEM_UI_FLAG_LAYOUT_STABLE</span>
<span style="font-weight: 400;">                    or View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION</span>
<span style="font-weight: 400;">                    or View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN)</span>
<span style="font-weight: 400;">            window.decorView.systemUiVisibility = flags</span>
<span style="font-weight: 400;">        }</span>
<span style="font-weight: 400;">    }</span></pre>
<p><span style="font-weight: 400;">Na koniec używamy metod startLockTask() i stopLockTask(), aby włączyć/wyłączyć tryb blokady zadań:</span></p>
<pre><span style="font-weight: 400;">private fun setLockTask(start: Boolean, isAdmin: Boolean) {</span>
<span style="font-weight: 400;">        if (isAdmin) {</span>
<span style="font-weight: 400;">            mDevicePolicyManager.setLockTaskPackages(</span>
<span style="font-weight: 400;">                    mAdminComponentName, if (start) arrayOf(packageName) else arrayOf())</span>
<span style="font-weight: 400;">        }</span>
<span style="font-weight: 400;">        if (start) {</span>
<span style="font-weight: 400;">            startLockTask()</span>
<span style="font-weight: 400;">        } else {</span>
<span style="font-weight: 400;">            stopLockTask()</span>
<span style="font-weight: 400;">        }</span>
<span style="font-weight: 400;">    }</span></pre>
<p><span style="font-weight: 400;"><img loading="lazy" decoding="async" class="aligncenter wp-image-2770 size-thumbnail" src="https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10-80x80.png" alt="Separating icon" width="80" height="80" srcset="https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10-80x80.png 80w, https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10-50x50.png 50w, https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10.png 208w" sizes="(max-width: 80px) 100vw, 80px" /></span></p>
<h2><span style="color: #800080;"><b>Wynik</b></span></h2>
<p><span style="font-weight: 400;"><img loading="lazy" decoding="async" class="alignleft wp-image-2873 size-thumbnail" src="https://inero-software.com/wp-content/uploads/2019/10/inero-glify-08-80x80.png" alt="Paragraph icon" width="80" height="80" srcset="https://inero-software.com/wp-content/uploads/2019/10/inero-glify-08-80x80.png 80w, https://inero-software.com/wp-content/uploads/2019/10/inero-glify-08-50x50.png 50w, https://inero-software.com/wp-content/uploads/2019/10/inero-glify-08.png 208w" sizes="(max-width: 80px) 100vw, 80px" />Powyższe operacje pozwalają zmienić urządzenie z systemem Android w urządzenie dedykowane, działające w trybie pełnoekranowym i uniemożliwiające użytkownikowi korzystanie z innych funkcjonalności. Na potrzeby egzemplifikacji naszej sprawy wykorzystaliśmy opracowaną w naszej firmie aplikację mobilną do <a href="https://inero-software.com/pl/zarzadzanie-lancuchem-dostaw/">zarządzania łańcuchem dostaw</a>. Aplikacja ta jest częścią platformy <a href="https://deliverm8.com/">DeliverM8</a>, którą opracowaliśmy w celu optymalizacji i planowania zadań związanych z zarządzaniem łańcuchem dostaw dla <a href="https://inero-software.com/pl/deliverm8-dostawa-ostatniej-mili/">Dostawy Ostatniej Mili</a>. Wracając do tematu, efekt końcowy wygląda następująco:</span></p>
<p><img loading="lazy" decoding="async" class="aligncenter wp-image-3356 size-full" src="https://inero-software.com/wp-content/uploads/2021/03/deliverM8-kiosk.png" alt="Android Kiosk mode visualisation" width="441" height="864" srcset="https://inero-software.com/wp-content/uploads/2021/03/deliverM8-kiosk.png 441w, https://inero-software.com/wp-content/uploads/2021/03/deliverM8-kiosk-153x300.png 153w" sizes="(max-width: 441px) 100vw, 441px" /></p>
<p><span style="font-weight: 400;"><img loading="lazy" decoding="async" class="aligncenter wp-image-2770 size-thumbnail" src="https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10-80x80.png" alt="Separating icon" width="80" height="80" srcset="https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10-80x80.png 80w, https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10-50x50.png 50w, https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10.png 208w" sizes="(max-width: 80px) 100vw, 80px" /></span></p>
<h2><span style="color: #800080;"><b>Podsumowanie</b></span></h2>
<p><span style="font-weight: 400;"><img loading="lazy" decoding="async" class="alignleft wp-image-2873 size-thumbnail" src="https://inero-software.com/wp-content/uploads/2019/10/inero-glify-08-80x80.png" alt="Paragraph icon" width="80" height="80" srcset="https://inero-software.com/wp-content/uploads/2019/10/inero-glify-08-80x80.png 80w, https://inero-software.com/wp-content/uploads/2019/10/inero-glify-08-50x50.png 50w, https://inero-software.com/wp-content/uploads/2019/10/inero-glify-08.png 208w" sizes="(max-width: 80px) 100vw, 80px" /></span></p>
<p><span style="font-weight: 400;">W tym wpisie pokazaliśmy jak szybko skonfigurować aplikację mobilną, aby uzyskać jednocelowe urządzenie, które w jak największym stopniu spełnia nasze potrzeby. Korzystanie z Kiosk Mode niesie za sobą wiele korzyści, takich jak zwiększenie bezpieczeństwa czy ograniczenie dostępu do niepożądanych funkcjonalności, stworzenie rozwiązania dostosowanego zarówno do potrzeb pracowników (zarządzanie zasobami, zarządzanie <a href="https://inero-software.com/pl/rozwiazania-logistyczne/">transportem i logistyką</a>) jak i klientów.<br />
</span></p>
<p>&nbsp;</p>
<p><a href="https://inero-software.com/pl/"><span style="color: #800080;"><strong>Inero Software</strong></span></a> oferuje wiedzę i doświadczenie w zakresie skutecznego wykorzystywania najnowocześniejszych technologii i danych do kształtowania korporacyjnych produktów cyfrowych przyszłości.</p>
<p>W sekcji <a href="https://inero-software.com/pl/category/firma/"><span style="color: #800080;"><strong>BLOG</strong></span></a> można znaleźć inne artykuły dotyczące nowoczesnych rozwiązań dla przedsiębiorstw.</p>
<p>&nbsp;</p>
<p></p></div><div class="col-sm-1"></div></div>
<p>Artykuł <a href="https://inero-software.com/pl/android-kiosk-mode/">Adroid Kiosk Mode &#8211; jak zmienić urządzenie z Androidem w urządzenie do dedykowanego użytku</a> pochodzi z serwisu <a href="https://inero-software.com/pl">Inero Software - Rozwiązania IT i Konsulting</a>.</p>
]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">4354</post-id>	</item>
	</channel>
</rss>
