[英]How to install additional Android SDK into Delphi 10.X or Delphi 11.X?
[英]Delphi 10.3.3 , Android App AutoStart on Boot ( Android 8.x , 10.x )
我創建了一個 java 文件,其內容如下:
package com.embarcadero.XLRBoot;
import android.app.Activity;
import android.content.BroadcastReceiver;
import android.content.Intent;
import android.content.Context;
public class startup extends BroadcastReceiver
{
@Override
public void onReceive(Context context, Intent intent)
{
Intent sintent = new Intent();
sintent.setClassName(context, "com.embarcadero.firemonkey.FMXNativeActivity");
sintent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(sintent);
}
}
我創建了一個 JAR 文件,如下所示:
C:\Program Files (x86)\Java\jdk1.7.0_71\bin>jar cf com-embarcadero-XLRBoot.jar "d:\Delphi XE 10\XLR Spider\Boot Receiver\com-embarcadero-XLRBoot.java"
我的 AndroidManifest.template 看起來像這樣:
<?xml version="1.0" encoding="utf-8"?>
<!-- BEGIN_INCLUDE(manifest) -->
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="%package%"
android:versionCode="%versionCode%"
android:versionName="%versionName%"
android:installLocation="%installLocation%">
<uses-sdk android:minSdkVersion="%minSdkVersion%" android:targetSdkVersion="%targetSdkVersion%" />
<%uses-permission%>
<uses-feature android:glEsVersion="0x00020000" android:required="True"/>
<application android:persistent="%persistent%"
android:restoreAnyVersion="%restoreAnyVersion%"
android:label="%label%"
android:debuggable="%debuggable%"
android:largeHeap="%largeHeap%"
android:icon="%icon%"
android:theme="%theme%"
android:hardwareAccelerated="%hardwareAccelerated%"
android:resizeableActivity="false">
<%provider%>
<%application-meta-data%>
<%uses-libraries%>
<%services%>
<!-- Our activity is a subclass of the built-in NativeActivity framework class.
This will take care of integrating with our NDK code. -->
<activity android:name="com.embarcadero.firemonkey.FMXNativeActivity"
android:label="%activityLabel%"
android:configChanges="orientation|keyboard|keyboardHidden|screenSize"
android:launchMode="singleTask">
<!-- Tell NativeActivity the name of our .so -->
<meta-data android:name="android.app.lib_name"
android:value="%libNameValue%" />
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<receiver android:name="com.embarcadero.firemonkey.notifications.FMXNotificationAlarm" />
<receiver android:name="com.embarcadero.XLRBoot"
android:permission="android.permission.RECEIVE_BOOT_COMPLETED">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</receiver>
<!-- Registration is complete -->
<%activity%>
<%receivers%>
</application>
</manifest>
<!-- END_INCLUDE(manifest) -->
我在 Delphi 中設置了以下權限:[x] 接收啟動已完成 [x] 重新排序任務
我編譯我的應用程序,運行它,停止它,重新啟動設備。 我收到一個錯誤,它停止了。
在日志中,我看到以下條目:
04-20 12:38:49.087 2769 2769 E AndroidRuntime: FATAL EXCEPTION: main
04-20 12:38:49.087 2769 2769 E AndroidRuntime: Process: com.embarcadero.XLRBoot, PID: 2769
04-20 12:38:49.087 2769 2769 E AndroidRuntime: java.lang.RuntimeException: Unable to instantiate receiver com.embarcadero.XLRBoot: java.lang.ClassNotFoundException: Didn't find class "com.embarcadero.XLRBoot" on path: DexPathList[[zip file "/data/app/com.embarcadero.XLRBoot-OHpYv4loPMPls2q6DuLOLA==/base.apk"],nativeLibraryDirectories=[/data/app/com.embarcadero.XLRBoot-OHpYv4loPMPls2q6DuLOLA==/lib/arm, /data/app/com.embarcadero.XLRBoot-OHpYv4loPMPls2q6DuLOLA==/base.apk!/lib/armeabi-v7a, /system/lib, /system/vendor/lib, /system/vendor/lib/hw]]
04-20 12:38:49.087 2769 2769 E AndroidRuntime: at android.app.ActivityThread.handleReceiver(ActivityThread.java:3174)
04-20 12:38:49.087 2769 2769 E AndroidRuntime: at android.app.ActivityThread.-wrap17(Unknown Source:0)
04-20 12:38:49.087 2769 2769 E AndroidRuntime: at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1675)
04-20 12:38:49.087 2769 2769 E AndroidRuntime: at android.os.Handler.dispatchMessage(Handler.java:106)
04-20 12:38:49.087 2769 2769 E AndroidRuntime: at android.os.Looper.loop(Looper.java:164)
04-20 12:38:49.087 2769 2769 E AndroidRuntime: at android.app.ActivityThread.main(ActivityThread.java:6518)
04-20 12:38:49.087 2769 2769 E AndroidRuntime: at java.lang.reflect.Method.invoke(Native Method)
04-20 12:38:49.087 2769 2769 E AndroidRuntime: at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)
04-20 12:38:49.087 2769 2769 E AndroidRuntime: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)
04-20 12:38:49.087 2769 2769 E AndroidRuntime: Caused by: java.lang.ClassNotFoundException: Didn't find class "com.embarcadero.XLRBoot" on path: DexPathList[[zip file "/data/app/com.embarcadero.XLRBoot-OHpYv4loPMPls2q6DuLOLA==/base.apk"],nativeLibraryDirectories=[/data/app/com.embarcadero.XLRBoot-OHpYv4loPMPls2q6DuLOLA==/lib/arm, /data/app/com.embarcadero.XLRBoot-OHpYv4loPMPls2q6DuLOLA==/base.apk!/lib/armeabi-v7a, /system/lib, /system/vendor/lib, /system/vendor/lib/hw]]
04-20 12:38:49.087 2769 2769 E AndroidRuntime: at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:125)
04-20 12:38:49.087 2769 2769 E AndroidRuntime: at java.lang.ClassLoader.loadClass(ClassLoader.java:379)
04-20 12:38:49.087 2769 2769 E AndroidRuntime: at java.lang.ClassLoader.loadClass(ClassLoader.java:312)
04-20 12:38:49.087 2769 2769 E AndroidRuntime: at android.app.ActivityThread.handleReceiver(ActivityThread.java:3169)
04-20 12:38:49.087 2769 2769 E AndroidRuntime: ... 8 more
我顯然錯過了一些東西,但是什么?
感謝您的幫助。
問候羅伯特
更新 4
我刪除了以前的更新,因為我有點偏離。 所以這就是我需要正確創建文件的方式。
生成 Class 文件
javac -Xlint:all -classpath "c:\Users\Public\Documents\Embarcadero\Studio\20.0\PlatformSDKs\android-sdk-windows\platforms\android-26\android.jar" "d:\Delphi XE 10\XLR Spider\Boot Receiver\0.2\startup\com\embarcadero\XLRBoot\startup.java" -d "d:\Delphi XE 10\XLR Spider\Boot Receiver\0.2\startup"
生成 JAR 文件:
jar cf "d:\Delphi XE 10\XLR Spider\Boot Receiver\0.2\startup\com\embarcadero\XLRBoot\startup.jar" -C "d:\Delphi XE 10\XLR Spider\Boot Receiver\0.2\startup\com\embarcadero\XLRBoot" startup.class
Delphi 給出 EXEC(1) 執行錯誤。
步驟1:
在您的 App Directory 中創建 src\com\XLR 文件夾
在那里創建具有以下內容的文件 BootReceiver.java:
package com.XLR;
import android.app.Activity;
import android.content.BroadcastReceiver;
import android.content.Intent;
import android.content.Context;
public class BootReceiver extends BroadcastReceiver
{
@Override
public void onReceive(Context context, Intent intent)
{
Intent launchintent = new Intent();
launchintent.setClassName(context, "com.embarcadero.firemonkey.FMXNativeActivity");
launchintent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(launchintent);
}
}
第2步:
在您的 App Directory 下創建 build.bat 並包含以下內容:
@echo off
echo.
echo Compiles your Java code into classes.dex
echo Verified to work in Delphi 10.3.3
echo.
echo Place this batch in a java folder below your project (project\java)
echo Place the source in project\java\src\com\dannywind\delphi
echo If your source file location or name is different, please modify it below.
echo.
setlocal
set ANDROID_JAR="C:\Users\Public\Documents\Embarcadero\Studio\20.0\PlatformSDKs\android-sdk-windows\platforms\android-26\android.jar"
set DX_LIB="C:\Users\Public\Documents\Embarcadero\Studio\20.0\PlatformSDKs\android-sdk-windows\build-tools\28.0.2\lib"
set EMBO_DEX="D:\PRG\20.0\lib\android\debug\classes.dex"
set PROJ_DIR=%CD%
set VERBOSE=0
set JAVASDK="C:\Program Files (x86)\Java\jdk1.7.0_71\bin"
set DX_BAT="C:\Users\Public\Documents\Embarcadero\Studio\20.0\PlatformSDKs\android-sdk-windows\build-tools\28.0.2\dx.bat"
echo.
echo Compiling the Java source files
echo.
pause
mkdir output 2> nul
mkdir output\classes 2> nul
if x%VERBOSE% == x1 SET VERBOSE_FLAG=-verbose
%JAVASDK%\javac %VERBOSE_FLAG% -Xlint:all -classpath %ANDROID_JAR% -d output\classes -source 1.6 -target 1.6 src\com\XLR\BootReceiver.java
echo.
echo Creating jar containing the new classes
echo.
pause
mkdir output\jar 2> nul
if x%VERBOSE% == x1 SET VERBOSE_FLAG=v
%JAVASDK%\jar c%VERBOSE_FLAG%f output\jar\XLRBoot.jar -C output\classes com
:Exit
endlocal
第 3 步:
現在運行 build.bat,它將在您的應用程序目錄的 Output 目錄中創建 class 和 jar 文件。
第4步:
像這樣更改您的 AndroidManifest.template
<?xml version="1.0" encoding="utf-8"?>
<!-- BEGIN_INCLUDE(manifest) -->
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="%package%"
android:versionCode="%versionCode%"
android:versionName="%versionName%"
android:installLocation="%installLocation%">
<uses-sdk android:minSdkVersion="%minSdkVersion%" android:targetSdkVersion="%targetSdkVersion%" />
<%uses-permission%>
<uses-feature android:glEsVersion="0x00020000" android:required="True"/>
<application android:persistent="%persistent%"
android:restoreAnyVersion="%restoreAnyVersion%"
android:label="%label%"
android:debuggable="%debuggable%"
android:largeHeap="%largeHeap%"
android:icon="%icon%"
android:theme="%theme%"
android:hardwareAccelerated="%hardwareAccelerated%"
android:resizeableActivity="false">
<%provider%>
<%application-meta-data%>
<%uses-libraries%>
<%services%>
<!-- Our activity is a subclass of the built-in NativeActivity framework class.
This will take care of integrating with our NDK code. -->
<activity android:name="com.embarcadero.firemonkey.FMXNativeActivity"
android:label="%activityLabel%"
android:configChanges="orientation|keyboard|keyboardHidden|screenSize"
android:launchMode="singleTask">
<!-- Tell NativeActivity the name of our .so -->
<meta-data android:name="android.app.lib_name"
android:value="%libNameValue%" />
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<receiver android:name="com.embarcadero.firemonkey.notifications.FMXNotificationAlarm" />
<receiver android:name="com.XLR.BootReceiver"
android:permission="android.permission.RECEIVE_BOOT_COMPLETED">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</receiver>
<!-- Registration is complete -->
<%activity%>
<%receivers%>
</application>
</manifest>
<!-- END_INCLUDE(manifest) -->
第 5 步:
將 output\jar\XLRBoot.jar 文件添加到 Delphi 內的庫中並運行程序。
第 6 步:
運行程序啟動后,停止它再次啟動它。 現在重新啟動它將啟動。 關閉設備並再次打開,它將啟動。
謝謝你。
ANDROID 10 的特別說明:
您必須在 Delphi 中設置權限系統警報 window。 在手機上的 App Info -> Advanced 下啟用 Display over other apps 設置。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.