Освой Android играючи

Сайт Александра Климова

Шкодим

/* Моя кошка замечательно разбирается в программировании. Стоит мне объяснить проблему ей - и все становится ясно. */
John Robbins, Debugging Applications, Microsoft Press, 2000

Управляем автономным режимом (Airplane Mode)

Данный код работает до Android 4.1 включительно. Начиная с Android 4.2 Google изменил политику и не разрешает программно управлять этим режимом.

Если по каким-то причинам вам нужно программно управлять автономным режимом (Airplane Mode) из своего приложения, не заставляя пользователя лезть в настройки телефона, то эта статья для вас.

Так как мы собираемся менять системные настройки, то сначала необходимо установить необходимые разрешения в манифесте:


<uses-permission android:name="android.permission.WRITE_SETTINGS"></uses-permission>

Добавим на форму текстовую метку и ToggleButton. Осталось написать код:


package ru.alexanderklimov.airplanemode;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.provider.Settings;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.TextView;
import android.widget.ToggleButton;

public class AirPlaneModeActivity extends Activity {

	static final String STATUS_ON = "Airplane Mode: Включён";
	static final String STATUS_OFF = "Airplane Mode: Выключить";

	static final String TURN_ON = "Включить";
	static final String TURN_OFF = "Выключить";

	TextView tvStatus;
	ToggleButton toggleState;

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		
		setContentView(R.layout.main);

		tvStatus = findViewById(R.id.tvStatus);
		toggleState = findViewById(R.id.toggleButton1);
		
		// устанавливаем текст при первой загрузке приложения
		updateUI(isAirplaneMode());

		// код для нажатия кнопки
		toggleState.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				// проверяем текущее состояние
				boolean state = isAirplaneMode();
				// переключаемся на другое состояние
				toggleAirplaneMode(state);
				// обновляем информацию о новом состоянии на экране
				updateUI(!state);
			}
		});
	}

	public void toggleAirplaneMode(boolean state) {
		// переключаем автономный режим
		Settings.System.putInt(this.getContentResolver(),
				Settings.System.AIRPLANE_MODE_ON, state ? 0 : 1);

		// сообщаем системе об изменении
		Intent intent = new Intent(Intent.ACTION_AIRPLANE_MODE_CHANGED);
		intent.putExtra("state", !state);
		sendBroadcast(intent);
	}

	public void updateUI(boolean state) {
		if (state) {
			tvStatus.setText(STATUS_ON);
			toggleState.setText(TURN_OFF);
		} else {
			tvStatus.setText(STATUS_OFF);
			toggleState.setText(TURN_ON);
		}
	}

	public boolean isAirplaneMode() {
		return Settings.System.getInt(this.getContentResolver(),
				Settings.System.AIRPLANE_MODE_ON, 0) == 1;
	}
}

Обратите внимание, что при изменении автономного режима, мы посылаем соответствующее сообщение системе. Получив такое сообщение, Android выведет/спрячет значок самолёта в строке состояния.

Airplane Mode

Открываем окно настроек для автономного режима

Так как, начиная с Android 4.2, мы не можем программно включить режим автономного режима, то остаётся только один вариант - показать окно настроек, чтобы пользователь сам отметил флажком требуемую настройку:


// Kotlin
startActivity(
    Intent(android.provider.Settings.ACTION_AIRPLANE_MODE_SETTINGS))

// Java startActivity( new Intent(android.provider.Settings.ACTION_AIRPLANE_MODE_SETTINGS));

Причина, по которой нужно пользоваться автономным режимом в самолёте.

Отслеживаем изменение автономного режима (Kotlin)

В примере выше мы отсылали сообщение системе об изменении автономного режима. Так как мы теперь не можем менять режим программно, то можем отслеживать это изменение при помощи приёма широковещательного приёмника.


package ru.alexanderklimov.as41k

import android.content.BroadcastReceiver
import android.content.Context
import android.content.Intent
import android.content.IntentFilter
import android.os.Bundle
import android.widget.TextView
import androidx.appcompat.app.AppCompatActivity


class MainActivity : AppCompatActivity() {

    lateinit var textView: TextView
    private val receiver by lazy { getAirplaneModeBroadcastReceiver() }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        setContentView(R.layout.activity_main)

        textView = findViewById(R.id.textView)
    }

    override fun onResume() {
        super.onResume()

        registerReceiver(receiver, IntentFilter(Intent.ACTION_AIRPLANE_MODE_CHANGED))
    }

    override fun onStop() {
        super.onStop()

        unregisterReceiver(receiver)
    }

    private fun getAirplaneModeBroadcastReceiver(): BroadcastReceiver {
        return object : BroadcastReceiver() {
            override fun onReceive(context: Context, intent: Intent?) {
                if (intent?.action == Intent.ACTION_AIRPLANE_MODE_CHANGED) {
                    val isAirplaneModeEnabled = intent.getBooleanExtra("state", false)
                    textView.text = isAirplaneModeEnabled.toString()
                }
            }
        }
    }
}

Пример будет работать, пока оно видимо. Поэтому менять режим следует через шторку. Там как правило есть значок автономного режима. Так как шторка не закрывает полностью приложение и оно не уходит на задний план, то мы можем получить сообщение от системы о смене режима.

Реклама