Delphi 10.3.3,Android应用程序启动时自动启动(Android 8.x,10.x)

Delphi 10.3.3,Android应用程序启动时自动启动(Android 8.x,10.x),android,delphi,Android,Delphi,我创建了一个包含以下内容的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 {

我创建了一个包含以下内容的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);
        }
     
}
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);  
        }

}
@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
我已经根据以下内容创建了一个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"
<?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) -->
我的AndroidManifest.template如下所示:

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"
<?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) -->
我显然错过了什么,但是什么

谢谢你的帮助

问候 罗伯特

更新4

我删除了以前的更新,因为我有点不舒服。这就是我需要正确创建文件的方式

生成类文件

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)EXEC错误。

步骤1:

在应用程序目录中创建src\com\XLR文件夹

这里创建了包含以下内容的文件BootReceiver.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);
        }
     
}
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);  
        }

}
@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
第二步:

在应用程序目录下创建build.bat,其中包含以下内容:

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);
        }
     
}
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);  
        }

}
@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
第三步:

现在运行build.bat,它将在应用程序目录的输出目录中创建类和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) -->

第五步:

将output\jar\XLRBoot.jar文件添加到Delphi中的库中并运行程序

第6步:

运行程序启动后,停止并重新启动。现在重新启动它将启动。关闭设备,然后再次打开,设备将启动

多谢各位

ANDROID 10的特别注意事项:


您必须在Delphi中设置权限系统警报窗口。在手机上的App Info->Advanced下,通过其他应用程序设置启用显示。

是否将jar文件添加到项目管理器中项目的libraries部分?是,它被添加到目标平台->Android 32位->库->com-embarcadero-XLRBoot.jar接收器的类名是
com.embarcadero.XLRBoot.startup
,而不是
com.embarcadero.XLRBoot
。您需要在manifestChanged中修复这个问题,我想我可能在JAVA到JAR文件生成方面出了问题。您已经在这里更改了清单以正确匹配接收方类名,我生成jar文件的方式也不正确。