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

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

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

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

26.09.2014, 02:43. Просмотров 458. Ответов 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
Программа с помощью tts переодически произносит время , но если поставить телефон на блокировку то tts перестает работать и наступает...

Не срабатывает AlarmManager после выключения экрана - Программирование Android
Доброго дня! Прошу помощи. Приложение выполняет отложенные задачи через AlarmManager. Все отлично работает, но пока приложение запущено...

Сохранить рабочим поток после выключения экрана - Программирование Android
Работает поток на получение и отправку информации на сервер, по окончании девайс держит связь с сервером для получения новых данных...

Отключение блокировки экрана - Программирование Android
Подскажите пожалуйста как программно снять блокировку экрана

Отключение блокировки экрана - Программирование Android
Добрый день. Пишу приложение, с которым пользователь должен взаимодействовать только путём наклона телефона туда-сюда, без касания экрана....

Регистрация аккаунта разработчика после блокировки - Программирование Android
В общем мне полгода назад прилетел бан. Доступа к панели разработчика нет. Подумываю на другого человека зарегать новый аккаунт. И тут...

Android Service, работающий даже после выключения пользователем приложения - Программирование Android
Столкнулся со следующей проблемой: нужно чтобы Service работал даже после выключения пользователем приложения. имеется public class...

Поведение после смены ориентации экрана - Программирование Android
Доброго времени суток. У меня есть 2 xml layout файла для вертикальной и горизонтальной ориентации дисплея c тем самим набором елементов....

Запрет поворота экрана после создания активити - Программирование Android
Как сделать сабж? Если в onCreate вызываю : setRequestedOrientation( ActivityInfo.SCREEN_ORIENTATION_NOSENSOR); И если...

После поворота экрана view формы пропадают - Программирование Android
на главной активити в xml создано RadioGroup. на главной активити в методе onCreate есть такая строчка rGroup = (RadioGroup)...


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

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

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