Skip to content

Instantly share code, notes, and snippets.

@tito
Last active June 18, 2022 04:20
Show Gist options
  • Star 4 You must be signed in to star a gist
  • Fork 2 You must be signed in to fork a gist
  • Save tito/5234126 to your computer and use it in GitHub Desktop.
Save tito/5234126 to your computer and use it in GitHub Desktop.
Examples using PyJNIus to create Java class handlers in Python on Android.
from kivy.app import App
from jnius import PythonJavaClass, java_method, autoclass, cast
from threading import current_thread
from kivy.uix.button import Button
from kivy.clock import Clock
from functools import partial
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.progressbar import ProgressBar
def mainthread(func):
def delayed_func(*args):
Clock.schedule_once(partial(func, *args), 0)
return delayed_func
class Generic3AxisSensor(PythonJavaClass):
__javainterfaces__ = ['android/hardware/SensorEventListener']
def __init__(self, app):
super(Generic3AxisSensor, self).__init__()
self.app = app
print '---------------> AUTOCLASS'
PythonActivity = autoclass('org.renpy.android.PythonActivity')
Context = autoclass('android.content.Context')
Sensor = autoclass('android.hardware.Sensor')
SensorManager = autoclass('android.hardware.SensorManager')
print '---------------> CREATE MANAGER'
self.manager = cast('android.hardware.SensorManager',
PythonActivity.mActivity.getSystemService(Context.SENSOR_SERVICE))
print '---------------> GET DEFAUTL SENSOR'
self.sensor = self.manager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER)
print '---------------> REGISTER LISTENER'
self.manager.registerListener(self, self.sensor,
SensorManager.SENSOR_DELAY_NORMAL)
print '---------------> DONE'
print '------> CURRENT THREAD IS', current_thread()
@java_method('(Landroid/hardware/Sensor;I)V')
def onAccuracyChanged(self, sensor, accuracy):
print 'onAccuracyChanged()', sensor, accuracy
@java_method('(Landroid/hardware/SensorEvent;)V')
def onSensorChanged(self, event):
print 'onSensorChanged()', event
print 'onSensorChanged() event.values =', event.values
print '-> CURRENT THREAD IS', current_thread()
self.app.update_values(event.values)
class SensorApp(App):
def start_acc(self, *args):
if self.sensor is None:
self.sensor = Generic3AxisSensor(self)
@mainthread
def update_values(self, values, *args):
for index, x in enumerate(values):
self.root.children[index].value = 50 + x
def build(self):
#root = Label(text='Accelerometer', font_size='40sp')
self.sensor = None
root = BoxLayout(orientation='vertical')
root.add_widget(Button(text='Start', font_size='40sp',
on_release=self.start_acc))
root.add_widget(ProgressBar(value=0))
root.add_widget(ProgressBar(value=0))
root.add_widget(ProgressBar(value=0))
return root
def on_pause(self):
print '-----------------------> PAUSE????'
return True
if __name__ == '__main__':
SensorApp().run()
# need --permission ACCESS_FINE_LOCATION --permission ACCESS_COARSE_LOCATION
# few methods like onStatusChanged are not implemented in this example.
from kivy.app import App
from jnius import PythonJavaClass, java_method, autoclass
from kivy.uix.label import Label
from kivy.clock import Clock
from functools import partial
def mainthread(func):
def delayed_func(*args):
Clock.schedule_once(partial(func, *args), 0)
return delayed_func
Looper = autoclass('android.os.Looper')
LocationManager = autoclass('android.location.LocationManager')
PythonActivity = autoclass('org.renpy.android.PythonActivity')
Context = autoclass('android.content.Context')
class GpsListener(PythonJavaClass):
__javainterfaces__ = ['android/location/LocationListener']
def __init__(self, app):
self.app = app
super(GpsListener, self).__init__()
@java_method('()I')
def hashCode(self):
return id(self)
@java_method('(Landroid/location/Location;)V')
def onLocationChanged(self, location):
print 'onLocationChanged() called', location
print 'lat', location.getLatitude()
print 'lon', location.getLongitude()
self.app.update_location(location)
class GpsApp(App):
@mainthread
def update_location(self, location, *args):
self.root.text = 'lat: {}\nlon: {}'.format(
location.getLatitude(),
location.getLongitude())
def build(self):
locationManager = PythonActivity.mActivity.getSystemService(
Context.LOCATION_SERVICE)
listener = GpsListener(self)
locationManager.requestLocationUpdates(
LocationManager.GPS_PROVIDER,
10000,
10,
listener,
Looper.getMainLooper())
root = Label(text='Should listen to the GPS!', font_size='40sp')
return root
if __name__ == '__main__':
GpsApp().run()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment