我正在自动化wifi呼叫的测试程序,我想知道有没有办法通过adb关闭/打开wifi?
我想要禁用/启用wifi或杀死wifi调用(com.movial.wificall)并重新启动它。
是否可以通过adb和shell命令执行此操作?
到目前为止我找到了:
android.net.wifi.WifiManager
setWifiEnabled(true/false)
我只是不确定如何把它放在一起
答案 0 :(得分:89)
启用:强>
adb shell su -c 'svc wifi enable'
停用强>
adb shell su -c 'svc wifi disable'
adb shell am start -a android.intent.action.MAIN -n com.android.settings/.wifi.WifiSettings
adb shell input keyevent 20 & adb shell input keyevent 23
第一行启动“wifi.WifiSettings”活动,打开WiFi设置页面。第二行模拟按键。
我在Droid X上测试了这两行。但是由于设置布局不同,上面的关键事件可能需要在其他设备中进行编辑。
有关“keyevents”here的更多信息。
答案 1 :(得分:44)
我正在寻找同样的功能来打开/关闭蓝牙,我发现了这个:
adb shell svc wifi enable|disable
答案 2 :(得分:24)
在非root设备上切换wifi的简单方法是使用简单的应用程序:
public class MainActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
WifiManager wfm = (WifiManager) getSystemService(Context.WIFI_SERVICE);
try {
wfm.setWifiEnabled(Boolean.parseBoolean(getIntent().getStringExtra("wifi")));
} catch (Exception e) {
}
System.exit(0);
}
}
的AndroidManifest.xml:
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
ADB命令:
$ adb shell am start -n org.mytools.config/.MainActivity -e wifi true
$ adb shell am start -n org.mytools.config/.MainActivity -e wifi false
答案 3 :(得分:5)
android/android-sdk/platform-tools
在此处打开cmd并键入以下命令
adb shell
su
svc wifi enable/disable
完成!!!!!
答案 4 :(得分:3)
adb shell "svc wifi enable"
这个工作&amp;它在后台进行操作而无需打开相关选项!!
答案 5 :(得分:3)
我测试了这个命令:
adb shell am start -a android.intent.action.MAIN -n com.android.settings/.wifi.WifiSettings
adb shell input keyevent 19 & adb shell input keyevent 19 & adb shell input keyevent 23
并且仅适用于窗口的提示,可能是因为某些驱动程序
关于adb shell svc wifi enable|disable
我想这只能使用root权限
答案 6 :(得分:0)
使用引号
例如: adb shell "svc wifi enable"
这将有效:)
答案 7 :(得分:0)
我可以这样做:
func RequestCameraAccess() {
AVCaptureDevice.requestAccess(forMediaType: AVMediaTypeVideo, completionHandler: { (granted: Bool) -> Void in
if granted == true {
print("User Granted")
DispatchQueue.main.async {
self.Cam();
}
} else {
print("User Rejected")
DispatchQueue.main.async {
self.image1.isHidden = true
}
}
})
}
有时候,如果在开机期间完成(即修复bootloop such as this),它就不适用,你也可以先行启用飞机模式:
settings put global wifi_on 0
settings put global wifi_scan_always_enabled 0
其他选择是强制执行:
settings put global airplane_mode_on 1
settings put global wifi_on 0
settings put global wifi_scan_always_enabled 0
使用(无根)股票模式在LG G5(SE)的Android 7中测试。
答案 8 :(得分:0)
所有这些input keyevent
组合都是依赖Android /硬件的,这很痛苦。
但是,我终于找到了旧的Android 4.1设备的组合:
adb shell am start -a android.intent.action.MAIN -n com.android.settings/.wifi.WifiSettings
adb shell "input keyevent KEYCODE_DPAD_LEFT;input keyevent KEYCODE_DPAD_RIGHT;input keyevent KEYCODE_DPAD_CENTER"
答案 9 :(得分:0)
此功能自android 7.1.1起(无根)
adb shell am start -a android.intent.action.MAIN -n com.android.settings/.wifi.WifiSettings && adb shell input keyevent 23 && adb shell input keyevent 23
这将启动活动,然后发送DPAD中心按键事件。我添加了另一个DPAD中心作为实验,以查看是否可以以相同的方式启用它。
答案 10 :(得分:0)
以下方法不需要root ,并且可以在任何地方使用(根据docs,即使您使用targetSdkVersion = 28
,即使在Android Q +上也是如此)。
制作一个空白应用。
创建一个ContentProvider
:
class ApiProvider : ContentProvider() {
private val wifiManager: WifiManager? by lazy(LazyThreadSafetyMode.NONE) {
requireContext().getSystemService(WIFI_SERVICE) as WifiManager?
}
private fun requireContext() = checkNotNull(context)
private val matcher = UriMatcher(UriMatcher.NO_MATCH).apply {
addURI("wifi", "enable", 0)
addURI("wifi", "disable", 1)
}
override fun query(uri: Uri, projection: Array<out String>?, selection: String?, selectionArgs: Array<out String>?, sortOrder: String?): Cursor? {
when (matcher.match(uri)) {
0 -> {
enforceAdb()
withClearCallingIdentity {
wifiManager?.isWifiEnabled = true
}
}
1 -> {
enforceAdb()
withClearCallingIdentity {
wifiManager?.isWifiEnabled = false
}
}
}
return null
}
private fun enforceAdb() {
val callingUid = Binder.getCallingUid()
if (callingUid != 2000 && callingUid != 0) {
throw SecurityException("Only shell or root allowed.")
}
}
private inline fun <T> withClearCallingIdentity(block: () -> T): T {
val token = Binder.clearCallingIdentity()
try {
return block()
} finally {
Binder.restoreCallingIdentity(token)
}
}
override fun onCreate(): Boolean = true
override fun insert(uri: Uri, values: ContentValues?): Uri? = null
override fun update(uri: Uri, values: ContentValues?, selection: String?, selectionArgs: Array<out String>?): Int = 0
override fun delete(uri: Uri, selection: String?, selectionArgs: Array<out String>?): Int = 0
override fun getType(uri: Uri): String? = null
}
在AndroidManifest.xml
中声明它并获得必要的许可:
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<application>
<provider
android:name=".ApiProvider"
android:authorities="wifi"
android:exported="true" />
</application>
构建并安装应用。
从亚行致电:
adb shell content query --uri content://wifi/enable
adb shell content query --uri content://wifi/disable
使用一个简短的名称来创建批处理脚本/ shell函数/ shell别名,以调用这些命令。
根据您的设备,您可能需要其他权限。
答案 11 :(得分:0)
ADB Connect to wifi with credentials :
您可以使用以下ADB命令连接到wifi并输入密码:
adb等待设备外壳启动-n com.android.settingstest / .wifi.WifiSettings -e WIFI 1 -e AccessPointName“ enter_user_name” -e密码“ enter_password”
答案 12 :(得分:0)
在Android测试中,我这样做是: InstrumentationRegistry.getInstrumentation()。getUiAutomation()。executeShellCommand(“ svc wifi enable ”) InstrumentationRegistry.getInstrumentation()。getUiAutomation()。executeShellCommand(“ svc wifi disable ”)