pyjnius
pyjnius copied to clipboard
setAccessible() of java/lang/reflect/Field
Hi there :)
I'm trying implement feature 'enable mobile data' by translating from java code to further python code:
Context = autoclass('android.content.Context')
Class = autoclass('java.lang.Class')
PythonActivity = autoclass('org.renpy.android.PythonActivity')
conman = PythonActivity.getSystemService(Context.CONNECTIVITY_SERVICE)
conmanClass = Class.forName(conman.getClass().getName())
connectivityManagerField = conmanClass.getDeclaredField("mService")
print connectivityManagerField
connectivityManagerField.setAccessible(True)
connectivityManager = connectivityManagerField.get(conman)
connectivityManagerClass = Class.forName(connectivityManager.getClass().getName())
setMobileDataEnabledMethod = connectivityManagerClass.getDeclaredMethod("setMobileDataEnabled", autoclass('java.lang.Boolean').TYPE)
setMobileDataEnabledMethod.setAccessible(True)
setMobileDataEnabledMethod.invoke(connectivityManager, True)
Executing under Kivy Framework I'v got exception:
I/python (13732): <Field at 0x61ae9090 jclass=java/lang/reflect/Field jself=<LocalRef obj=0x1f300ce2 at 0x608b4940>>
I/python (13732): Traceback (most recent call last):
I/python (13732): File "main.py", line 59, in <module>
I/python (13732): MobileDataApp().run()
I/python (13732): File "/home/tito/code/python-for-android/build/python-install/lib/python2.7/site-packages/kivy/app.py", line 823, in run
I/python (13732): File "kivy/_event.pyx", line 699, in kivy._event.EventDispatcher.dispatch (kivy/_event.c:7011)
I/python (13732): File "main.py", line 42, in on_start
I/python (13732): connectivityManagerField.setAccessible(True)
I/python (13732): AttributeError: 'Field' object has no attribute 'setAccessible'
Any ideas how to solve problem?
Is this a real issue? What is the problem?
Original java code:
final ConnectivityManager conman = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
final Class conmanClass = Class.forName(conman.getClass().getName());
final Field connectivityManagerField = conmanClass.getDeclaredField("mService");
connectivityManagerField.setAccessible(true);
final Object connectivityManager = connectivityManagerField.get(conman);
final Class connectivityManagerClass = Class.forName(connectivityManager.getClass().getName());
final Method setMobileDataEnabledMethod = connectivityManagerClass.getDeclaredMethod("setMobileDataEnabled", Boolean.TYPE);
setMobileDataEnabledMethod.setAccessible(true);
setMobileDataEnabledMethod.invoke(connectivityManager, enabled);
@oastashev @inclement Also I'm interested to enable mobile data in Android. How did it go then? Someone has managed to successfully implement the command? I could help if needed to implement the functionality.