2011-02-02 15 views
7

Napotkałem dziwny problem. Z działalności onStart() Proszę o aktywację Bluetooth i 120S wykrywalność poprzez intencji:Aktywacja Bluetooth Mnożenie okna dialogowego powiadomień po obróceniu ekranu

Intent activateBTIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE); 
startActivityForResult(activateBTIntent, BT_ACTIVATE_INTENT);         

używam go bez względu, czy Bluetooth jest już aktywna, czy nie. Dokumentacja systemu Android mówi, że Bluetooth zostanie aktywowany, jeśli nie był, i to działa dobrze. W obu przypadkach pojawia dialogowe systemu ostrzegania

enter image description here

Kiedy obracać ekran Obserwuję migotanie. Naciśnij przycisk Tak/Nie usuwa jedno okno dialogowe, ale poniżej jest jeszcze inny. Wykonywanie obrotu ekranu Mogę uzyskać stos okien dialogowych z ostrzeżeniami i nacisnąć przycisk Tak/Nie na każdym z nich, aby się ich pozbyć.

Opisany problem występuje tylko wtedy, gdy Bluetooth nie został jeszcze uruchomiony po wysłaniu zamiaru, w przeciwnym razie działa poprawnie. Próbowałem na różnych telefonach 2.2, a problem dotyczy wszystkich. Wygląda mi na problem z systemem Android.

Czy ktoś go również napotkał i może ma przydatne wskazówki, jak tego uniknąć?

Dzięki i pozdrawiam.

Odpowiedz

2

To błąd w aplikacji Ustawienia, która to powoduje. Funkcja RequestPermissionActivity powtarza instancję obiektu RequestPermissionHelperActivity na obrót.

+0

Wielkie dzięki. Szukałem tego od bardzo dawna. Twoje zdrowie. – Zelimir

0

(Twój post nie prawie wystarczająco dużo informacji, więc jestem zakładając tutaj ...)

nie jestem zbyt pewny o startActivityForResult.

Nie powinieneś używać metody showDialog() w onCreate(), jeśli używasz zarządzanego AlertDialog. Jeśli zrobi to Bluetooth, możesz spróbować uruchomić powyższy kod z onCreate()?

+0

Zaktualizowałem mój post, aby być bardziej precyzyjnym. Dzięki za sugestię. Zamiar został wysłany z metody onStart(), więc nie było to przyczyną. – Zelimir

1

Miałem do czynienia z tym samym problemem. Po spędzeniu z nim dużo czasu, znalazłem jedno rozwiązanie.

Można uniknąć powielania „aktywacyjnym Bluetooth oknie Alert” za pomocą FLAG_ACTIVITY_NO_HISTORY flagę activateBTIntent. Ale ustawienie tej flagi spowoduje, że startActivityForResult stanie się bezużyteczny.

Kod -

Intent activateBTIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE); 
activateBTIntent.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY); 
startActivity(activateBTIntent); 

Korzystanie FLAG_ACTIVITY_NO_HISTORY z activateBTIntent usunie 'dialogowe Aktywacja Bluetooth Alert' aktywność z historii stosie. Zatem w tym przypadku, gdy orientacja jest zmieniony, „aktywacja Bluetooth dialogowe Alert” działalność zostanie zakończona i Newel utworzony (NIE powielony):

Reference http://developer.android.com/reference/android/content/Intent.html#FLAG_ACTIVITY_NO_HISTORY

+1

Problem polega na tym, że zazwyczaj trzeba użyć metody startActivityForResult(). W ten sposób zostaniesz poinformowany, jeśli użytkownik naciśnie Tak lub Nie w wyświetlonym powiadomieniu o aktywacji Bluetooth systemu. Co robisz, jeśli użytkownik wybierze opcję Nie? Jedna rzecz, którą możesz spróbować. Ogranicz swoją aktywność, która rozpoczyna zamiar Bluetooth tylko na portret (w twoim Manifeście). Być może unikniesz problemu. Jeśli chcesz obsłużyć obie orientacje i przedstawić inny układ w pionie/poziomie, moja sugestia nie przyda się. – Zelimir

+0

@Zelimir Masz rację, ale działa. Gdy użytkownik kliknie Tak, Bluetooth jest aktywny i gdy użytkownik kliknie Nie bluetooth pozostanie wyłączony. Problem pojawia się tylko wtedy, gdy używasz funkcji onActivityResult do wykonywania niektórych operacji. – Vivek

+0

Tak, to była dokładnie kwestia, z którą się spotkałem. Moje dalsze działania były zależne od użytkownika Tak/Nie selekcji. Ale jeśli to nie jest dla ciebie ważne, zgadzam się, że masz rozwiązanie. – Zelimir

0

Problem został zgłoszony (goggle issue tracker), ale jest już otwarty po 6 latach (sprawdzony pod Androidem 7.1.2).

Niestety, flaga FLAG_ACTIVITY_NO_HISTORY nie działa.Jedynym szybkie obejście znalazłem aż Android zespół naprawić (jeśli w ogóle będą one) jest, aby zablokować zmianę orientacji ekranu aktywności, po prostu po raz Zostanie wyświetlone okno dialogowe:

activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LOCKED); 

być nazywany po prostu przed

Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE); 
startActivityForResult(enableBtIntent, REQUEST_ENABLE_BT); 

a następnie użyć

public void onActivityResult(int requestCode, int resultCode, Intent data) { 
    if (requestCode == REQUEST_ENABLE_BT) { 
    activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED); 
    } 
    super.onActivityResult(requestCode, resultCode, data); 
} 

na skutek intencji. To jest tymczasowy środek zaradczy, ale zwykle lepszy niż pokazanie tego możliwego problemu podczas aktywacji BT.

Powiązane problemy