camera.py 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. import android
  2. import android.activity
  3. from os import unlink
  4. from jnius import autoclass, cast
  5. from plyer.facades import Camera
  6. from plyer.platforms.android import activity
  7. Intent = autoclass('android.content.Intent')
  8. PythonActivity = autoclass('org.renpy.android.PythonActivity')
  9. MediaStore = autoclass('android.provider.MediaStore')
  10. Uri = autoclass('android.net.Uri')
  11. class AndroidCamera(Camera):
  12. def _take_picture(self, on_complete, filename=None):
  13. assert(on_complete is not None)
  14. self.on_complete = on_complete
  15. self.filename = filename
  16. android.activity.unbind(on_activity_result=self._on_activity_result)
  17. android.activity.bind(on_activity_result=self._on_activity_result)
  18. intent = Intent(MediaStore.ACTION_IMAGE_CAPTURE)
  19. uri = Uri.parse('file://' + filename)
  20. parcelable = cast('android.os.Parcelable', uri)
  21. intent.putExtra(MediaStore.EXTRA_OUTPUT, parcelable)
  22. activity.startActivityForResult(intent, 0x123)
  23. def _take_video(self, on_complete, filename=None):
  24. assert(on_complete is not None)
  25. self.on_complete = on_complete
  26. self.filename = filename
  27. android.activity.unbind(on_activity_result=self._on_activity_result)
  28. android.activity.bind(on_activity_result=self._on_activity_result)
  29. intent = Intent(MediaStore.ACTION_VIDEO_CAPTURE)
  30. uri = Uri.parse('file://' + filename)
  31. parcelable = cast('android.os.Parcelable', uri)
  32. intent.putExtra(MediaStore.EXTRA_OUTPUT, parcelable)
  33. # 0 = low quality, suitable for MMS messages,
  34. # 1 = high quality
  35. intent.putExtra(MediaStore.EXTRA_VIDEO_QUALITY, 1)
  36. activity.startActivityForResult(intent, 0x123)
  37. def _on_activity_result(self, requestCode, resultCode, intent):
  38. if requestCode != 0x123:
  39. return
  40. android.activity.unbind(on_activity_result=self._on_activity_result)
  41. if self.on_complete(self.filename):
  42. self._unlink(self.filename)
  43. def _unlink(self, fn):
  44. try:
  45. unlink(fn)
  46. except:
  47. pass
  48. def instance():
  49. return AndroidCamera()