kivy / pyjnius

Access Java classes from Python
https://pyjnius.readthedocs.org
MIT License
1.39k stars 254 forks source link

setAccessible() of java/lang/reflect/Field #174

Open oastashev opened 9 years ago

oastashev commented 9 years ago

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?

--- Want to back this issue? **[Post a bounty on it!](https://www.bountysource.com/issues/26650751-setaccessible-of-java-lang-reflect-field?utm_campaign=plugin&utm_content=tracker%2F77133&utm_medium=issues&utm_source=github)** We accept bounties via [Bountysource](https://www.bountysource.com/?utm_campaign=plugin&utm_content=tracker%2F77133&utm_medium=issues&utm_source=github).
inclement commented 9 years ago

Is this a real issue? What is the problem?

oastashev commented 9 years ago

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);
Tungsteno74 commented 7 years ago

@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.