使用活动管理器(am)调用公共android api方法的bash脚本

使用活动管理器(am)调用公共android api方法的bash脚本,android,bash,shell,activity-manager,android-wireless,Android,Bash,Shell,Activity Manager,Android Wireless,我正在尝试从bash脚本调用公共android方法getSSID()?我的目标是将android设备上当前连接的SSID返回到bash变量 要求: 必须以非root用户身份运行 只能使用android烘焙的函数 AKA不需要安装其他应用程序 必须直接从简单的bash脚本运行 以前: 我曾在grep中使用dumpsys命令来检索我需要的内容,但现在看来我需要成为root才能工作,所以我正在寻找这个概念的替代品 $ dumpsys wifi | grep -i $grepwifi 所以我找到

我正在尝试从bash脚本调用公共android方法getSSID()?我的目标是将android设备上当前连接的SSID返回到bash变量

要求:

  • 必须以非root用户身份运行
  • 只能使用android烘焙的函数
  • AKA不需要安装其他应用程序
  • 必须直接从简单的bash脚本运行
以前: 我曾在grep中使用dumpsys命令来检索我需要的内容,但现在看来我需要成为root才能工作,所以我正在寻找这个概念的替代品

 $ dumpsys wifi | grep -i $grepwifi
所以我找到了这个公共api

但我不知道如何让它工作。我尝试了一些选项,如下面列出的,但没有任何运气

   $ am start -a android.intent.action.MAIN -n com.android.settings/.wifi.WifiInfo.getSSID()
/system/bin/sh: syntax error: '(' unexpected


我假设我只是没有正确地组合url。因此,我希望有人能告诉我这些命令是如何构造的,这样一旦我通过了ssid chalange,我就可以继续探索其他公共api,但如果有其他简单的方法从设备检索wifi信息,我将非常感谢任何可行的替代方案。

首先,哪个设备和android版本不允许您使用
dumpsys

无论如何,我将向您展示一种不需要使用
dumpsys
的方法

您可以使用
culebra
生成脚本,然后根据需要稍微修改它。打开快速设置,然后运行

culebra -r -d true -t false -i false -o ssid.py
删除不需要的内容,添加一个regexp以匹配任何SSID(不仅仅是您看到的SSID),您应该有如下内容

#! /usr/bin/env python
# -*- coding: utf-8 -*-
'''
Copyright (C) 2013-2016  Diego Torres Milano
Created on 2016-11-09 by Culebra v12.4.0
                      __    __    __    __
                     /  \  /  \  /  \  /  \ 
____________________/  __\/  __\/  __\/  __\_____________________________
___________________/  /__/  /__/  /__/  /________________________________
                   | / \   / \   / \   / \   \___
                   |/   \_/   \_/   \_/   \    o \ 
                                           \_____/--<
@author: Diego Torres Milano
@author: Jennifer E. Swofford (ascii art snake)
'''


import re
import sys
import os

from com.dtmilano.android.viewclient import ViewClient

TAG = 'CULEBRA'

_s = 5
_v = '--verbose' in sys.argv


kwargs1 = {'ignoreversioncheck': False, 'verbose': False, 'ignoresecuredevice': False}
device, serialno = ViewClient.connectToDeviceOrExit(**kwargs1)
kwargs2 = {'forceviewserveruse': False, 'useuiautomatorhelper': False, 'ignoreuiautomatorkilled': True, 'autodump': False, 'startviewserver': True, 'compresseddump': True}
vc = ViewClient(device, serialno, **kwargs2)


vc.uiDevice.openQuickSettings()
vc.sleep(_s)

vc.dump(window='-1')
print vc.findViewWithContentDescriptionOrRaise(re.compile(u'''Connected to .*''')).getContentDescription()
#/usr/bin/env python
#-*-编码:utf-8-*-
'''
版权所有(C)2013-2016迭戈·托雷斯·米兰
库莱布拉v12.4.0于2016年11月9日创建
__    __    __    __
/  \  /  \  /  \  /  \ 
____________________/  __\/  __\/  __\/  __\_____________________________
___________________/  /__/  /__/  /__/  /________________________________
| / \   / \   / \   / \   \___
|/\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
\_____/--<
@作者:迭戈·托雷斯·米兰
@作者:Jennifer E.Swofford(ascii艺术蛇)
'''
进口稀土
导入系统
导入操作系统
从com.dtmilano.android.viewclient导入viewclient
标签='CULEBRA'
_s=5
_v='--verbose'在sys.argv中
kwargs1={'ignoreversioncheck':False,'verbose':False,'ignoresecuredevice':False}
设备,serialno=ViewClient.connectToDeviceOrExit(**kwargs1)
kwargs2={'forceviewserveruse':False,'useuiautomatorhelper':False,'ignoreuiautomatorkilled':True,'autodump':False,'startviewserver':True,'compresseddump':True}
vc=ViewClient(设备,序列号,**kwargs2)
vc.uiDevice.openQuickSettings()
vc.睡眠(美国)
vc.dump(窗口='-1')
打印vc.findViewWithContentDescriptionOrRaise(重新编译(u'''连接到。*'').getContentDescription()

或者,如果您愿意,您可以通过UI使用并执行这些操作。

am start
在命令行上接受意图,而不是您尝试的方法名称。感谢您的回复。这是一个我能够开始工作的例子。adb shell am start-a android.intent.action.MAIN-n com.android.settings/.wifi.wifisettings但这不是一种方法,而是一个组件(pkg+活动),感谢您的回复。我理解AM文档[此处包含可调用的示例公共方法列表。您能指出
AM
(小写,命令)中的位置吗文档中指定您可以调用方法?我在测试过的几乎所有设备上都看到了关于非根用户使用dumpsys的相同行为。今天,为了确保我没有发疯,我尝试了3款不同的手机。Android 2.3.7、4.1.2和6.0.1。所有3款手机都得到了“权限拒绝”在命令上,除非以root身份运行。$dumpsys wifi'这会让任何人觉得不寻常吗?我假设这是非常典型的。感谢您提出的解决方案,但有几个原因说明这对我不起作用。android上的python位于列表的顶部。我的3部测试手机中没有一部能够运行defaul的python脚本t、 你知道有更直接的方法吗?python是在你的计算机上运行的,而不是在你的手机上运行的。这可能就是为什么
dumpsys
不适合你的原因,
adb
是需要的。因此,为了清楚起见,你的脚本是用来提取通过adb连接到运行scrip的计算机上的手机的wifi ssid的?-难怪我们保留它通信错误。:)我的bash脚本不打算通过adb运行,而是直接在android设备上运行。现在它是有意义的。是的,dumpsys可以通过我的笔记本电脑上的adb外壳在所有设备上进行非根访问。当它从脚本直接在设备上运行时,似乎需要提升权限。-doe既然我们已经解决了问题,那我还有什么选择吗?那你为什么说
bash
?我打赌你在android上没有
bash
#! /usr/bin/env python
# -*- coding: utf-8 -*-
'''
Copyright (C) 2013-2016  Diego Torres Milano
Created on 2016-11-09 by Culebra v12.4.0
                      __    __    __    __
                     /  \  /  \  /  \  /  \ 
____________________/  __\/  __\/  __\/  __\_____________________________
___________________/  /__/  /__/  /__/  /________________________________
                   | / \   / \   / \   / \   \___
                   |/   \_/   \_/   \_/   \    o \ 
                                           \_____/--<
@author: Diego Torres Milano
@author: Jennifer E. Swofford (ascii art snake)
'''


import re
import sys
import os

from com.dtmilano.android.viewclient import ViewClient

TAG = 'CULEBRA'

_s = 5
_v = '--verbose' in sys.argv


kwargs1 = {'ignoreversioncheck': False, 'verbose': False, 'ignoresecuredevice': False}
device, serialno = ViewClient.connectToDeviceOrExit(**kwargs1)
kwargs2 = {'forceviewserveruse': False, 'useuiautomatorhelper': False, 'ignoreuiautomatorkilled': True, 'autodump': False, 'startviewserver': True, 'compresseddump': True}
vc = ViewClient(device, serialno, **kwargs2)


vc.uiDevice.openQuickSettings()
vc.sleep(_s)

vc.dump(window='-1')
print vc.findViewWithContentDescriptionOrRaise(re.compile(u'''Connected to .*''')).getContentDescription()