feat: Android-pyApi v1.0 - 全面翻译 Android SDK API 为 Python
52 个模块覆盖 Android + Java + org.json 标准库
This commit is contained in:
commit
bfe27fdc08
104 files changed
+58750
No files matched your search
@@ -0,0 +1,258 @@
|
||||
"""
|
||||
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",
|
||||
]
|
||||
Reference in new issue
Block a user