Skip to main content

A re-implementation of android java API in python with easy access to some Android functionality like Notification,Reading of Contacts, accessing Webview Cookies, etc...

Project description

KvDroid

A re-implementation of android java API in python with easy access to some Android functionality like Notification, Reading of Contacts, accessing Webview Cookies, etc...

The aim is to provide full access to Android API which can be used together with Python frameworks like: kivy, kivymd, etc... Or as a standalone, in which Android native UI is created with only python codes.

Compiling into APK

To compile, kivy p4a or kivy buildozer is required, and bootstrap must be set to sdl2

Dependencies

Android min-api21

Installation

pip install kvdroid

or

pip install https://github.com/kvdroid/Kvdroid/archive/refs/heads/master.zip # master version
# Note: this works on android only, but you can install it on your desktop for code completion assistance

Buildozer Requirement

requirement = kvdroid

or

requirement = https://github.com/kvdroid/Kvdroid/archive/refs/heads/master.zip

Usage

To use system-provided fonts

:warning: That function is so experimental. It should work for Android 7 and above but not been tested on much devices. It is actually for multilingual purposes to use system-provided fonts for no Latin languages. system_font() will always return the supported font from /system/fonts for the current device language. Also, you could use any language-supported font from the system just by calling the system_font function with the target language's iso639-1 or iso639-2 abbreviation such as font_name = system_font('zh') or system_font('zho').

from kivy.uix.label import Label
from kvdroid.tools.font import system_font

# that will return the default font for the device's current language.
Label(text = "example", font_name = system_font())

# for the specific language font
Label(text = "你好世界", font_name = system_font('zho')) # Language definition must be iso639-1 or iso639-2 abbreviation.  https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes

To send notification

from kvdroid.jclass.android.graphics import Color
from kvdroid.tools.notification import create_notification
from kvdroid.tools import get_resource

create_notification(
    small_icon=get_resource("drawable").ico_nocenstore,  # app icon
    channel_id="1", title="You have a message",
    text="hi, just wanted to check on you",
    ids=1, channel_name=f"ch1",
    large_icon="assets/image.png",
    expandable=True,
    small_icon_color=Color().rgb(0x00, 0xC8, 0x53),  # 0x00 0xC8 0x53 is same as 00C853
    big_picture="assets/image.png"
)

To read Contacts

from kvdroid.tools.contact import get_contact_details

get_contact_details("phone_book") # gets a dictionary of all contact both contact name and phone mumbers
get_contact_details("names") # gets a list of all contact names
get_contact_details("mobile_no") # gets a list of all contact phone numbers

To get a list of all installed packages (Applications)

from kvdroid.tools.package import all_packages

print(all_packages())

"""
['com.google.android.carriersetup',
 'com.android.cts.priv.ctsshim',
 'com.google.android.ext.services',
 'com.android.providers.telephony',
 'com.android.providers.calendar'...]
"""

To get all main activities

from kvdroid.tools.package import all_main_activities

print(all_main_activities())

"""
[{'com.android.settings': 'com.android.settings.Settings'},
 {'com.android.vending': 'com.android.vending.AssetBrowserActivity'},
 {'com.google.android.contacts': 'com.android.contacts.activities.PeopleActivity'},
 {'com.google.android.deskclock': 'com.android.deskclock.DeskClock'}...]
"""

To check if the package is a system application

from kvdroid.tools.package import is_system_package

print(is_system_package("com.android.settings"))

To get a specific app details

from kvdroid.tools.package import package_info

print(package_info("com.android.settings"))

"""
{'activities': ['org.chromium.settings.SettingsBlackHoleActivity',
                'com.android.settings.Settings$NetworkDashboardActivity',
                'com.android.settings.network.NetworkSettings',
                'com.android.settings.Settings$AdvancedAppsActivity',
                'com.android.settings.app.AdvancedAppsSettings'...],
 'dataDir': '/data/user_de/0/com.android.settings',
 'loadIcon': <android.graphics.drawable.Drawable at 0x7e8e15bac8b0 jclass=android/graphics/drawable/Drawable jself=<LocalRef obj=0x6196 at 0x7e8e15f63e30>>,
 'loadLabel': 'Settings',
 'packageName': 'com.android.settings',
 'permissions': ['org.chromium.settings.ENABLE_INPUT_METHOD',
                 'android.permission.REQUEST_NETWORK_SCORES',
                 'android.permission.WRITE_MEDIA_STORAGE',
                 'android.permission.WRITE_EXTERNAL_STORAGE'...],
 'processName': 'com.android.settings',
 'publicSourceDir': '/system/priv-app/ArcSettings/ArcSettings.apk',
 'sharedLibraryFiles': None,
 'sourceDir': '/system/priv-app/ArcSettings/ArcSettings.apk'}
"""

To get an activity info

from kvdroid.tools.package import activity_info

print(activity_info("com.android.settings","com.android.settings.network.NetworkSettings"))

"""
{'loadIcon': <android.graphics.drawable.Drawable at 0x7e8e15c46db0 jclass=android/graphics/drawable/Drawable jself=<LocalRef obj=0x6156 at 0x7e8e15c8c8b0>>,
 'loadLabel': 'Network and Internet'}
"""

To save a drawable object to given path as png

from kvdroid.tools.package import package_info
from kvdroid.tools.graphic import save_drawable

app = package_info("com.android.settings")
app_icon = app["loadIcon"]

# <android.graphics.drawable.Drawable at 0x7e8e15c46db0 jclass=android/graphics/drawable/Drawable jself=<LocalRef obj=0x6156 at 0x7e8e15c8c8b0>>

save_drawable(app_icon, "< path >" , "< file_name >") 

# That will save the app icon to given path and return the path + filename
# can be used like

from kivy.uix.image import Image

Image(source = save_drawable(app_icon, "< path >" , "< file_name >"))

To check if the given app is installed from PlayStore

from kvdroid.tools.package import package_source

print(package_source("< package_name >"))

To get Android WebView Cookies

from kvdroid.tools.webkit import get_cookies

get_cookies("https://google.login")

To detect keyboard height

from kvdroid.tools import keyboard_height

print(keyboard_height())

To detect if app is installed from Play Store or not

from kvdroid.tools.appsource import app_source

print(app_source())

To get absolute screen size in dp-pixel and detect current orientation

from kvdroid.tools.metrics import Metrics
screen = Metrics()

print(screen.orientation())
print(screen.width_dp())
print(screen.height_px())
print(screen.resolution())

To check if device has a data connection.

from kvdroid.tools.network import network_status, wifi_status, mobile_status

print(network_status())  # for both wifi and mobile
print(wifi_status())    # only for wifi
print(mobile_status())    # only for mobile

To check if device is in dark mode or not

from kvdroid.tools.darkmode import dark_mode

print(dark_mode)

To get device informations. Available options are; 'model','brand','manufacturer','version','sdk','product','base','rom','security','hardware','tags','sdk_int','total_mem','used_mem','avail_ram','total_ram','used_ram','bat_level','bat_capacity','bat_temperature','bat_voltage','bat_technology'

from kvdroid.tools.deviceinfo import device_info

print(device_info("model"))
print(device_info("avail_ram", convert=True))

To enable immersive mode

from kvdroid.tools import immersive_mode

immersive_mode()

To launch a specific app outside your app Activity

from kvdroid.tools import launch_app_externally

launch_app_externally("< app_package >")

To launch a specific app within your app Activity

from kvdroid.tools import launch_app_internally

launch_app_internally("< app_package >", "< app_activity >")

To open target app's details page

from kvdroid.tools import app_details

app_details("< app_package >")

To detect current device's language

from kvdroid.tools.lang import device_lang

print(device_lang())    # en
print(device_lang("DisplayLanguage"))    # English
print(device_lang(option = "DisplayLanguage", display_lang = "fr"))     # Anglais

"""
Available options are ;

Language           ---> en      
ISO3Language       ---> eng 
Country            ---> US 
ISO3Country        ---> USA 
DisplayCountry     ---> United States 
DisplayName        ---> English (United States) 
String             ---> en_US
DisplayLanguage    ---> English
LanguageTag        ---> en-US
"""

To set statusbar color

from kvdroid.tools import change_statusbar_color

change_statusbar_color("#FFFFFF", "black")

To set navigationbar color

from kvdroid.tools import navbar_color

navbar_color("#FFFFFF")

To display a toast message

from kvdroid.tools import toast

toast("hello world")

To get absolute sdcard path

from kvdroid.tools.path import sdcard

print(sdcard)

To get absolute external_sdcard

from kvdroid.tools.path import external_sdcard

print(external_sdcard)

To get path of working app folder

from kvdroid.tools.path import app_folder

print(app_folder)

To get file mime Type

from kvdroid.tools import mime_type

mime_type = mime_type("path/to/file")
print(mime_type)

To change default wallpaper

from kvdroid.tools import set_wallpaper

set_wallpaper("/sdcard/test.jpg")

To use text-to-speech

from kvdroid.tools import speech

speech("hello world", "en")

To use default Download Manager

from kvdroid.tools import download_manager

download_manager("< title >", "< description >", "< URL >", "< path >", "< file >")

To restart the app

from kvdroid.tools import restart_app

restart_app()

To share text via Android Share menu

from kvdroid.tools import share_text

share_text("hello world", title="Share", chooser=False, app_package=None,
           call_playstore=False, error_msg="application unavailable")

To share any file via Android Share menu

from kvdroid.tools import share_file

share_file(
    "< path - to - file >", "< title >", "< chooser >", "< app - package: open -with-default - app >",
    "< call_playstore >", "< error_msg >")
share_file("/sdcard/test.pdf", title='Share', chooser=False, app_package=None,
           call_playstore=False, error_msg="application unavailable")

To play supported music format or radio stream through Android Media Player player.mPLayer = Android Media PLayer

from kvdroid.tools.audio import Player

player = Player()
player.play("< path - to - music - file >")
player.stream("https://bit.ly/3mHQdzZ")  # radio
player.pause()
player.resume()
player.seek(2) # seconds
player.do_loop(True)  # default is False
player.is_playing()
player.get_duration()
player.current_position()

To cast Java Object

from kvdroid.cast import cast_object
from kvdroid.jclass.android import Uri

uri = Uri().fromFile("/home/java/my_document.pdf")
parcelable = cast_object("parcelable", uri)

# Above code  is same as below code::

from kvdroid.jclass.android import Uri
from jnius import cast

uri = Uri().fromFile("/home/java/my_document.pdf")
parcelable = cast("android.os.Parcelabel", uri)

'''
 the difference is, you dont have to remember the package name, just only the name and 
 you are good to go. This will also be helpful for python devs who do have zero knowledge on java
 
 Note:: 
 not all castable java object are included you can open an issue to include all missing 
 castables
'''

To access WebView cookies
(i.e if you compiled your app with webview bootstrap or have Webview in your app)

from kvdroid.tools.webkit import get_cookies

print(get_cookies("https://google.com"))

To access android package resource folders like:\

  • drawble
  • layout
  • menu
  • values
  • mipmap
  • etc....
from kvdroid.tools import get_resource

drawable = get_resource("drawable")

License

MIT

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

kvdroid-0.2.9.tar.gz (26.9 kB view details)

Uploaded Source

File details

Details for the file kvdroid-0.2.9.tar.gz.

File metadata

  • Download URL: kvdroid-0.2.9.tar.gz
  • Upload date:
  • Size: 26.9 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/1.13.0 pkginfo/1.4.2 requests/2.21.0 setuptools/40.8.0 requests-toolbelt/0.8.0 tqdm/4.28.1 CPython/3.7.3

File hashes

Hashes for kvdroid-0.2.9.tar.gz
Algorithm Hash digest
SHA256 5916768d49a5ada9459bee004b5fad7156ca8458dcb0f8eba471f4a4a4e165ff
MD5 24d7e85d0077b24fa008eecf1674b0d0
BLAKE2b-256 a872b06fc942c8fca1750d3453c9ea48a185992ae6fbc84ed68fc0edb7d5c36f

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page