Создание приложения администратора устройства с помощью delphi - java.lang.IllegalArgumentException: невозможно найти собственную библиотеку: main - PullRequest
0 голосов
/ 23 сентября 2019

Я новичок в разработке для Android и пытаюсь создать приложение KIOSK для Android с Delphi Tokyo 10.2.

Это то, что я пытаюсь сделать: в приложении будет две кнопки: одна для открытия приложения и другая для закрытия приложения после ввода пароля.Это приложение не должно позволять пользователю открывать любые другие приложения.

Что я сделал: я могу создать приложение, которое может быть указано в разделе «Безопасность»> «Администраторы устройства» в Android.Но приложение вылетает, когда я его открываю

Я понимаю, что для внесения в белый список необходимого приложения необходимо получить доступ к devicepolicymanager, а для этого приложение должно быть deviceadmin, а для приложения - администратором устройства,В манифесте должно быть указано разрешение MANAGE_DEVICE_ADMINS.Также класс, унаследованный от DeviceAdminReceiver (в Android SDK), должен быть зарегистрирован получателем в этом приложении.

Я использовал следующее, чтобы получить Delphi эквивалентные классы для DeviceAdminReceiver.

java2op -classes android.app.admin.DeviceAdminReceiver -unit untDeviceAdminReceiver

manifest:

<?xml version="1.0" encoding="utf-8"?>
<!-- BEGIN_INCLUDE(manifest) -->
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="com.embarcadero.DeviceAdmin01"
        android:versionCode="1"
        android:versionName="1.0.0"
        android:installLocation="auto">

    <!-- This is the platform API where NativeActivity was introduced. -->
    <uses-sdk android:minSdkVersion="14" android:targetSdkVersion="14" />
    <uses-permission android:name="android.permission.MANAGE_DEVICE_ADMINS" />
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <uses-permission android:name="android.permission.CALL_PHONE" />
    <uses-permission android:name="android.permission.CAMERA" />
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.READ_CALENDAR" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.READ_PHONE_STATE" />
    <uses-permission android:name="android.permission.WRITE_CALENDAR" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

    <uses-feature android:glEsVersion="0x00020000" android:required="True"/>
    <application android:persistent="False" 
        android:restoreAnyVersion="False" 
        android:label="DeviceAdmin01" 
        android:debuggable="True" 
        android:largeHeap="False"
        android:icon="@drawable/ic_launcher"
        android:theme="@style/AppTheme"
        android:hardwareAccelerated="true">



        <!-- 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">
            <!-- Tell NativeActivity the name of our .so -->
            <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.FMXNativeActivity"                 
                  android:label="DeviceAdmin01"
                  android:permission="android.permission.BIND_DEVICE_ADMIN">
            <meta-data
                  android:name="android.app.device_admin"
                  android:resource="@xml/device_admin"/>
            <intent-filter>
                <action android:name="android.app.action.DEVICE_ADMIN_ENABLED"/>
            </intent-filter>
        </receiver>

    </application>
</manifest>
<!-- END_INCLUDE(manifest) -->

Ниже приведен полный код моего от.Это не закодировано, чтобы сделать что-нибудь.Я пытаюсь просто запустить его как первый шаг к созданию приложения для киоска.

unit untMain;

interface

uses
  System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
  FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, untDeviceAdminReceiver,
  Androidapi.JNI.Embarcadero, Androidapi.JNIBridge, Androidapi.JNI.GraphicsContentViewText,
  AndroidAPI.Helpers, FMX.Controls.Presentation, FMX.StdCtrls;

type
  TMyReceiver = class (TJDeviceAdminReceiver)
  public
    constructor Create;
    procedure onEnabled(context: JContext; intent: JIntent); cdecl;
    procedure onDisabled(context: JContext; intent: JIntent); cdecl;

  end;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
  private
    { Private-Deklarationen }
    FMyListener : TMyReceiver;
    FDeviceAdminReceiver : JDeviceAdminReceiver;
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.fmx}

{ TMyReceiver }

constructor TMyReceiver.Create;
begin
 try
 inherited create;
  Except on E : Exception do
  begin

  end;

  end;
end;

procedure TMyReceiver.onDisabled(context: JContext; intent: JIntent);
begin
  try

  Except on E : Exception do
  begin

  end;

  end;
end;

procedure TMyReceiver.onEnabled(context: JContext; intent: JIntent);
begin
  try

  Except on E : Exception do
  begin

  end;

  end;
end;

procedure TForm1.FormCreate(Sender: TObject);
var
  Filter: JIntentFilter;
begin
  try



  FMyListener := TMyReceiver.Create;
  FDeviceAdminReceiver := TJDeviceAdminReceiver.JavaClass.init;

  TAndroidHelper.Context.getApplicationContext.registerReceiver(FDeviceAdminReceiver, Filter);
  Except on E : Exception do
  begin
    showMessage(E.Message);
  end;

  end;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  try
  TAndroidHelper.Context.getApplicationContext.unregisterReceiver(FDeviceAdminReceiver);
  Except on E : Exception do
  begin
    showMessage(E.Message);
  end;

  end;
end;

end.

Когда я запускаю это приложение, оно не открывается, показывая: «К сожалению, DevicdAdmin01 остановлен.»

Ниже приведены журналы, связанные с этим приложением, из отчета об ошибках.

09-18 00:33:27.234 24211 24211 E AndroidRuntime: FATAL EXCEPTION: main
09-18 00:33:27.234 24211 24211 E AndroidRuntime: Process: com.embarcadero.DeviceAdmin01, PID: 24211
09-18 00:33:27.234 24211 24211 E AndroidRuntime: java.lang.RuntimeException: Unable to start activity ComponentInfo{com.embarcadero.DeviceAdmin01/com.embarcadero.firemonkey.FMXNativeActivity}: java.lang.IllegalArgumentException: Unable to find native library: main
09-18 00:33:27.234 24211 24211 E AndroidRuntime: at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2339)
09-18 00:33:27.234 24211 24211 E AndroidRuntime: at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2413)
09-18 00:33:27.234 24211 24211 E AndroidRuntime: at android.app.ActivityThread.access$800(ActivityThread.java:155)
09-18 00:33:27.234 24211 24211 E AndroidRuntime: at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1317)
09-18 00:33:27.234 24211 24211 E AndroidRuntime: at android.os.Handler.dispatchMessage(Handler.java:102)
09-18 00:33:27.234 24211 24211 E AndroidRuntime: at android.os.Looper.loop(Looper.java:135)
09-18 00:33:27.234 24211 24211 E AndroidRuntime: at android.app.ActivityThread.main(ActivityThread.java:5343)
09-18 00:33:27.234 24211 24211 E AndroidRuntime: at java.lang.reflect.Method.invoke(Native Method)
09-18 00:33:27.234 24211 24211 E AndroidRuntime: at java.lang.reflect.Method.invoke(Method.java:372)
09-18 00:33:27.234 24211 24211 E AndroidRuntime: at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:905)
09-18 00:33:27.234 24211 24211 E AndroidRuntime: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:700)
09-18 00:33:27.234 24211 24211 E AndroidRuntime: Caused by: java.lang.IllegalArgumentException: Unable to find native library: main
09-18 00:33:27.234 24211 24211 E AndroidRuntime: at android.app.NativeActivity.onCreate(NativeActivity.java:170)
09-18 00:33:27.234 24211 24211 E AndroidRuntime: at com.embarcadero.firemonkey.FMXNativeActivity.onCreate(FMXNativeActivity.java:139)
09-18 00:33:27.234 24211 24211 E AndroidRuntime: at android.app.Activity.performCreate(Activity.java:6010)
09-18 00:33:27.234 24211 24211 E AndroidRuntime: at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1129)
09-18 00:33:27.234 24211 24211 E AndroidRuntime: at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2292)
09-18 00:33:27.234 24211 24211 E AndroidRuntime: ... 10 more
09-18 00:33:27.238   861   876 W ActivityManager:   Force finishing activity 1 com.embarcadero.DeviceAdmin01/com.embarcadero.firemonkey.FMXNativeActivity

Что здесь могло пойти не так?

Я буду очень признателен за вашу помощь, чтобы исправить это ..

1 Ответ

0 голосов
/ 24 сентября 2019

Невозможно найти собственную библиотеку: основная ошибка произошла из-за отсутствия информации в файле манифеста.Код для регистрации adminReceiver неправильный, но приложение открывается как минимум.

Ниже приведен новый файл манифеста, в котором решена проблема «Не удается найти собственную библиотеку: основная»:

<?xml version="1.0" encoding="utf-8"?>
<!-- BEGIN_INCLUDE(manifest) -->
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="com.embarcadero.DevAdm02"
        android:versionCode="1"
        android:versionName="1.0.0"
        android:installLocation="auto">

    <!-- This is the platform API where NativeActivity was introduced. -->
    <uses-sdk android:minSdkVersion="14" android:targetSdkVersion="14" />
    <uses-permission android:name="android.permission.MANAGE_DEVICE_ADMINS" />
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <uses-permission android:name="android.permission.CALL_PHONE" />
    <uses-permission android:name="android.permission.CAMERA" />
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.READ_CALENDAR" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.READ_PHONE_STATE" />
    <uses-permission android:name="android.permission.WRITE_CALENDAR" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

    <uses-feature android:glEsVersion="0x00020000" android:required="True"/>
    <application android:persistent="False" 
        android:restoreAnyVersion="False" 
        android:label="DevAdm02" 
        android:debuggable="True" 
        android:largeHeap="False"
        android:icon="@drawable/ic_launcher"
        android:theme="@style/AppTheme"
        android:hardwareAccelerated="true">



        <!-- 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="DevAdm02"
                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="DevAdm02" />
            <intent-filter>  
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter> 
        </activity>

        <receiver android:name="com.embarcadero.rtl.notifications.NotificationAlarm" />



        <receiver android:name="com.embarcadero.firemonkey.FMXNativeActivity"                 
                  android:label="DevAdm02"
                  android:permission="android.permission.BIND_DEVICE_ADMIN">
            <meta-data
                  android:name="android.app.device_admin"
                  android:resource="@xml/device_admin"/>
            <intent-filter>
                <action android:name="android.app.action.DEVICE_ADMIN_ENABLED"/>
            </intent-filter>
        </receiver>



    </application>
</manifest>
<!-- END_INCLUDE(manifest) -->

Далее я должен выяснить, как зарегистрировать объект класса DeviceAdminReceiver.Я отправляю это как ответ, потому что это решило непосредственную проблему, которая была java.lang.IllegalArgumentException: Невозможно найти собственную библиотеку: main

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...