Проверьте состояние Bluetooth в фоновом режиме с помощью Java в Android Studio - PullRequest
0 голосов
/ 28 марта 2020

Я разрабатываю простое приложение android для изменения состояния Bluetooth моего устройства. Сначала я объясняю текущее приложение, а после этого я описываю то, что я хочу сделать. Здесь я оставляю вам мой код, разделенный на три файла:

  • AndroidManifest. xml (файл манифеста)

    <?xml version="1.0" encoding="utf-8"?>
        <manifest xmlns:android="http://schemas.android.com/apk/res/android"
            package="com.example.bluetoothapp">
            <application
                android:allowBackup="true"
                android:icon="@mipmap/ic_launcher"
                android:label="@string/app_name"
                android:roundIcon="@mipmap/ic_launcher_round"
                android:supportsRtl="true"
                android:theme="@style/AppTheme">
                <activity android:name=".MainActivity">
                    <intent-filter>
                        <action android:name="android.intent.action.MAIN" />
    
                        <category android:name="android.intent.category.LAUNCHER" />
                    </intent-filter>
                </activity>
            </application>
            <!-- We are now adding Bluetooth mandatory permissions -->
            <uses-permission android:name="android.permission.BLUETOOTH" />
            <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
            <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
        </manifest>
    
  • activity_main. xml (файл макета)

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:tools="http://schemas.android.com/tools"
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:orientation="vertical"
        android:gravity="center_horizontal"
        android:id="@+id/linearlayoutid"
        tools:context=".MainActivity">
        <ImageView
            android:id="@+id/bluetoothIv"
            android:layout_width="100dp"
            android:layout_height="100dp"
        />
        <!-- On Button -->
        <Button
            android:id="@+id/onOffBtn"
            android:minWidth="200dp"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Turn On/Off"
            style="@style/Base.Widget.AppCompat.Button.Colored"
        />
    </LinearLayout>
    
  • MainActivity. java (внутренний файл)

    package com.example.bluetoothapp;
    import androidx.annotation.Nullable;
    import androidx.appcompat.app.AppCompatActivity;
    import android.bluetooth.BluetoothAdapter;
    import android.bluetooth.BluetoothDevice;
    import android.content.Intent;
    import android.os.Bundle;
    import android.os.strictmode.WebViewMethodCalledOnWrongThreadViolation;
    import android.speech.tts.TextToSpeech;
    import android.view.View;
    import android.widget.Button;
    import android.widget.CheckBox;
    import android.widget.ImageView;
    import android.widget.LinearLayout;
    import android.widget.TextView;
    import android.widget.Toast;
    
    import java.util.Set;
    
    public class MainActivity extends AppCompatActivity {
    
        private static final int REQUEST_ENABLE_BT = 0;
        private static final int REQUEST_DISCOVER_BT = 1;
    
        LinearLayout ll;
        ImageView mBlueIv;
        Button mOnOffBtn;
    
        BluetoothAdapter mBlueAdapter;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
    
            mBlueIv = findViewById(R.id.bluetoothIv);
            mOnOffBtn = findViewById(R.id.onOffBtn);
            ll = findViewById(R.id.linearlayoutid);
            // adapter
            mBlueAdapter = BluetoothAdapter.getDefaultAdapter();
    
            // Set image according to blueetoth status
            if (mBlueAdapter.isEnabled()){
                mBlueIv.setImageResource(R.drawable.ic_action_on);
            }
            else{
                mBlueIv.setImageResource(R.drawable.ic_action_off);
            }
    
            //on button click:
            mOnOffBtn.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    if (!mBlueAdapter.isEnabled()){
                        showToast("Turning on Bluetooth...");
                        //intent to turn on bluetooth
                        Intent intent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
                        startActivityForResult(intent, REQUEST_ENABLE_BT);
                        mBlueIv.setImageResource(R.drawable.ic_action_on);
                    }
                    else{
                        mBlueAdapter.disable();
                        showToast("Turning Bluetooth off");
                        mBlueIv.setImageResource(R.drawable.ic_action_off);
                    }
                }
            });
        }
    
    
        //toast message function
        private void showToast(String msg){
            Toast.makeText(this, msg, Toast.LENGTH_SHORT).show();
        }
    }
    

В результате , мы получаем это приложение:

enter image description here enter image description here

Когда мы открываем приложение, у нас есть эти две возможности. Если Bluetooth включен, мы получаем зеленую картинку, а если она выключена, мы получаем красную картинку. В этих двух сценариях ios, если мы нажмем кнопку, изображение изменится (с зеленого -> красный и с красного -> зеленый), и блютуз также изменит свой статус (с вкл. -> выкл. И из выкл. -> вкл.) .

Моя главная проблема - я хочу обновить изображение (в зависимости от состояния Bluetooth) в фоновом режиме. Например: «представьте, что я открываю приложение с включенным блютузом, что приводит меня к зеленой картинке. Затем вместо нажатия кнопки, чтобы выключить блютус, я выхожу из приложения (не убивая его), и я Отключите Bluetooth от настроек устройства. После этого я возвращаюсь к приложению, и я хотел бы, чтобы приложение понимало, что Bluetooth теперь выключен, поэтому он автоматически меняет зеленое изображение на красное ". То, что в данный момент происходит, это то, что у нас все еще есть зеленая картинка, хотя Bluetooth теперь отключен.

Как я могу постоянно проверять состояние Bluetooth каждые n секунд в фоновом режиме?

Большое спасибо в продвинутом!

С уважением,

Серхио

...