Dzięki platformie Android urządzenia mogą mieć praca profile (czasami nazywane profilami zarządzanymi). Kontrolowany jest profil służbowy przez administratora IT, a dostępne dla niego funkcje są ustawiane niezależnie funkcje głównego profilu użytkownika. Takie podejście pozwala organizacjom kontrolować środowisko, w którym na urządzeniu użytkownika działają aplikacje i dane firmowe; a użytkownicy nadal mogą korzystać z osobistych aplikacji i profili.
Z tej lekcji dowiesz się, jak zmodyfikować swoją aplikację, aby działała prawidłowo na urządzeniu z profilem służbowym. Nie musisz nic robić oprócz sprawdzonych metod tworzenia aplikacji. Jednak niektóre z tych najlepszych są szczególnie ważne na urządzeniach z profilami służbowymi. Ten wskazuje problemy, o których należy pamiętać.
Omówienie
Użytkownicy często chcą korzystać z urządzeń osobistych w środowisku firmowym. Ten może stawić czoła dylematowi. Jeśli użytkownik może używać własnych na urządzeniu, organizacja obawia się, że informacje poufne (takie jak informacje o pracowniku e-maile i kontakty) znajdują się na urządzeniu, nad którym organizacja nie ma kontroli.
Aby rozwiązać ten problem, Android 5.0 (poziom interfejsu API 21) umożliwia organizacjom: skonfigurować profile służbowe. Jeśli urządzenie ma profil służbowy, są pod kontrolą administratora IT. Administrator IT może wybrać, które aplikacje są dozwolone dla danego profilu, kontrolować, które funkcje urządzenia mają być dostępne dla profilu.
Profil służbowy na urządzeniu ma wpływ na aplikacje. działające na urządzeniu niezależnie od tego, w którym profilu działa aplikacja:
- Domyślnie większość intencji nie przechodzi między profilami. Jeśli aplikacja uruchomiona w profilu uruchamia intencję, nie ma modułu obsługi intencji tego profilu i nie można ich łączyć z innym profilem. z powodu ograniczeń profilu żądanie nie uda się, a aplikacja może się wyłączyć nieoczekiwanie.
- Administrator profilu może ograniczyć dostępność aplikacji systemowych w profil służbowy. To ograniczenie może też spowodować brak modułu obsługi dla typowe intencje w profilu służbowym.
- Profil osobisty i profil służbowy mają osobne miejsce na dane, identyfikator URI pliku prawidłowy w jednym profilu jest nieprawidłowy w drugim. Dowolne intencja uruchomiona w jednym profilu może być obsługiwana w drugim (w zależności od profilu ), dlatego nie jest bezpieczne dołączanie identyfikatorów URI plików do intencji.
Zapobiegaj nieudanym intencjom
Na urządzeniu z profilem służbowym obowiązują ograniczenia mogą przełączać się między profilami. W większości przypadków wywoływanie intencji jest wyłączony, jest obsługiwany w tym samym profilu, na którym jest uruchamiany. Jeśli nie ma modułu obsługi dla intencji w tym profilu, intencja nie jest obsługiwana, uruchomiony, może się niespodziewanie wyłączyć – nawet jeśli istnieje moduł obsługi do intencji użytkownika.
Administrator profilu może wybrać intencje mogą się przełączać między profilami. Jako administrator IT nie ma możliwości, aby to zrobić. wiedzieć z wyprzedzeniem, które intencje mogą przekroczyć tę granicę. Administrator IT ustawia tę zasadę i w każdej chwili może ją zmienić.
Zanim aplikacja rozpocznie aktywność, sprawdź, czy nie ma
odpowiedniej rozdzielczości. Ty
może sprawdzić, czy istnieje akceptowalne rozwiązanie problemu, dzwoniąc pod numer Intent.resolveActivity()
. W przypadku braku
do rozwiązania intencji, metoda zwraca
null
Jeśli metoda zwraca wartość inną niż null, istnieje co najmniej jeden sposób
można zrealizować intencję, i można bez obaw uruchomić intencję. W tym przypadku parametr
intencja może być możliwa do rozwiązania albo
ponieważ w bieżącym profilu istnieje moduł obsługi lub intencja jest
może przejść do modułu obsługi w drugim profilu. (Więcej informacji o
w realizacji intencji, przeczytaj artykuł o Common Intents).
Jeśli na przykład aplikacja musi ustawić minutniki, musi to sprawdzić,
istnieje prawidłowy moduł obsługi intencji ACTION_SET_TIMER
. Jeśli nie można znaleźć aplikacji
powinien podjąć odpowiednie działanie (takie jak wyświetlenie błędu)
).
Kotlin
fun startTimer(message: String, seconds: Int) { // Build the "set timer" intent val timerIntent = Intent(AlarmClock.ACTION_SET_TIMER).apply { putExtra(AlarmClock.EXTRA_MESSAGE, message) putExtra(AlarmClock.EXTRA_LENGTH, seconds) putExtra(AlarmClock.EXTRA_SKIP_UI, true) } // Check if there's a handler for the intent if (timerIntent.resolveActivity(packageManager) == null) { // Can't resolve the intent! Fail this operation cleanly // (perhaps by showing an error message) } else { // Intent resolves, it's safe to fire it off startActivity(timerIntent) } }
Java
public void startTimer(String message, int seconds) { // Build the "set timer" intent Intent timerIntent = new Intent(AlarmClock.ACTION_SET_TIMER) .putExtra(AlarmClock.EXTRA_MESSAGE, message) .putExtra(AlarmClock.EXTRA_LENGTH, seconds) .putExtra(AlarmClock.EXTRA_SKIP_UI, true); // Check if there's a handler for the intent if (timerIntent.resolveActivity(getPackageManager()) == null) { // Can't resolve the intent! Fail this operation cleanly // (perhaps by showing an error message) } else { // Intent resolves, it's safe to fire it off startActivity(timerIntent); } }
Udostępniaj pliki w różnych profilach
Czasami aplikacja musi przyznać innym aplikacjom dostęp do własnych plików. Na przykład aplikacja galerii obrazów może udostępniać obrazy i redaktorami. Plik można udostępnić zwykle na 2 sposoby: za pomocą pliku URI lub identyfikator URI treści.
Identyfikator URI pliku zaczyna się od prefiksu file:
, po którym następuje znak
ścieżka bezwzględna do pliku w pamięci urządzenia Ponieważ jednak
profilu służbowego i osobistego profilu są przechowywane w oddzielnych obszarach, identyfikator URI pliku
, która jest ważna w jednym profilu, jest nieprawidłowa w drugim. Ta sytuacja
co oznacza, że jeśli
do intencji dołącza identyfikator URI pliku, a intencja jest obsługiwana w drugim profilu.
moduł obsługi nie ma dostępu do pliku.
Zamiast tego udostępniaj pliki identyfikatorom URI treści. Identyfikatory URI treści
i udostępniać je w bezpieczny sposób. Identyfikator URI treści zawiera
ścieżkę pliku, ale też nazwę urzędu, który ją dostarczył, oraz numer identyfikacyjny
jego rozpoznanie. Identyfikator treści dla każdego pliku możesz wygenerować za pomocą
FileProvider
Następnie możesz udostępnić te treści
identyfikator w innych aplikacjach (nawet w innym profilu). Odbiorca może użyć funkcji
Content ID, aby uzyskać dostęp do pliku.
Oto jak można na przykład uzyskać identyfikator URI treści konkretnego pliku Identyfikator URI:
Kotlin
// Open File object from its file URI val fileToShare = File(fileUriToShare) val contentUriToShare: Uri = FileProvider.getUriForFile( context, "com.example.myapp.fileprovider", fileToShare )
Java
// Open File object from its file URI File fileToShare = new File(fileUriToShare); Uri contentUriToShare = FileProvider.getUriForFile(getContext(), "com.example.myapp.fileprovider", fileToShare);
Gdy wywołujesz metodę getUriForFile()
,
należy podać upoważnienie dostawcy plików (w tym przykładzie
"com.example.myapp.fileprovider"
), która jest określona w
<provider>
.
manifestu aplikacji.
Więcej informacji o udostępnianiu plików za pomocą identyfikatorów URI treści znajdziesz tutaj:
Udostępnianie
Pliki.
Nasłuchuj powiadomień
Aplikacja zwykle udostępnia
Podklasa NotificationListenerService
na
aby otrzymywać z systemu wywołania zwrotne dotyczące zmian powiadomień. Urządzenia z
profile służbowe mogą wpływać na działanie aplikacji NotificationListenerService
z Twoją aplikacją.
W profilu służbowym
Nie można użyć uprawnienia NotificationListenerService
w aplikacji
uruchomione w profilu służbowym. Gdy aplikacja działa w profilu służbowym,
system ignoruje NotificationListenerService
Twojej aplikacji. Pamiętaj jednak:
aplikacje uruchomione w profilu osobistym mogą nasłuchiwać powiadomień.
W profilu osobistym
Gdy aplikacja działa w profilu osobistym, możesz nie otrzymywać powiadomień
dla aplikacji działających w profilu służbowym. Domyślnie wszystkie aplikacje profilu osobistego
otrzymuje wywołania zwrotne, ale administrator IT może dodać jeden lub więcej profili osobistych do listy dozwolonych
aplikacje, które pozwalają nasłuchiwać zmian powiadomień. Następnie system blokuje
aplikacji spoza listy dozwolonych. W Androidzie 8.0 (poziom interfejsu API 26) lub nowszym zasady dotyczące urządzeń
kontroler (DPC) zarządzający profilem służbowym może blokować słuchanie przez aplikację
na powiadomienia z profilu służbowego za pomocą DevicePolicyManager
metoda
setPermittedCrossProfileNotificationListeners()
Aplikacja nadal będzie otrzymywać wywołania zwrotne dotyczące powiadomień opublikowanych na profilu osobistym
profil.
Testowanie aplikacji pod kątem zgodności z profilami służbowymi
Aplikację należy przetestować w środowisku profilu służbowego, aby: wykrywaj problemy, które mogą powodować awarię aplikacji na urządzeniu profili służbowych. Testowanie na urządzeniu z profilem służbowym jest przydatne by mieć pewność, że aplikacja prawidłowo obsługuje intencje: nie uruchamia intencji, nie można obsługiwać, nie dołączają identyfikatorów URI, które nie działają z wieloma profilami, itd. włącz.
Udostępniliśmy przykładową aplikację TestDPC. który pozwala skonfigurować profil służbowy na urządzeniu z Androidem. Android 5.0 (poziom interfejsu API 21) lub nowszy. Dzięki tej aplikacji możesz w prosty sposób testować w środowisku profilu służbowego. Możesz jej też używać do: skonfiguruj profil służbowy w ten sposób:
- Określ, które aplikacje domyślne mają być dostępne na profil
- Skonfiguruj intencje, które mogą się przełączać między profilem drugi
Jeśli ręcznie zainstalujesz aplikację za pomocą kabla USB na urządzeniu z profilu służbowego, aplikacja jest zainstalowana zarówno na koncie osobistym, jak i służbowym profil. Po zainstalowaniu aplikacji możesz ją przetestować w następujące warunki:
- Jeśli intencja jest zwykle obsługiwana przez aplikację domyślną (na przykład aplikację aparatu), wyłącz ją w profilu służbowym, by sprawdzić, czy aplikacja prawidłowo je obsługuje.
- Jeśli uruchomisz intencję, która oczekuje, że będzie obsługiwana przez inną aplikację, wypróbuj
włączenie i wyłączenie uprawnień tej intencji do przejścia z jednego profilu
innego użytkownika. Sprawdź, czy aplikacja działa prawidłowo w obu sytuacjach. Jeśli
nie można łączyć się między profilami, sprawdź działanie aplikacji zarówno
gdy w profilu aplikacji dostępny jest odpowiedni moduł obsługi, a gdy go nie ma.
Jeśli na przykład aplikacja wywołuje intencję związaną z mapą, wypróbuj każde z tych rozwiązań
scenariusze:
- urządzenie umożliwia intencje przejścia między profilami. w drugim profilu znajduje się odpowiedni moduł obsługi (profil, na którym aplikacja działa)
- Urządzenie nie zezwala intencjom mapowania na przechodzenie między profilami, ale to odpowiedni moduł obsługi w profilu aplikacji
- Urządzenie nie zezwala intencjom mapowania na przechodzenie między profilami, nie jest odpowiednim modułem obsługi do intencji związanych z mapą w profilu urządzenia
- Jeśli dołączasz treść do intencji, sprawdź, czy intencja działa prawidłowo zarówno wtedy, gdy jest obsługiwana w profilu aplikacji, jak i gdy łączy się profili.
Testowanie na profilach służbowych: porady i wskazówki
Podczas testowania na stronie urządzenie z profilem służbowym.
- Jak wspomnieliśmy, po zainstalowaniu aplikacji z innego urządzenia na urządzeniu z profilem służbowym zainstalowanego w obu profilach. Jeśli chcesz, możesz usunąć aplikację z jednego profilu. a potem zostaw na drugim.
- Większość poleceń menedżera aktywności dostępnych w powłoce Android Debug Bridge (adb)
obsługują flagę
--user
, która pozwala wskazać użytkownika, który ma zostać uruchomiony . Określając użytkownika, możesz określić, czy aplikacja ma być uruchamiana jako niezarządzany użytkownik główny lub profilu służbowego. Więcej informacji znajdziesz tutaj: ADB poleceń powłoki. - Aby znaleźć aktywnych użytkowników na urządzeniu, użyj polecenia menedżera pakietów adb
list users
. Pierwsza liczba w ciągu wyjściowym to identyfikatora użytkownika, którego można używać z flagą--user
. Więcej więcej informacji można znaleźć w artykule ADB Shell (powłoka ADB). Polecenia.
Aby na przykład znaleźć użytkowników na urządzeniu, uruchom to polecenie:
$ adb shell pm list users UserInfo{0:Drew:13} running UserInfo{10:Work profile:30} running
W tym przypadku użytkownik główny („Drew”) ma identyfikator użytkownika 0, a parametr profil służbowy ma identyfikator użytkownika 10. Aby uruchomić aplikację w profilu służbowym, użyj takiego polecenia:
$ adb shell am start --user 10 \ -n "com.example.myapp/com.example.myapp.testactivity" \ -a android.intent.action.MAIN -c android.intent.category.LAUNCHER