間違えましたか?動いていない。
public void airplane() {
boolean isEnabled = Settings.System.getInt(this.getApplicationContext().getContentResolver(), Settings.System.AIRPLANE_MODE_ON, 0) == 1;
Settings.System.putInt(context.getContentResolver(),Settings.System.AIRPLANE_MODE_ON,isEnabled ? 0 : 1);
//Settings.System.putInt(this.getApplicationContext().getContentResolver(),Settings.System.AIRPLANE_MODE_ON,isEnabled ? 0 : 1);
Intent intent = new Intent(Intent.ACTION_AIRPLANE_MODE_CHANGED);
}
この回答 にはこれを行うために必要なコードが含まれています。また、WRITE_SETTINGS
許可。
機内モードの制御 からの適応:
// read the airplane mode setting
boolean isEnabled = Settings.System.getInt(
getContentResolver(),
Settings.System.AIRPLANE_MODE_ON, 0) == 1;
// toggle airplane mode
Settings.System.putInt(
getContentResolver(),
Settings.System.AIRPLANE_MODE_ON, isEnabled ? 0 : 1);
// Post an intent to reload
Intent intent = new Intent(Intent.ACTION_AIRPLANE_MODE_CHANGED);
intent.putExtra("state", !isEnabled);
sendBroadcast(intent);
以下はrootedデバイスで使用できます。
コマンドラインから、次の方法で機内モードのオン/オフを切り替えることができます。
ON:
settings put global airplane_mode_on 1
am broadcast -a Android.intent.action.AIRPLANE_MODE --ez state true
OFF:
settings put global airplane_mode_on 0
am broadcast -a Android.intent.action.AIRPLANE_MODE --ez state false
これはAndroid 4.4.2+で動作します
ルートなし、システムレベルの許可なし!
in AndroidManifest.xmlパーミッションを追加:
<!--airplane mode-->
<uses-permission Android:name="Android.permission.WRITE_SETTINGS"/>
その後:
@SuppressWarnings("deprecation")
private void initAirplanemodeBtn() {
airplanemodeButton = (ToggleButton) findViewById(R.id.airplanemode_btn);
airplanemodeButton.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if (Android.os.Build.VERSION.SDK_INT < 17) {
try {
// read the airplane mode setting
boolean isEnabled = Settings.System.getInt(
getContentResolver(),
Settings.System.AIRPLANE_MODE_ON, 0) == 1;
// toggle airplane mode
Settings.System.putInt(
getContentResolver(),
Settings.System.AIRPLANE_MODE_ON, isEnabled ? 0 : 1);
// Post an intent to reload
Intent intent = new Intent(Intent.ACTION_AIRPLANE_MODE_CHANGED);
intent.putExtra("state", !isEnabled);
sendBroadcast(intent);
} catch (ActivityNotFoundException e) {
Log.e(TAG, e.getMessage());
}
} else {
try {
Intent intent = new Intent(Android.provider.Settings.ACTION_AIRPLANE_MODE_SETTINGS);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
} catch (ActivityNotFoundException e) {
try {
Intent intent = new Intent("Android.settings.WIRELESS_SETTINGS");
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
} catch (ActivityNotFoundException ex) {
Toast.makeText(buttonView.getContext(), R.string.not_able_set_airplane, Toast.LENGTH_SHORT).show();
}
}
}
}
});
}
私は「Settings.System.AIRPLANE_MODE_ON」は非推奨だと思います。
public class AirplaneModeService {
public boolean run(Context context) {
boolean isEnabled = isAirplaneModeOn(context);
// Toggle airplane mode.
setSettings(context, isEnabled?1:0);
// Post an intent to reload.
Intent intent = new Intent(Intent.ACTION_AIRPLANE_MODE_CHANGED);
intent.putExtra("state", !isEnabled);
context.sendBroadcast(intent);
return true;
}
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;
}
}
public static void setSettings(Context context, int value) {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN_MR1) {
Settings.System.putInt(
context.getContentResolver(),
Settings.System.AIRPLANE_MODE_ON, value);
} else {
Settings.Global.putInt(
context.getContentResolver(),
Settings.Global.AIRPLANE_MODE_ON, value);
}
}
}
これが誰かの助けになることを願っています。
@eggyalが述べたように、飛行機モードの切り替えはバージョン4.2以降では行えません。
しかし、私たちにできることは、各ワイヤレスサービスをオンにすることです。
Wifiは、WifiService〜getSystemService(Context.WIFI_SERVICE)を使用して制御できます。 Bluetoothは、BluetoothAdapter-getSystemService(Context.BLUETOOTH_SERVICE)を使用して制御できます。
いくつかの調査の後、Java Reflectionを使用して、引き続きAndroid無線(Wifi、ネットワーク、Bluetooth) Bluetooth、Wifi、およびネットワークの。
したがって、無線を制御することにより、実際に独自の機内モードを作成できます。
警告:一部のデバイスではReflectionの使用に失敗する場合があります(メーカーによるクラスの実装に依存します)。
このサンプルコードは、モバイルネットワークを切り替えます。
private void setMobileRadioEnabled(boolean enabled) {
try {
final ConnectivityManager conman = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
final Class conmanClass = Class.forName(conman.getClass().getName());
final Field iConnectivityManagerField = conmanClass.getDeclaredField("mService");
iConnectivityManagerField.setAccessible(true);
final Object iConnectivityManager = iConnectivityManagerField.get(conman);
final Class iConnectivityManagerClass = Class.forName(iConnectivityManager.getClass().getName());
final Method setRadio = iConnectivityManagerClass.getDeclaredMethod("setRadio", Integer.TYPE , Boolean.TYPE);
setRadio.setAccessible(true);
for (NetworkInfo networkInfo : conman.getAllNetworkInfo()) {
if(isNetworkTypeMobile(networkInfo.getType())) {
setRadio.invoke(iConnectivityManager, networkInfo.getType(), enabled);
}
}
} catch (Exception e) {
Log.e(TAG, "Opss...", e);
}
}
public static boolean isNetworkTypeMobile(int networkType) {
switch (networkType) {
case ConnectivityManager.TYPE_MOBILE:
case ConnectivityManager.TYPE_MOBILE_MMS:
case ConnectivityManager.TYPE_MOBILE_SUPL:
case ConnectivityManager.TYPE_MOBILE_DUN:
case ConnectivityManager.TYPE_MOBILE_HIPRI:
case 10:
case 11:
case 12:
case 14:
return true;
default:
return false;
}
}
Lollipopの後、以下のメソッドを使用できますが、非表示のAPIであり、アプリケーションにはシステムレベルの権限が必要です
<uses-permission Android:name="Android.permission.CONNECTIVITY_INTERNAL"/>
ConnectivityManager mgr = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
mgr.setAirplaneMode(true);
すべての設定が次のようにAndroid.providerを使用する前にここに:
public class MainActivity extends Activity implements OnClickListener {
Button air;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
air = (Button) findViewById(R.id.button1);
air.setOnClickListener(this);
}
@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
// read the airplane mode setting
boolean isEnabled = Android.provider.Settings.System.getInt(
getContentResolver(),
Android.provider.Settings.System.AIRPLANE_MODE_ON, 0) == 1;
// toggle airplane mode
Android.provider.Settings.System.putInt(
getContentResolver(),
Android.provider.Settings.System.AIRPLANE_MODE_ON, isEnabled ? 0 : 1);
// Post an intent to reload
Intent intent = new Intent(Intent.ACTION_AIRPLANE_MODE_CHANGED);
intent.putExtra("state", !isEnabled);
sendBroadcast(intent);
}
}
Android 4.2 API (強調が追加された)で文書化されているように、注意してください:
新しいグローバル設定
Settings.Global
を追加して、複数のユーザーをサポートするようにシステム設定が更新されました。この設定のコレクションはSettings.Secure
設定に似ていますが、これらは読み取り専用ですが、デバイス上のすべてのユーザースペースにグローバルに適用されます。いくつかの既存の設定が
Settings.System
またはSettings.Secure
のいずれかから移動されました。アプリがSettings.System
(AIRPLANE_MODE_ON
など)で以前に定義された設定を現在変更している場合、Android 4.2以上の設定がSettings.Global
。Settings.Global
にある設定を読み続けることができますが、アプリは変更しても安全ではないと見なされるため、そうしようとすると黙って失敗し、システムはAndroid 4.2以上でアプリを実行しているときにシステムログに警告を書き込みます。
これは私のために働く
public static boolean isAirplaneModeOn() {
return Settings.System.getInt(mContext.getContentResolver(),
Settings.Global.AIRPLANE_MODE_ON, 0) != 0;
}
public static void setAirPlaneMode(boolean airplaneMode) {
Logger.d(LOG_TAG + "setAirPlaneMode airplaneMode: " + airplaneMode) ;
int state = airplaneMode ? 1 : 0;
Settings.Global.putInt(mContext.getContentResolver(), Settings.Global.AIRPLANE_MODE_ON,
state);
Intent intent = new Intent(Intent.ACTION_AIRPLANE_MODE_CHANGED);
intent.putExtra("state", state);
mContext.sendBroadcast(intent);
}
ただし、システム権限が必要です
<uses-permission Android:name="Android.permission.WRITE_SECURE_SETTINGS" />