259 lines
7.7 KiB
Python
259 lines
7.7 KiB
Python
"""
|
|
Android-pyApi — Android API 全面 Python 翻译
|
|
==============================================
|
|
方法签名完全对齐 Android SDK,跨平台运行于 Windows/macOS/Linux。
|
|
|
|
用法:
|
|
from android_pyapi import Intent, Context, Uri, Bitmap, View
|
|
from android_pyapi.java.io import File, FileInputStream
|
|
from android_pyapi.java.util import ArrayList, HashMap
|
|
from android_pyapi.org.json import JSONObject, JSONArray
|
|
|
|
设计原则:
|
|
1. 方法名、参数名、返回类型完全对齐 Android SDK
|
|
2. 能桌面实现的 → 真实实现 (基于 PIL/sqlite3/socket 等)
|
|
3. 无法桌面实现的 → 返回合理默认值或抛出 AndroidOnlyError
|
|
4. 所有常量值与 Android SDK 一致
|
|
"""
|
|
|
|
from ._core import (
|
|
AndroidOnlyError,
|
|
Stub,
|
|
android_context,
|
|
get_context,
|
|
_sdcard_root,
|
|
_app_data_dir,
|
|
_package_name,
|
|
)
|
|
|
|
# android.* 包
|
|
from .android.app import *
|
|
from .android.content import *
|
|
from .android.content_pm import *
|
|
from .android.os import *
|
|
from .android.view import *
|
|
from .android.view_accessibility import *
|
|
from .android.view_animation import *
|
|
from .android.view_inputmethod import *
|
|
from .android.widget import *
|
|
from .android.graphics import *
|
|
from .android.graphics_drawable import *
|
|
from .android.graphics_pdf import *
|
|
from .android.net import *
|
|
from .android.net_wifi import *
|
|
from .android.media import *
|
|
from .android.hardware import *
|
|
from .android.hardware_camera2 import *
|
|
from .android.hardware_biometrics import *
|
|
from .android.location import *
|
|
from .android.database import *
|
|
from .android.database_sqlite import *
|
|
from .android.provider import *
|
|
from .android.telephony import *
|
|
from .android.bluetooth import *
|
|
from .android.bluetooth_le import *
|
|
from .android.text import *
|
|
from .android.util import *
|
|
from .android.preference import *
|
|
from .android.webkit import *
|
|
from .android.nfc import *
|
|
from .android.speech_tts import *
|
|
from .android.inputmethod import *
|
|
|
|
# java.* 包
|
|
from .java.io import *
|
|
from .java.net import *
|
|
from .java.util import *
|
|
from .java.util_regex import *
|
|
from .java.util_zip import *
|
|
from .java.util_concurrent import *
|
|
from .java.lang import *
|
|
from .java.math import *
|
|
from .java.text import *
|
|
from .java.time import *
|
|
from .java.nio import *
|
|
from .java.nio_file import *
|
|
from .java.security import *
|
|
from .java.crypto import *
|
|
|
|
# org.* 包
|
|
from .org.json import *
|
|
|
|
# Base64 (标准 Android API)
|
|
import base64 as _base64
|
|
|
|
class Base64:
|
|
DEFAULT = 0
|
|
NO_PADDING = 1
|
|
NO_WRAP = 2
|
|
CRLF = 4
|
|
URL_SAFE = 8
|
|
NO_CLOSE = 16
|
|
|
|
@staticmethod
|
|
def encodeToString(input_data, flags=0):
|
|
if isinstance(input_data, str):
|
|
input_data = input_data.encode('utf-8')
|
|
return _base64.b64encode(input_data).decode('ascii')
|
|
|
|
@staticmethod
|
|
def decode(str_val, flags=0):
|
|
return _base64.b64decode(str_val)
|
|
|
|
@staticmethod
|
|
def encode(input_data, flags=0):
|
|
if isinstance(input_data, str):
|
|
input_data = input_data.encode('utf-8')
|
|
return _base64.b64encode(input_data)
|
|
|
|
# Scanner (java.util)
|
|
class Scanner:
|
|
def __init__(self, source):
|
|
if isinstance(source, str):
|
|
self._source = source
|
|
else:
|
|
self._source = str(source)
|
|
self._pos = 0
|
|
|
|
def next(self):
|
|
while self._pos < len(self._source) and self._source[self._pos].isspace():
|
|
self._pos += 1
|
|
start = self._pos
|
|
while self._pos < len(self._source) and not self._source[self._pos].isspace():
|
|
self._pos += 1
|
|
if start == self._pos:
|
|
raise Exception("NoSuchElementException")
|
|
return self._source[start:self._pos]
|
|
|
|
def hasNext(self):
|
|
pos = self._pos
|
|
while pos < len(self._source) and self._source[pos].isspace():
|
|
pos += 1
|
|
return pos < len(self._source)
|
|
|
|
def nextInt(self):
|
|
return int(self.next())
|
|
|
|
def close(self):
|
|
pass
|
|
|
|
# Timer (java.util)
|
|
class Timer:
|
|
def __init__(self, name=None, daemon=False):
|
|
import threading
|
|
self._thread = None
|
|
self._tasks = []
|
|
|
|
def schedule(self, task, delay=None, period=None):
|
|
import threading
|
|
if delay is None:
|
|
self._run_once(task)
|
|
elif period is None:
|
|
self._run_delayed(task, delay)
|
|
else:
|
|
self._run_periodic(task, delay, period)
|
|
|
|
def _run_once(self, task):
|
|
t = threading.Thread(target=task.run)
|
|
t.daemon = True
|
|
self._tasks.append(t)
|
|
t.start()
|
|
|
|
def _run_delayed(self, task, delay_ms):
|
|
import threading
|
|
def _run():
|
|
import time
|
|
time.sleep(delay_ms / 1000.0)
|
|
task.run()
|
|
t = threading.Thread(target=_run)
|
|
t.daemon = True
|
|
self._tasks.append(t)
|
|
t.start()
|
|
|
|
def _run_periodic(self, task, delay_ms, period_ms):
|
|
import threading
|
|
def _run():
|
|
import time
|
|
time.sleep(delay_ms / 1000.0)
|
|
while True:
|
|
task.run()
|
|
time.sleep(period_ms / 1000.0)
|
|
t = threading.Thread(target=_run)
|
|
t.daemon = True
|
|
self._tasks.append(t)
|
|
t.start()
|
|
|
|
def cancel(self):
|
|
pass
|
|
|
|
def purge(self):
|
|
return 0
|
|
|
|
|
|
class TimerTask:
|
|
def __init__(self):
|
|
self._cancelled = False
|
|
|
|
def run(self):
|
|
pass
|
|
|
|
def cancel(self):
|
|
self._cancelled = True
|
|
|
|
def scheduledExecutionTime(self):
|
|
return 0
|
|
|
|
__version__ = "1.0.0"
|
|
__all__ = [
|
|
# android
|
|
"Intent", "Context", "Uri", "ContentValues", "ContentResolver",
|
|
"BroadcastReceiver", "IntentFilter", "SharedPreferences",
|
|
"PackageManager", "PackageInfo", "ActivityManager",
|
|
"Build", "Environment", "PowerManager", "BatteryManager",
|
|
"Bundle", "Handler", "Looper", "Message",
|
|
"View", "ViewGroup", "TextView", "EditText", "Button",
|
|
"ImageView", "ScrollView", "ListView", "Spinner",
|
|
"CheckBox", "Switch", "ProgressBar", "Toast",
|
|
"Bitmap", "BitmapFactory", "Canvas", "Color", "Paint",
|
|
"Rect", "RectF", "Matrix", "Typeface",
|
|
"PdfRenderer", "Drawable", "BitmapDrawable",
|
|
"ConnectivityManager", "NetworkInfo", "WifiManager",
|
|
"MediaPlayer", "AudioManager", "MediaRecorder",
|
|
"SensorManager", "CameraManager", "BiometricPrompt",
|
|
"LocationManager", "Location", "Geocoder",
|
|
"SQLiteDatabase", "SQLiteOpenHelper", "Cursor",
|
|
"Settings", "MediaStore", "ContactsContract", "CalendarContract",
|
|
"TelephonyManager", "SmsManager",
|
|
"BluetoothAdapter", "BluetoothDevice",
|
|
"TextUtils", "Html", "SpannableString",
|
|
"Log", "Base64", "TypedValue",
|
|
"AccessibilityNodeInfo", "AccessibilityService",
|
|
"Animation", "AlphaAnimation", "TranslateAnimation",
|
|
"InputMethodManager",
|
|
"WebView",
|
|
"TextToSpeech",
|
|
# java
|
|
"File", "FileInputStream", "FileOutputStream",
|
|
"BufferedReader", "BufferedWriter",
|
|
"InputStreamReader", "OutputStreamWriter",
|
|
"URL", "HttpURLConnection", "Socket", "ServerSocket",
|
|
"ArrayList", "HashMap", "HashSet", "LinkedList",
|
|
"Collections", "Arrays", "Calendar", "Date", "Random",
|
|
"UUID", "Scanner", "Timer", "TimerTask",
|
|
"Pattern", "Matcher",
|
|
"ZipFile", "GZIPInputStream", "GZIPOutputStream",
|
|
"ExecutorService", "Executors", "Future", "Callable",
|
|
"String", "StringBuilder", "StringBuffer",
|
|
"Integer", "Math", "System", "Thread",
|
|
"BigInteger", "BigDecimal",
|
|
"SimpleDateFormat", "DecimalFormat",
|
|
"LocalDateTime", "LocalDate", "LocalTime", "Instant", "Duration", "Period",
|
|
"ChronoUnit", "ChronoField", "DayOfWeek", "Month", "ZoneId", "ZoneOffset",
|
|
"DateTimeFormatter",
|
|
"ByteBuffer", "Files", "Path", "Paths",
|
|
"MessageDigest", "SecureRandom",
|
|
"Cipher", "Mac", "KeyGenerator",
|
|
# org
|
|
"JSONObject", "JSONArray", "JSONException",
|
|
]
|