在 android 上使用 pyjnius 连接到 wifi 网络

Posted

技术标签:

【中文标题】在 android 上使用 pyjnius 连接到 wifi 网络【英文标题】:Connect to a wifi network with pyjnius on android 【发布时间】:2021-03-29 03:39:22 【问题描述】:

我正在为 android 制作一个扫描 Wi-Fi 网络的应用程序,我已经发现了如何在 Android 中使用 pyjnius 扫描 Wi-Fi 网络,但我仍然不知道如何连接到 Wi-Fi与 pyjnius 建立网络,我已经看到如何在 kotlin 中做到这一点,我也尝试过对 pyjnius 做同样的事情,但它对我不起作用,这是我的代码

      def conect(self):
        Contexto = autoclass('android.content.Context')
        ConnectivityManager =  autoclass('android.net.ConnectivityManager')
        WifiConfiguration = autoclass('android.net.wifi.WifiConfiguration')
        WifiManager = autoclass('android.net.wifi.WifiManager')
        Actividad = autoclass('android.app.Activity')
        PythonActivity = autoclass('org.renpy.android.PythonActivity')
        activity = PythonActivity.mActivity

        service = activity.getSystemService(Contexto.WIFI_SERVICE)
                   
        #String = jnius.autoclass("java.lang.String")

        WifiConfiguration.SSID ="TURBONETT_295786"
        WifiConfiguration.preSharedKey =  "KMgApsqz"
        p = service.addNetwork(WifiConfiguration)
        #service.getConfiguredNetworks()
        service.disconnect()  
        service.enableNetwork(p, True) 
        #service.startScan() 
        
       
        service.reconnect() 

当我运行这个函数时,我得到了这个错误

jnius.jnius.JavaException: JVM exception occurred: Illegal reason value: 6619241

如果有人能告诉我我做错了,我将不胜感激,谢谢。

【问题讨论】:

【参考方案1】:

我已经设法让它工作了,这是一个如何使用 kivy 和 Pyjnius 连接到 Wifi 网络的小例子,我希望它对某人有所帮助,不客气。

import kivy
from jnius import  autoclass
from kivymd.app import  MDApp
from kivy.lang.builder import Builder
import kivymd
from kivymd.uix.button import  MDRoundFlatButton
from kivy.uix.screenmanager import ScreenManager, Screen
from kivymd.toast import toast


String = autoclass('java.lang.String')

WifiConfigure = autoclass('android.net.wifi.WifiConfiguration')

PythonActivity = autoclass('org.kivy.android.PythonActivity')
activity = PythonActivity.mActivity
 
service = activity.getSystemService("wifi")
                    
WifiManager = autoclass('android.net.wifi.WifiManager')
#The WifiManager methods are static which means that you do not have to instantiate the class

WifiConfig = WifiConfigure()
#Instant the class since its methods are public and not static





Builder.load_string('''

<Principal>:
    MDRoundFlatButton:
        text: 'Conectar'
        pos_hint: "center_x": .5, "center_y": .64   
        on_press:
            root.Conectar() 

    MDCard:
        id: dos
        elevation: 0
        padding: '0dp'
        size_hint: .95, .07
        pos_hint: "center_x": .5, "center_y": .85
        border_radius: 20
        radius: [10] 
    TextInput:
        id: t1
        text: ''
        hint_text: 'Nombre de la Red'
        pos_hint: "center_x": .55, "center_y": .84
        size_hint: .7, .05 
        text_color: 1, 1, 1, 1
        multiline: False
        background_color: 0,0,0,0
        foreground_color: 1,1,1,1
    MDCard:
        id: dos
        elevation: 0
        padding: '0dp'
        size_hint: .95, .07
        pos_hint: "center_x": .5, "center_y": .75
        border_radius: 20
        radius: [10] 
    TextInput:
        id: t2
        text: ''
        hint_text: 'Contraseña'
        pos_hint: "center_x": .55, "center_y": .74
        size_hint: .7, .05 
        text_color: 1, 1, 1, 1
        multiline: False
        background_color: 0,0,0,0
        foreground_color: 1,1,1,1
       
       

''')

class Principal(Screen):
    def __init__(self, **kwargs):
        
        super(Principal, self).__init__(**kwargs)
    def Conectar(self):
     
        toast("Conectando...")
        Connectname = String(self.ids.t1.text)
        connectkey = String(self.ids.t2.text)
        WifiConfig.SSID = "\""+Connectname.toString()+"\""
        WifiConfig.preSharedKey ="\""+ connectkey.toString()+"\""
        
        added = WifiManager.addNetwork(WifiConfig)
        WifiManager.enableNetwork(added, True)
        

class Inicia (MDApp):
    def build(self):
        self.theme_cls.theme_style = 'Dark'
        hijo = ScreenManager()
        princ = Principal(name="principal")
        hijo.add_widget(princ)
        return hijo                                                   
Inicia().run()                 

Pydroid3 制造

【讨论】:

以上是关于在 android 上使用 pyjnius 连接到 wifi 网络的主要内容,如果未能解决你的问题,请参考以下文章

在 Windows 上安装 pyjnius

通过 pyjnius 在 kivy 中使用 MediaStore

如何使用 Pyjnius 正确访问 Android java 类

如何使用 kivy、pyjnius 为 android 制作 GPS 应用程序?

如何在 python/kivy/pyjnius 检测 Android 中的屏幕分辨率?

如果通过应用程序连接到 WIFI,则无法在 Android 上发送 http 请求