Форум программистов, компьютерный форум CyberForum.ru

Программирование Android

Войти
Регистрация
Восстановить пароль
 
St@nton
3 / 3 / 0
Регистрация: 04.01.2013
Сообщений: 72
#1

BluetoothAdapter - теряется объект после блокировки/выключения экрана - Android

26.09.2014, 02:43. Просмотров 451. Ответов 0
Метки нет (Все метки)

Всем привет. Ситуация следующая. Написал тестовое приложение, которое соединяется c блутус модулем (с таким, если это важно) и отсылает на него сообщения по нажатию кнопки.
Всё нормально коннектится и сигнал тоже нормально отправляется, но до тех пор, пока не погаснет экран смартфона (или если вручную его заблокировать).
Когда я снова включаю экран, то все органы управления, не задействующие блутус, работают. А при попытке снова отправить сообщение, приложение падает с NullPointerException и нулём оказывается объект BluetoothAdapter, который я получаю ещё при первом соединении с блутус модулем. (В коде я отметил это место, класс DeviceInterface метод setLedBrightness())

Когда экран выключается, то в лог выводятся следующие строки:
Кликните здесь для просмотра всего текста

09-26 00:09:24.526: I/PersonaManager(17056): getPersonaService() name persona_policy
09-26 00:09:24.596: D/ProgressBar(17056): setProgressDrawable drawableHeight = 18
09-26 00:09:24.596: D/AbsSeekBar(17056): AbsSeekBar Constructor: misSeebarAnimationAvailable = false
09-26 00:09:24.596: D/ProgressBar(17056): setProgressDrawable drawableHeight = 18
09-26 00:09:24.596: D/AbsSeekBar(17056): AbsSeekBar Constructor: misSeebarAnimationAvailable = false
09-26 00:09:24.616: W/IInputConnectionWrapper(17056): showStatusIcon on inactive InputConnection
09-26 00:09:24.656: D/ProgressBar(17056): updateDrawableBounds: left = 0
09-26 00:09:24.656: D/ProgressBar(17056): updateDrawableBounds: top = 0
09-26 00:09:24.656: D/ProgressBar(17056): updateDrawableBounds: right = 476
09-26 00:09:24.656: D/ProgressBar(17056): updateDrawableBounds: bottom = 48
09-26 00:09:24.656: D/ProgressBar(17056): updateDrawableBounds: mProgressDrawable.setBounds()
09-26 00:09:24.656: D/ProgressBar(17056): updateDrawableBounds: left = 0
09-26 00:09:24.656: D/ProgressBar(17056): updateDrawableBounds: top = 0
09-26 00:09:24.656: D/ProgressBar(17056): updateDrawableBounds: right = 476
09-26 00:09:24.656: D/ProgressBar(17056): updateDrawableBounds: bottom = 48
09-26 00:09:24.656: D/ProgressBar(17056): updateDrawableBounds: mProgressDrawable.setBounds()
09-26 00:09:24.986: E/ViewRootImpl(17056): sendUserActionEvent() mView == null

И в итоге заметил также, что если в манифесте убрать горизонтальную ориентацию приложения android:screenOrientation="landscape", то ничего не слетает, и всё нормально работает.

Подскажите, пожалуйста, где копать.

DeviceInterface
Кликните здесь для просмотра всего текста

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
public class DeviceInterface implements Observer {
    private Controller controller;
    private BluetoothSocket clientSocket;
    private BluetoothAdapter bluetoothAdapter;
    
    public DeviceInterface(Controller controller) {
        this.controller = controller;
    }   
    
    @Override
    public void update(Observable observable, Object data) {
        
        State obj = null;
        if(observable instanceof State) {
            obj = (State) observable;
            
            switch(obj.getField()) {
            case "connectionRequest" :  connectToDevice();
            break;
            case "turn" :           controller.infoReceived.setText(Integer.toString(obj.getTurn()-20));
            break;
            case "acceleration" :       controller.infoReceived.setText(Integer.toString(obj.getTurn()-10));
            break;
            case "ledBrightness" :      setLedBrightness(obj.getBrightness());
            break;
            }
        }       
    }
    
    private void connectToDevice() {
        bluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
        bluetoothAdapter.enable();
        while(!bluetoothAdapter.isEnabled()) {
            try {
                TimeUnit.MILLISECONDS.sleep(500);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        BluetoothDevice device = bluetoothAdapter.getRemoteDevice("10:14:06:27:03:41");
 
        if(device != null) {
            try{
                //Инициируем соединение с устройством
                Method m = device.getClass().getMethod(
                        "createRfcommSocket", new Class[] {int.class});
     
                clientSocket = (BluetoothSocket) m.invoke(device, 1);
                clientSocket.connect();
 
            } catch (IOException e) {
                Log.d("BLUETOOTH", e.getMessage());
            } catch (SecurityException e) {
                Log.d("BLUETOOTH", e.getMessage());
            } catch (NoSuchMethodException e) {
                Log.d("BLUETOOTH", e.getMessage());
            } catch (IllegalArgumentException e) {
                Log.d("BLUETOOTH", e.getMessage());
            } catch (IllegalAccessException e) {
                Log.d("BLUETOOTH", e.getMessage());
            } catch (InvocationTargetException e) {
                Log.d("BLUETOOTH", e.getMessage());
            }
     
            //Выводим сообщение об успешном подключении
            controller.infoState.setText("CONNECTED to" + device.getName() + " " + device.getAddress());
            Log.d("CONNECTED to", device.getName() + " " + device.getAddress());
        } else {
            controller.infoState.setText("Device not found");
            Log.d("Device not found", "Device not found");          
        }
    }
    
    private void setLedBrightness(int ledBrightness) {
 
           if(bluetoothAdapter.isDiscovering()) bluetoothAdapter.cancelDiscovery(); // ТУТ ПАДАЕТ С NullPointerException 
           try {
               //Получаем выходной поток для передачи данных
 
               OutputStream outStream = clientSocket.getOutputStream();
 
               int value = ledBrightness;
 
               //Пишем данные в выходной поток
 
              outStream.write(value);
 
           } 
           catch (IOException e) { 
              Log.d("BLUETOOTH", e.getMessage());
        }
    
    }
}


State
Кликните здесь для просмотра всего текста

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
public class State extends Observable {
    private HashMap<String, String> changed;
    private boolean connectionRequest = false;
    private int turn = 0;
    private int acceleration = 0;
    private int ledBrightness = 0;
    
    public State() {
        changed = new HashMap<String, String>();
        changed.put("name", "bluetoothServer");
    }
    
    public void notifyObservers() {
        setChanged();
        super.notifyObservers(changed);
    }
    
    public String getName() {
        return changed.get("name");
    }
    
    public String getField() {
        return changed.get("field");
    }
    
    public void connectToDevice() {
        connectionRequest = true;
        changed.put("field", "connectionRequest");
        notifyObservers();
    }
    
    public boolean getConnectDevice() {
        return connectionRequest;
    }
 
    public void setTurn(int arg) {
        turn = arg;
        changed.put("field", "turn");
        notifyObservers();
    }
    
    public int getTurn() {
        return turn;
    }
    
    public void setAcceleration(int arg) {
        acceleration = arg;
        changed.put("field", "acceleration");
        notifyObservers();
    }
    
    public int getAcceleration() {
        return acceleration;
    }   
 
    public void setBrightness(int arg) {
        ledBrightness = arg;
        changed.put("field", "ledBrightness");
        notifyObservers();
    }
    
    public int getBrightness() {
        return ledBrightness;
    }
}


Controller
Кликните здесь для просмотра всего текста

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
public class Controller extends Activity implements OnClickListener {
 
    TextView infoState;
    TextView infoSent;
    TextView infoReceived;
    
    private SeekBar seekBarTurn, seekBarAccel;
    private int ledBrightness = 0; //HIGH == 1; LOW == 0;
 
    private State state;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_controller);
        
        infoState = (TextView) findViewById(R.id.ctrlInfoState);
        infoSent = (TextView) findViewById(R.id.ctrlInfoSent);
        infoReceived = (TextView) findViewById(R.id.ctrlInfoReceived);
 
        findViewById(R.id.btnConnectDevice).setOnClickListener(this);
        findViewById(R.id.btnLedBrightness).setOnClickListener(this);
        
        seekBarTurn = (SeekBar) findViewById(R.id.seekBarTurn);
        seekBarTurn.setOnSeekBarChangeListener(new SeekBarTurn());
 
        state = new State();
        state.addObserver(new DeviceInterface(this));
    }
 
    @Override
    public void onClick(View v) {
        switch (v.getId()) {
        case (R.id.btnConnectDevice):
            state.connectToDevice();
            break;
        case (R.id.btnLedBrightness):
            ledBrightness = ledBrightness == 0 ? 1 : 0;
            state.setBrightness(ledBrightness);
            break;
        }
    }
 
    private class SeekBarTurn implements OnSeekBarChangeListener {
        @Override
        public void onProgressChanged(SeekBar seekBar, int progresValue, boolean fromUser) {
            infoSent.setText(""+progresValue);
            state.setTurn(progresValue);
          }
 
        @Override
        public void onStartTrackingTouch(SeekBar seekBar) {
            infoState.setText(""+seekBar.getProgress());
        }
 
        @Override
        public void onStopTrackingTouch(SeekBar seekBar) {
            infoReceived.setText("Covered: " + seekBar.getProgress() + "/" + seekBar.getMax());
        }           
    }
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.09.2014, 02:43     BluetoothAdapter - теряется объект после блокировки/выключения экрана
Посмотрите здесь:

Android При включении GPS теряется местонахождение
Android Запрет поворота экрана после создания активити
Android Отключение блокировки экрана
Android GoogleMap. Восстановление карты после смены ориентации экрана
Отключение блокировки экрана Android
После поворота экрана view формы пропадают Android
Android Поведение после смены ориентации экрана
Отключение блокировки WAKE_LOCK Android
Android Service, работающий даже после выключения пользователем приложения Android
Android Регистрация аккаунта разработчика после блокировки
Android Работа программы после блокировки экрана
Android Сохранить рабочим поток после выключения экрана

Искать еще темы с ответами

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

Текущее время: 11:55. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru