Перейти к содержанию
Fire Monkey от А до Я
  • 0

Android 10 и муз.плеер


Ingalime

Вопрос

Здравствуйте. Есть приложение музыкального плеера со службой переднего фона, которая позволяет проигрывать музыку даже если приложение свернуто. Без этой службы андроид убивает приложение через пару минут если оно свернуто. Приложение работает на андроид 7.1, 8.1 и 9. Других устройств для тестирования нет. На андроид 10 приложение при старте сразу падает. Возникла мысль, что андроид 10 не может запустить службу переднего плана. Код:

procedure TForm1.FormCreate(Sender: TObject);
Begin
//Библиотека BASS для аудио http://www.un4seen.com/
 if not BASS_Init(-1, 44100, 0, nil, nil) Then Begin
	   ShowMessage('Failed to initialize audio!' + sLineBreak + 'Не удалось инициализировать audio!');
     Exit;
     end;

 try
     if FService = Nil Then Begin
      FService := TLocalServiceConnection.Create;
      FService.StartService('serPublic');
      end;
  except
       Exit;
  end;

Пользователь форума Tumaso, предложил код как отменить запуск службы для андроид 10. Лучше уж пусть приложение играет на переднем плане, чем просто падает при старте.

uses
    ... Androidapi.JNI.Os, Androidapi.JNIBridge ...
//изменения при страте в FormCreate
  if TJBuild_VERSION.JavaClass.SDK_INT <= 28 then
  begin
    try
      if not Assigned(FService) then
      begin
        FService := TLocalServiceConnection.Create;
        FService.StartService('serPublic');
      end;
    except
      // что нибудь делаем
    end;  
  end;

Но возникает еще вопрос, а может для андроид 10 надо запросить какие-то дополнительные разрешения или что-то добавить в манифест? Сейчас из разрешений в опциях проекта стоит Foreground service и Internet. Устройства с андроид 10 у меня нет. Ниже код службы, за который меня не ругайте, это солянка найденная в интернете и этот код прекрасно работает на андроид 7.1, 8.1 и 9.

unit Unit1;

interface

uses
  System.SysUtils,
  System.Classes,
  System.Android.Service,
  AndroidApi.JNI.GraphicsContentViewText,
  Androidapi.JNI.Os,
  Androidapi.JNI.App,
  Androidapi.JNI.Support,
  Androidapi.JNI.JavaTypes,
  Androidapi.Helpers,
  Androidapi.JNIBridge,
  Androidapi.Jni,
  System.Notification;

type
  TDM = class(TAndroidService)
    NotificationCenter1: TNotificationCenter;
    function AndroidServiceStartCommand(const Sender: TObject;
      const Intent: JIntent; Flags, StartId: Integer): Integer;

  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  DM: TDM;

implementation

{%CLASSGROUP 'FMX.Controls.TControl'}

{$R *.dfm}



function TDM.AndroidServiceStartCommand(const Sender: TObject;
  const Intent: JIntent; Flags, StartId: Integer): Integer;

var
  //Android 8.1, 9
  ServiceChannel: JNotificationChannel;
  NotificationManager: JNotificationManager;
  Obj: JObject;
  NewIntent: JIntent;
  ncb: JNotificationCompat_Builder;
  ntf: JNotification;
  PendingIntent: JPendingIntent;
  //Android 7.1
  service             : JService;
  serviceObjectId     : Pointer;
  ntf2                : JNotification;
  intent2             : JIntent;
  PendingIntent2      : JPendingIntent;

begin

   Result := TJService.JavaClass.START_NOT_STICKY;

   // can't ref .O on earlier phones, must hardcode
  if TJBuild_VERSION.JavaClass.SDK_INT > 26 then // JBuild_VERSION_CODES.JavaClass.O
  begin
     //Android 8.1
     //new ways for SDK > 26 (won't be called when API < 26 anyways)
     try

      ServiceChannel := TJNotificationChannel.JavaClass.init(
      StringtoJString('com.radio.one'), //CHANNEL_ID
      StrToJCharSequence('Public radio Channel'),
      TJNotificationManager.JavaClass.IMPORTANCE_DEFAULT
    );

    Obj := TAndroidHelper.Context.getSystemService(
    TJContext.JavaClass.NOTIFICATION_SERVICE);
    NotificationManager := TJNotificationManager.Wrap(Obj);
    NotificationManager.createNotificationChannel(ServiceChannel);

    NewIntent:= TAndroidHelper.Context.getPackageManager().getLaunchIntentForPackage(
      TAndroidHelper.Context.getPackageName());
    NewIntent.setAction(TJIntent.JavaClass.ACTION_MAIN);
    NewIntent.addCategory(TJIntent.JavaClass.CATEGORY_LAUNCHER);
    NewIntent.addFlags(TJIntent.JavaClass.FLAG_ACTIVITY_NEW_TASK);

    PendingIntent := TJPendingIntent.JavaClass.getActivity(
      TAndroidHelper.Context, 0, NewIntent,
      TJIntent.JavaClass.FLAG_ACTIVITY_NEW_TASK
    );

    ncb := TJNotificationCompat_Builder.JavaClass.init(
      TAndroidHelper.Context,
      StringToJString('com.radio.one')
    );

   ncb.setContentTitle(StrToJCharSequence('PublicRadio Service'));
   // ncb.setTicker(StrToJCharSequence('MyCommsService')); // can't remember why this is commented out to be honest
   ncb.setSmallIcon(JavaService.getApplicationInfo.icon);
   ncb.setContentIntent(PendingIntent);
   ncb.setOngoing(True);
   ntf := ncb.build;
   JavaService.startForeground(StartId, ntf);
   except
       exit;
   end;

 end
 else
 begin
      //Android 7.1
     try
      serviceObjectId  := (JavaService as ILocalObject).GetObjectID;
      service          := TJService.Wrap(serviceObjectId);
      /////ntf2             := TJNotification.Create;
      ////ntf2.icon        := service.getApplicationInfo.icon;

    NewIntent:= TAndroidHelper.Context.getPackageManager().getLaunchIntentForPackage(
      TAndroidHelper.Context.getPackageName());
    NewIntent.setAction(TJIntent.JavaClass.ACTION_MAIN);
    NewIntent.addCategory(TJIntent.JavaClass.CATEGORY_LAUNCHER);
    NewIntent.addFlags(TJIntent.JavaClass.FLAG_ACTIVITY_NEW_TASK);

    PendingIntent2 := TJPendingIntent.JavaClass.getActivity(
      TAndroidHelper.Context, 0, NewIntent,
      TJIntent.JavaClass.FLAG_ACTIVITY_NEW_TASK
    );

      ncb := TJNotificationCompat_Builder.JavaClass.init(
      TAndroidHelper.Context,
      StringToJString('com.radio.one')
    );

      //intent2  := TJIntent.Create;
      //PendingIntent2 := TJPendingIntent.JavaClass.getActivity(service.getApplicationContext, 0, intent2, 0);

      ncb.setContentTitle(StrToJCharSequence('PublicRadio'));
      // ncb.setTicker(StrToJCharSequence('MyCommsService'));
      ncb.setSmallIcon(JavaService.getApplicationInfo.icon);
      ncb.setContentIntent(PendingIntent2);
      ncb.setOngoing(True);
      ntf2 := ncb.build;

      ntf2.setLatestEventInfo(service.getApplicationContext, StrToJCharSequence('PublicRadio'), StrToJCharSequence('PublicRadio Service'), PendingIntent2);
      service.startForeground(StartId, ntf2);
   except
       exit;
   end;

  end;

end;

end.

 

Ссылка на комментарий
  • Ответы 60
  • Создана
  • Последний ответ

Лучшие авторы в вопросе

Рекомендуемые сообщения

  • 0

foregroundServiceType должно быть цифра 2. Не пойму как правильно добавить Ваши рекомендации в манифестAndroidManifest.template.xml, подскажите.

AndroidManifest.template.xml

<?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"
        android:requestLegacyExternalStorage="true">

        <%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>
        <%activity%>
        <%receivers%>
    </application>
</manifest>
<!-- END_INCLUDE(manifest) -->

Сегодня сделано полный билд проекта и в файле AndroidManifest.xml появилось разрешение WAKE_LOCK, раньше его не было. Надо как-то убрать?

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

    <uses-sdk android:minSdkVersion="23" android:targetSdkVersion="29" />
    <uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.WAKE_LOCK" />
    <permission android:name="com.online.PublicRadio.permission.C2D_MESSAGE" android:protectionLevel="signature" />
    <uses-permission android:name="com.online.PublicRadio.permission.C2D_MESSAGE" />
    <uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />

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

        <provider
            android:name="com.embarcadero.firebase.provider.FirebaseInitProvider"
            android:authorities="com.online.PublicRadio.firebaseinitprovider"
            android:exported="false"
            android:initOrder="100">
        </provider>

        <meta-data android:name="com.google.firebase.messaging.default_notification_color" android:resource="@color/notification_accent_color" />
        <meta-data android:name="com.google.firebase.messaging.default_notification_icon" android:resource="@drawable/ic_notification" />

        
        <service android:exported="false" android:name="com.embarcadero.services.serPublic" />
<service android:exported="false" android:name="com.embarcadero.firebase.messaging.ProxyFirebaseMessagingService">
            <intent-filter>
                <action android:name="com.google.firebase.MESSAGING_EVENT" />
            </intent-filter>
        </service>

        <service android:exported="true" android:name="com.google.firebase.messaging.FirebaseMessagingService">
            <intent-filter android:priority="-500">
                <action android:name="com.google.firebase.MESSAGING_EVENT" />
            </intent-filter>
        </service>

        <service android:exported="false" android:name="com.google.firebase.components.ComponentDiscoveryService">
            <meta-data android:name="com.google.firebase.components:com.google.firebase.iid.Registrar" android:value="com.google.firebase.components.ComponentRegistrar" />
        </service>


        <!-- 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="PublicRadio"
                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="PublicRadio" />
            <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:exported="true" android:name="com.google.firebase.iid.FirebaseInstanceIdReceiver" android:permission="com.google.android.c2dm.permission.SEND">
            <intent-filter>
                <action android:name="com.google.android.c2dm.intent.RECEIVE" />
            </intent-filter>
        </receiver>

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

 

Ссылка на комментарий
  • 0

Добавляем в  раздел <%services%> файла AndroidManifest.template.xml строки:
<%services%>
        <service android:foregroundServiceType="mediaPlayback" />
        </service>
//****************************************************************

Получаем в файле AndroidManifest.xml:
 <service android:foregroundServiceType="mediaPlayback" />
        </service> //и тут ошибка строка №60 при попытки деплоя на телефон
//**************************************************************** 

[PAClient Error] Error: E2312 C:\Users\Lena\Documents\Embarcadero\Studio\Projects\delphi82\Android64\Release\PublicRadio\AndroidManifest.xml:60: error: Error parsing XML: mismatched tag

Ссылка на комментарий
  • 0
  • Модераторы

Есть два варианта:

1) Добавить в промежуточном манифесте (находится тут: Project\Android\Debug\AndroidManifest.xml)

Находим:

<service android:exported="false" android:name="com.embarcadero.services.serPublic" />

Заменяем на:

<service android:exported="false" android:foregroundServiceType="mediaPlayback" android:name="com.embarcadero.services.serPublic" />

Делаем деплой проекта.

 

2) Прописать сервис в шаблоне (находится тут: Project\AndroidManifest.template.xml)

Примерно вот так.

Находим:

<%services%>

Заменяем на:

	<service android:exported="false" android:foregroundServiceType="mediaPlayback" android:name="com.embarcadero.services.serPublic" />
	<service android:exported="false" android:name="com.embarcadero.firebase.messaging.ProxyFirebaseMessagingService">
		<intent-filter>
			<action android:name="com.google.firebase.MESSAGING_EVENT" />
		</intent-filter>
	</service>

	<service android:exported="true" android:name="com.google.firebase.messaging.FirebaseMessagingService">
		<intent-filter android:priority="-500">
			<action android:name="com.google.firebase.MESSAGING_EVENT" />
		</intent-filter>
	</service>

	<service android:exported="false" android:name="com.google.firebase.components.ComponentDiscoveryService">
		<meta-data android:name="com.google.firebase.components:com.google.firebase.iid.Registrar" android:value="com.google.firebase.components.ComponentRegistrar" />
	</service>

Делаем сборку и деплой.

 

p.s. Возможно есть ещё способы, я давненько не касался темы сервисов..

Ссылка на комментарий
  • 0

Cпасибо. Удалось если вставлять в AndroidManifest.template.xml иначе все время генерирует в AndroidManifest.xml строку:

<service android:exported="false" android:name="com.embarcadero.services.serPublic" />

Убрано также firebase. Сейчас так:

AndroidManifest.template.xml

<?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"
        android:requestLegacyExternalStorage="true">

        <%provider%>
        <%application-meta-data%>
        <%uses-libraries%>
        
        <service android:exported="false" android:foregroundServiceType="mediaPlayback" android:name="com.embarcadero.services.serPublic" />
        
        <!-- 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>
        <%activity%>
        <%receivers%>
    </application>
</manifest>
<!-- END_INCLUDE(manifest) -->

 

AndroidManifest.xml в папке \Android64\Release

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

    <uses-sdk android:minSdkVersion="23" android:targetSdkVersion="29" />
    <uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
    <uses-permission android:name="android.permission.INTERNET" />

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

        
        
        
        
        <service android:exported="false" android:foregroundServiceType="mediaPlayback" android:name="com.embarcadero.services.serPublic" />
        
        <!-- 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="PublicRadio"
                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="PublicRadio" />
            <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" />

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

 

На Андроид 8.1 работает.

 

Ссылка на комментарий
  • 0

Что-то забыла как правильно получить apk для магазина. Переключилась на Application Store далее Build All затем Deploy.

На выходе получаю файл .aab

Как получить .apk Где поставить галку в опциях проекта? Стоит false должен получиться apk, но не получается. Гугл у меня пока принимает apk без проблем.

http://docwiki.embarcadero.com/RADStudio/Sydney/en/Deploying_Your_Signed_Android_Application

 

apk.jpg

Изменено пользователем Ingalime
Ссылка на комментарий
  • 0
16 часов назад, Ingalime сказал:

Может у кого-то есть Адроид 10, посмотрите, пожалуйста, или падает при запуске. Спасибо.

PublicRadio.apk 18 \u041c\u0411 · 11 загрузок

Здравствуйте.

Ваше приложение на моём устройстве с OS Android 10 "падает".

С Уважением. Олег.

Ссылка на комментарий
  • 0
19 часов назад, Ingalime сказал:

Может у кого-то есть Адроид 10, посмотрите, пожалуйста, или падает при запуске. Спасибо.

PublicRadio.apk 18 \u041c\u0411 · 11 загрузок

Я попробовал запустить на Android 6.0.1, при старте падает после показа картинки. Однако я не знаю, какой минимальный sdk level у приложения, может оно и не должно запускаться на шестёрке. В любом случае, просто отписался.

19 часов назад, Ingalime сказал:
<uses-sdk android:minSdkVersion="23" android:targetSdkVersion="29" />

Хотя в манифесте написано, что minSdkVersion='23', что соответствует Андроид 6

Изменено пользователем PowerOwl
Ссылка на комментарий
  • 0

Протестировал на устройстве с Android 10(Nokia 3.1), всё прекрасно работает. Музыка работает, при сворачивании не падает, с выключенным экраном тоже.

 

Screenshot_20210706-123337[1].png

Изменено пользователем PowerOwl
Ссылка на комментарий
  • 0

Огромное всем спасибо, что нашли время для тестирования!❤️

И все же чувствуется, что надо что-то в манифесте добавить т.к. сказать укрепить его. :)

Вот пользователь Олег Киреев с Android 10, говорит что приложение падает.

И пользователь PowerOwl с Android 6.0.1 тоже.

Может надо разбить надпись в манифесте: 

<service android:exported="false" android:foregroundServiceType="mediaPlayback" android:name="com.embarcadero.services.serPublic" />

на две штуки:

<service  android:foregroundServiceType="mediaPlayback" />

<service android:exported="false" android:name="com.embarcadero.services.serPublic" />

или это бессмысленная манипуляция?

 

Ссылка на комментарий
  • 0
  • Модераторы

У меня на устройстве с Андроид 11 и эмуляторе с Андроид 7.1.2 приложение не падает.


По теме, делайте дебаг версию и ищите устройство на котором падает, запускайте monitor.bat и приложение, снимайте логи и выкидывайте их сюда. Это нужно сделать как минимум для того чтобы убедиться в ваших догадках (что происходит падение из-за сервиса). Так же попробуйте вынести в кнопку код запуска сервиса.

Документация по Foreground service: https://developer.android.com/guide/components/foreground-services

 

 

Ссылка на комментарий
  • 0
21 час назад, Ingalime сказал:

Может у кого-то есть Адроид 10, посмотрите, пожалуйста, или падает при запуске. Спасибо.

PublicRadio.apk 18 \u041c\u0411 · 13 загрузок

На всякий случай. У меня устройство Самсунг Галакси J6 с Андроид 10. После клика на иконку идёт запрос на разрешение. Я разрешаю а потом приложение само закрывается и OS сообщает что приложение загрузилось не корректно и предлагает его закрыть.

С Уважением. Олег.

Ссылка на комментарий
  • 0
Цитата

ищите устройство на котором падает

Пока под рукой только андроид 8.1 Redmi 5A :(

Цитата

так же попробуйте вынести в кнопку код запуска сервиса.

Теперь в кнопке Play в обновленном apk

procedure TForm1.FormCreate(Sender: TObject);
Begin

 if not BASS_Init(-1, 44100, 0, nil, nil) Then Begin
	   ShowMessage('Failed to initialize audio!' + sLineBreak + 'Не удалось инициализировать audio!');
     Exit;
     end;
End;

procedure TForm1.Button1Click(Sender: TObject);

var
  check :boolean;
  ercode: Integer;
  ermsg: string;

Begin

 try
     if FService = Nil Then Begin
      FService := TLocalServiceConnection.Create;
      FService.StartService('serPublic');
      end;
  except
       Exit;
  end;
//******************************************
Цитата

После клика на иконку идёт запрос на разрешение. 

В манифесте только это. Что ему надо не понятно...

<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
<uses-permission android:name="android.permission.INTERNET" />

 

PublicRadio.apk

Ссылка на комментарий
  • 0
16 минут назад, Ingalime сказал:

Пока под рукой только андроид 8.1 Redmi 5A :(

Теперь в кнопке Play в обновленном apk

procedure TForm1.FormCreate(Sender: TObject);
Begin

 if not BASS_Init(-1, 44100, 0, nil, nil) Then Begin
	   ShowMessage('Failed to initialize audio!' + sLineBreak + 'Не удалось инициализировать audio!');
     Exit;
     end;
End;

procedure TForm1.Button1Click(Sender: TObject);

var
  check :boolean;
  ercode: Integer;
  ermsg: string;

Begin

 try
     if FService = Nil Then Begin
      FService := TLocalServiceConnection.Create;
      FService.StartService('serPublic');
      end;
  except
       Exit;
  end;
//******************************************

В манифесте только это. Что ему надо не понятно...

<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
<uses-permission android:name="android.permission.INTERNET" />

 

PublicRadio.apk 18 \u041c\u0411 · 2 загрузки

На шестёрке все ещё падает.

Ссылка на комментарий
  • 0
Цитата

Ну так эмуляторы ведь есть.

Подскажите, пожалуйста, как запустить утилиту создания эмулятора. В предыдущих версиях это было в меню Пуск. В 10.4 там ее нет.

Ссылка на комментарий
  • 0
8 минут назад, Ingalime сказал:

Подскажите, пожалуйста, как запустить утилиту создания эмулятора. В предыдущих версиях это было в меню Пуск. В 10.4 там ее нет.

Честно, сам понятия не имею, где эмулятор в 10.4. Можно использовать эмуль от Android Studio, там можно и на куче версий андроида проверить(там вроде от 4.4 до 11), и проэмулировать разные устройства, и ещё кучу всяких настроек.

Вот ссылка на документацию абракадабры, там вроде всё расписано: https://www.embarcadero.com/starthere/xe7/mobdevsetup/android/en/creating_an_android_emulator.html

Хотя я у себя не нашёл эмулятора, может его вырезали в новых версиях RAD Studio.

Изменено пользователем PowerOwl
Ссылка на комментарий
  • 0
1 час назад, Ingalime сказал:

Пока под рукой только андроид 8.1 Redmi 5A :(

Теперь в кнопке Play в обновленном apk

procedure TForm1.FormCreate(Sender: TObject);
Begin

 if not BASS_Init(-1, 44100, 0, nil, nil) Then Begin
	   ShowMessage('Failed to initialize audio!' + sLineBreak + 'Не удалось инициализировать audio!');
     Exit;
     end;
End;

procedure TForm1.Button1Click(Sender: TObject);

var
  check :boolean;
  ercode: Integer;
  ermsg: string;

Begin

 try
     if FService = Nil Then Begin
      FService := TLocalServiceConnection.Create;
      FService.StartService('serPublic');
      end;
  except
       Exit;
  end;
//******************************************

В манифесте только это. Что ему надо не понятно...

<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
<uses-permission android:name="android.permission.INTERNET" />

 

PublicRadio.apk 18 \u041c\u0411 · 2 загрузки

И в этой новой версии OS сообщает "В приложении произошёл сбой".

С Уважением. Олег.

Ссылка на комментарий
  • 0
1 час назад, Олег Киреев сказал:

И в этой новой версии OS сообщает "В приложении произошёл сбой".

Получается дело не в запуске сервиса, ведь запуск сервиса теперь в отдельной кнопке. Видимо что-то не так для этих версий андроида в манифесте...

Ссылка на комментарий

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить на вопрос...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу

×
×
  • Создать...