안드로이드에서 비행기 모드를 감지하려면 어떻게 해야 하나요?
앱에 Wi-Fi가 활성화되어 있는지 여부를 감지하는 코드가 있습니다.이 코드는 Runtime을 트리거합니다.비행기 모드가 활성화된 경우 예외입니다.어쨌든 이 모드에서는 에러 메시지를 따로 표시하고 싶습니다.Android 장치가 비행기 모드인지 여부를 확실하게 감지하려면 어떻게 해야 합니까?
/**
* Gets the state of Airplane Mode.
*
* @param context
* @return true if enabled.
*/
private static boolean isAirplaneModeOn(Context context) {
return Settings.System.getInt(context.getContentResolver(),
Settings.Global.AIRPLANE_MODE_ON, 0) != 0;
}
SDK 버전 체크를 포함하도록 Alex의 답변을 확장하면 다음과 같은 이점을 얻을 수 있습니다.
/**
* Gets the state of Airplane Mode.
*
* @param context
* @return true if enabled.
*/
@SuppressWarnings("deprecation")
@TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR1)
public static boolean isAirplaneModeOn(Context context) {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN_MR1) {
return Settings.System.getInt(context.getContentResolver(),
Settings.System.AIRPLANE_MODE_ON, 0) != 0;
} else {
return Settings.Global.getInt(context.getContentResolver(),
Settings.Global.AIRPLANE_MODE_ON, 0) != 0;
}
}
또한 비행기 모드가 활성화되었는지 여부를 폴링하지 않으려면 SERVICE_STATE Intent에 BroadcastReceiver를 등록하고 이에 반응할 수 있습니다.
ApplicationManifest(Android 8.0 이전):
<receiver android:enabled="true" android:name=".ConnectivityReceiver">
<intent-filter>
<action android:name="android.intent.action.AIRPLANE_MODE"/>
</intent-filter>
</receiver>
또는 프로그래밍 방식으로(모든 Android 버전):
IntentFilter intentFilter = new IntentFilter("android.intent.action.AIRPLANE_MODE");
BroadcastReceiver receiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
Log.d("AirplaneMode", "Service state changed");
}
};
context.registerReceiver(receiver, intentFilter);
또한 다른 솔루션에서 설명한 것처럼 수신기가 알림을 받았을 때 비행기 모드를 폴링하여 예외를 발생시킬 수 있습니다.
비행기 모드를 등록할 때BroadcastReceiver
(@saxos answer) 비행기 모드 설정 상태를 바로 알 수 있습니다.Intent Extras
전화를 하지 않기 위해Settings.Global
또는Settings.System
:
@Override
public void onReceive(Context context, Intent intent) {
boolean isAirplaneModeOn = intent.getBooleanExtra("state", false);
if(isAirplaneModeOn){
// handle Airplane Mode on
} else {
// handle Airplane Mode off
}
}
여기서부터:
public static boolean isAirplaneModeOn(Context context){
return Settings.System.getInt(
context.getContentResolver(),
Settings.System.AIRPLANE_MODE_ON,
0) != 0;
}
감가상각 불만을 없애기 위해서는 (API17+를 타겟으로 하고 하위 호환성에 대해 크게 신경쓰지 않을 때)와 비교해야 한다.Settings.Global.AIRPLANE_MODE_ON
:
/**
* @param Context context
* @return boolean
**/
private static boolean isAirplaneModeOn(Context context) {
return Settings.System.getInt(context.getContentResolver(), Settings.System.AIRPLANE_MODE_ON, 0) != 0);
}
보다 낮은 API를 고려하는 경우:
/**
* @param Context context
* @return boolean
**/
@TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR1)
@SuppressWarnings({ "deprecation" })
private static boolean isAirplaneModeOn(Context context) {
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.JELLY_BEAN_MR1){
/* API 17 and above */
return Settings.Global.getInt(context.getContentResolver(), Settings.Global.AIRPLANE_MODE_ON, 0) != 0;
} else {
/* below */
return Settings.System.getInt(context.getContentResolver(), Settings.System.AIRPLANE_MODE_ON, 0) != 0;
}
}
Oreo에서는 비행기 모드 broadCastReceiver를 사용하지 마십시오.그것은 암묵적인 의도이다.삭제되었습니다.현재 예외 목록은 다음과 같습니다.현재 목록에 없으므로 데이터 수신에 실패할 수 있습니다.죽은 걸로 생각해
위의 다른 사용자가 말한 대로 다음 코드를 사용합니다.
@TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR1)
@SuppressWarnings({ "deprecation" })
public static boolean isAirplaneModeOn(Context context) {
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.JELLY_BEAN_MR1){
/* API 17 and above */
return Settings.Global.getInt(context.getContentResolver(), Settings.Global.AIRPLANE_MODE_ON, 0) != 0;
} else {
/* below */
return Settings.System.getInt(context.getContentResolver(), Settings.System.AIRPLANE_MODE_ON, 0) != 0;
}
}
스태틱 브로드캐스트 수신기
매니페스트 코드:
<receiver android:name=".airplanemodecheck" android:enabled="true"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.AIRPLANE_MODE"></action>
</intent-filter>
</receiver>
Java 코드: Broadcast Receiver Java 파일
if(Settings.System.getInt(context.getContentResolver(), Settings.Global.AIRPLANE_MODE_ON, 0)== 0)
{
Toast.makeText(context, "AIRPLANE MODE Off", Toast.LENGTH_SHORT).show();
}
else
{
Toast.makeText(context, "AIRPLANE MODE On", Toast.LENGTH_SHORT).show();
}
또는
다이내믹 브로드캐스트 수신기
자바 코드:액티비티 Java 파일
애플리케이션 오픈에 브로드캐스트 수신기를 등록하여 인터넷 접속 시 비행기 모드가 켜지거나 꺼지는 등 액티비티가 열려 있을 때만 액션을 취하면 매니페스트에 코드를 추가할 필요가 없습니다.
airplanemodecheck reciver;
@Override
protected void onResume() {
super.onResume();
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction(Intent.ACTION_AIRPLANE_MODE_CHANGED);
reciver = new airplanemodecheck();
registerReceiver(reciver, intentFilter);
}
@Override
protected void onStop() {
super.onStop();
unregisterReceiver(reciver);
}
Java 코드: Broadcast Receiver Java 파일
if(Settings.System.getInt(context.getContentResolver(), Settings.Global.AIRPLANE_MODE_ON, 0)== 0)
{
Toast.makeText(context, "AIRPLANE MODE Off", Toast.LENGTH_SHORT).show();
}
else
{
Toast.makeText(context, "AIRPLANE MODE On", Toast.LENGTH_SHORT).show();
}
API 레벨부터 - 17
/**
* Gets the state of Airplane Mode.
*
* @param context
* @return true if enabled.
*/
private static boolean isAirplaneModeOn(Context context) {
return Settings.Global.getInt(context.getContentResolver(),
Settings.Global.AIRPLANE_MODE_ON, 0) != 0;
}
Jelly Bean(빌드 코드 17) 이후 이 필드는 Global 설정으로 이동되었습니다.따라서 최상의 호환성과 견고성을 실현하기 위해서는 두 가지 경우를 모두 처리해야 합니다.다음 예는 Kotlin으로 쓰여져 있습니다.
fun isInAirplane(context: Context): Boolean {
return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
Settings.Global.getInt(
context.contentResolver, Settings.Global.AIRPLANE_MODE_ON, 0
)
} else {
Settings.System.getInt(
context.contentResolver, Settings.System.AIRPLANE_MODE_ON, 0
)
} != 0
}
주의: 젤리빈 이전 버전을 지원하지 않는 경우 if 구를 생략할 수 있습니다.
에 한 값Settings.System.AIRPLANE_MODE_ON
글로벌에 있는 것과 동일합니다.*
/**
* @deprecated Use {@link android.provider.Settings.Global#AIRPLANE_MODE_ON} instead
*/
@Deprecated
public static final String AIRPLANE_MODE_ON = Global.AIRPLANE_MODE_ON;
이것은 이전 코드의 젤리빈 버전입니다.
fun isInAirplane(context: Context): Boolean {
return Settings.Global.getInt(
context.contentResolver, Settings.Global.AIRPLANE_MODE_ON, 0
) != 0
}
도움이 될 것 같은 이 수업을 썼어요.비행기 모드가 활성화 또는 비활성화되었음을 알려주는 부울을 직접 반환하지는 않지만, 비행기 모드가 한 모드에서 다른 모드로 변경될 때 알려줍니다.
public abstract class AirplaneModeReceiver extends BroadcastReceiver {
private Context context;
/**
* Initialize tihe reciever with a Context object.
* @param context
*/
public AirplaneModeReceiver(Context context) {
this.context = context;
}
/**
* Receiver for airplane mode status updates.
*
* @param context
* @param intent
*/
@Override
public void onReceive(Context context, Intent intent) {
if(Settings.System.getInt(
context.getContentResolver(),
Settings.Global.AIRPLANE_MODE_ON, 0
) == 0) {
airplaneModeChanged(false);
} else {
airplaneModeChanged(true);
}
}
/**
* Used to register the airplane mode reciever.
*/
public void register() {
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction(Intent.ACTION_AIRPLANE_MODE_CHANGED);
context.registerReceiver(this, intentFilter);
}
/**
* Used to unregister the airplane mode reciever.
*/
public void unregister() {
context.unregisterReceiver(this);
}
/**
* Called when airplane mode is changed.
*
* @param enabled
*/
public abstract void airplaneModeChanged(boolean enabled);
}
사용.
// Create an AirplaneModeReceiver
AirplaneModeReceiver airplaneModeReceiver;
@Override
protected void onResume()
{
super.onResume();
// Initialize the AirplaneModeReceiver in your onResume function
// passing it a context and overriding the callback function
airplaneModeReceiver = new AirplaneModeReceiver(this) {
@Override
public void airplaneModeChanged(boolean enabled) {
Log.i(
"AirplaneModeReceiver",
"Airplane mode changed to: " +
((active) ? "ACTIVE" : "NOT ACTIVE")
);
}
};
// Register the AirplaneModeReceiver
airplaneModeReceiver.register();
}
@Override
protected void onStop()
{
super.onStop();
// Unregister the AirplaneModeReceiver
if (airplaneModeReceiver != null)
airplaneModeReceiver.unregister();
}
여기서 유일하게 효과가 있었던 것(API 27)은 다음과 같습니다.
IntentFilter filter = new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION);
filter.addAction(Intent.ACTION_AIRPLANE_MODE_CHANGED);
this.registerReceiver(br, filter);
서 ★★★★★br
브로드캐스트 수신기 두 가지 모두 ConnectivityManager.CONNECTIVITY_ACTION
★★★★★★★★★★★★★★★★★」Intent.ACTION_AIRPLANE_MODE_CHANGED
요합니니다다
인터넷이 켜져 있는지 확인할 수 있습니다.
public class ConnectionDetector {
private Context _context;
public ConnectionDetector(Context context){
this._context = context;
}
public boolean isConnectingToInternet(){
ConnectivityManager connectivity = (ConnectivityManager) _context.getSystemService(Context.CONNECTIVITY_SERVICE);
if (connectivity != null)
{
NetworkInfo[] info = connectivity.getAllNetworkInfo();
if (info != null)
for (int i = 0; i < info.length; i++)
if (info[i].getState() == NetworkInfo.State.CONNECTED)
{
return true;
}
}
return false;
}
}
언급URL : https://stackoverflow.com/questions/4319212/how-can-one-detect-airplane-mode-on-android
'itsource' 카테고리의 다른 글
열거형 생성자가 정적 필드에 액세스할 수 없는 이유는 무엇입니까? (0) | 2022.09.19 |
---|---|
잘못된 DUBLE 값: DATATYPE 10진수(10,2)의 SUM()에서 " "이(가) 잘렸습니다. (0) | 2022.09.19 |
MariaDB 5.3에서 5.5로의 업그레이드 (0) | 2022.09.19 |
JavaScript 양식 제출 - 제출 확인 또는 취소 대화 상자 (0) | 2022.09.19 |
JSF가 UI 컴포넌트 상태를 서버에 저장하는 이유는 무엇입니까? (0) | 2022.09.19 |