-
Постов
55 -
Зарегистрирован
-
Посещение
-
Победитель дней
2
Игорь Маринин стал победителем дня 12 июля 2020
Игорь Маринин имел наиболее популярный контент!
Посетители профиля
Блок последних пользователей отключён и не показывается другим пользователям.
Достижения Игорь Маринин
-
<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE"/> var PackageManager: JPackageManager; begin if (TJBuild_VERSION.JavaClass.SDK_INT >= 30) then begin PackageManager := TAndroidHelper.Context.getPackageManager(); optPermission := (PackageManager.checkPermission( StringToJString('android.permission.MANAGE_EXTERNAL_STORAGE'), TAndroidHelper.Context.getPackageName()) = TJPackageManager.JavaClass.PERMISSION_GRANTED) or (TJEnvironment.JavaClass.isExternalStorageManager); if not optPermission then begin var Intent: JIntent; Intent := TJIntent.JavaClass.init; Intent.setAction(StringToJString('android.settings.MANAGE_APP_ALL_FILES_ACCESS_PERMISSION')); Intent.setData(TJnet_Uri.JavaClass.fromParts(StringToJString('package'), TAndroidHelper.Context.getPackageName(), nil)); if intent.resolveActivity(TAndroidHelper.Context.getPackageManager) <> nil then TAndroidHelper.Activity.startActivity(Intent); end; end else PermissionsService.RequestPermissions( [ JStringToString(TJManifest_permission.JavaClass.READ_EXTERNAL_STORAGE), JStringToString(TJManifest_permission.JavaClass.WRITE_EXTERNAL_STORAGE) ], nil); end;
-
Приложения для ТВ, воспроизводящие аудио, могут продолжать делать это после того, как пользователь возвращается на главный экран или переключается на другое приложение. Для этого приложение должно предоставить карточку Now Playing на главном экране. https://developer.android.com/training/tv/playback/now-playing для теста набросал код, но ничего не происходит. при старте активирую медиасессию CreateMediaSession(optActive: boolean); при старте проигрывания UpdateMediaMetadata('name song', 'artist'); при остановке UpdateMediaMetadata('', ''); что не так? unit AndroidMedia; interface uses System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants, System.IOUtils, Androidapi.JNI.Media, Androidapi.JNI.App; procedure CreateMediaSession(optActive: boolean); procedure UpdatePlaybackState(State: Integer); procedure UpdateMediaMetadata(Title, Artist: string); var MediaSession: JMediaSession; implementation uses DateUtils, Androidapi.JNI.GraphicsContentViewText, Androidapi.Helpers; procedure CreateMediaSession(optActive: boolean); var PendingIntent: JPendingIntent; Intent: JIntent; begin if (not optActive) or (Assigned(MediaSession)) then begin if Assigned(MediaSession) then MediaSession.setActive(false); if (not optActive) then exit; end; Intent := TJIntent.JavaClass.init; Intent.setClassName(TAndroidHelper.Context.getPackageName, StringToJString('com.embarcadero.firemonkey.FMXNativeActivity')); PendingIntent := TJPendingIntent.JavaClass.getActivity(TAndroidHelper.Context, 99, Intent, TJPendingIntent.JavaClass.FLAG_UPDATE_CURRENT); MediaSession := TJMediaSession.JavaClass.init(TAndroidHelper.Context, StringToJString('myMediaSession')); MediaSession.setFlags(TJMediaSession.JavaClass.FLAG_HANDLES_MEDIA_BUTTONS or TJMediaSession.JavaClass.FLAG_HANDLES_TRANSPORT_CONTROLS); MediaSession.setSessionActivity(PendingIntent); MediaSession.setActive(True); end; procedure UpdatePlaybackState(State: Integer); var PlaybackState: JPlaybackState_Builder; myPlaybackState: JPlaybackState; begin if not Assigned(MediaSession) then exit; PlaybackState := TJPlaybackState_Builder.JavaClass.init; PlaybackState.setState(State, 0, 1.0, DateTimeToMilliseconds(now)); myPlaybackState:= PlaybackState.build; MediaSession.setPlaybackState(myPlaybackState); end; procedure UpdateMediaMetadata(Title, Artist: string); var MetadataBuilder: JMediaMetadata_Builder; Metadata: Jmedia_MediaMetadata; begin if not Assigned(MediaSession) then exit; if title = '' then begin MediaSession.setMetadata(nil); exit; end; UpdatePlaybackState(TJPlaybackState.JavaClass.STATE_PLAYING); MetadataBuilder := TJMediaMetadata_Builder.JavaClass.init; MetadataBuilder.putString(TJmedia_MediaMetadata.JavaClass.METADATA_KEY_TITLE, StringToJString(Title)); MetadataBuilder.putString(TJmedia_MediaMetadata.JavaClass.METADATA_KEY_ARTIST, StringToJString(Artist)); Metadata := MetadataBuilder.build; MediaSession.setMetadata(Metadata); end; initialization MediaSession := nil; end.
-
подскажите пожалуйста у кого есть опыт, как для андроид\гугл ТВ создать на главном экране канал приложения и добавлять\удалять на нем карточки? как те же кинотеатры, ютуб постят на своей ленте информационные новинки. https://developer.android.com/training/tv/discovery/recommendations-channel не знаю даже как подступиться...
-
подскажите, что за параметр RectF? например: myRectf:= RectF(100, 100, bmp.width - 100, bmp.height - 100); bmp.Canvas.FillText(myRectf, 'текст', false, 1, [], TTextAlign.Center, TTextAlign.Center); выводит всё правильно с учётом Rectf. тут же хочу сделать обводку текста: bmp.Canvas.TextToPath(path, myRectf, 'текст', false, TTextAlign.Center, TTextAlign.Center); bmp.Canvas.DrawPath(path, 1); и нифига, контур где-то в стороне, как буд-то не учитывает RectF, так как после: Path.Translate(100, 100); bmp.Canvas.DrawPath(path, AOpacity); рисует контур уже четко вокруг текста. я полагал, что должно выводить сразу по центру прямоугольника заданного в rectf а этот же код на андроиде вообще черти шо: что так где-то в стороне, что после translate то же в стороне.
-
Intent := TJIntent.JavaClass.init; Intent.setAction(StringToJString('android.settings.MANAGE_ALL_FILES_ACCESS_PERMISSION')); TAndroidHelper.Activity.startActivity(Intent); открывает форму установки прав, где есть и моё приложение. но если добавить: Intent.setData(TJnet_Uri.JavaClass.parse(StringToJString('package:').concat(TAndroidHelper.Context.getPackageName))); то intent.resolveActivity(TAndroidHelper.Context.getPackageManager) возвращает NIL. хотелось бы, что бы сразу для моего приложения был запрос прав. апи 30. андроид 13. в манифесте указано <uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" /> попробовал ещё PermissionsService.RequestPermissions(['MANAGE_ALL_FILES_ACCESS_PERMISSION'], ... вообще никакой реакции..
-
вообщем по умолчанию, доступ к памяти запрещен: TJEnvironment.JavaClass.isExternalStorageManager возвращает False Intent.setAction(StringToJString('android.settings.MANAGE_ALL_FILES_ACCESS_PERMISSION')); intent.resolveActivity(TAndroidHelper.Context.getPackageManager) возвращает NIL, (no activity found to handle Intent) если вызвать при этом Intent := TJIntent.JavaClass.init(TJSettings.JavaClass.ACTION_APPLICATION_DETAILS_SETTINGS); то общие настройки приложения открываются нормально. в настройках доступа к памяти есть три пункта. если выбрать просто "разрешить", то if Androidapi.JNI.Support.TJcontent_ContextCompat.JavaClass.checkSelfPermission(TAndroidHelper.Context, TJManifest_permission.JavaClass.READ_EXTERNAL_STORAGE) возвращает TJPackageManager.JavaClass.PERMISSION_GRANTED, но при этом приложение видит только стандартные расширения файлов. если выбрать в правах доступа к памяти пункт "разрешить в любом режиме", тогда уже приложению доступны все файлы. почему активити 'android.settings.MANAGE_ALL_FILES_ACCESS_PERMISSION' отсутствует пока не пойму. на устройстве андроид 11-й. и проверку наверное делать не на READ_EXTERNAL_STORAGE а на MANAGE_EXTERNAL_STORAGE, но в 11.3 его нет.
-
нашел такое, буду пробовать: Jcontent_ContextCompatClass = interface(JObjectClass) ['{DBBBF89C-A4F3-4A4C-A725-4B2FF89151B5}'] {class} function checkSelfPermission(context: JContext; string_: JString): Integer; cdecl; Jcontent_PermissionCheckerClass = interface(JObjectClass) ['{4627A63C-3386-4ABA-83DD-08BAA19760C2}'] {class} function checkPermission(context: JContext; string_: JString; i: Integer; i1: Integer; string_1: JString): Integer; cdecl; {class} function checkSelfPermission(context: JContext; string_: JString): Integer; cdecl; спасибо! удачи!!!
-
да вроде бы у меня последняя 11.3 версия дельфи. вообще буду разбираться, есть над чем подумать. спасибо!
-
спасибо! Androidapi.JNI.Support.Compat ну у меня в дельфи такого нет.. буду думать... насчет моего кода понял. разрешений точно нет, пока вручную не включишь. а вот эта проверка: if (TJEnvironment.JavaClass.isExternalStorageManager = false) разве не аналогична if TJContextCompat.JavaClass.checkSelfPermission(TAndroidHelper.Context, JStringToString(TJManifest_permission.JavaClass.READ_EXTERNAL_STORAGE)) <> TJPackageManager.JavaClass.PERMISSION_GRANTED буду искать ошибку. спасибо!
-
а такой код вообще не вызывает никакого диалога на 13 андроиде: if (TJBuild_VERSION.JavaClass.SDK_INT >= 30) then if (TJEnvironment.JavaClass.isExternalStorageManager = false) then begin Intent := TJIntent.Create; Intent.setAction(StringToJString('android.settings.MANAGE_ALL_FILES_ACCESS_PERMISSION')); intent.setData(TJnet_Uri.JavaClass.parse(StringToJString('package:').concat(TAndroidHelper.Context.getPackageName))); if (intent.resolveActivity(TAndroidHelper.Context.getPackageManager) <> nil) then TAndroidHelper.Context.startActivity(Intent); end;
-
я понял, спасибо! спрашивал потому, что у меня в Androidapi.JNI.Support нет TJContextCompat ну и ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION то же нет нигде. но эту строковую константу я то могу заменить как писал выше. у меня 11.3, странно..
-
спасибо! у вас 11.3 ? не могли бы уточнить, где описан TJContextCompat? а так же ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION ? Intent := TJIntent.JavaClass.init(TJSettings.JavaClass.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION); можно заменить на Intent.setAction(StringToJString('android.settings.MANAGE_ALL_FILES_ACCESS_PERMISSION')); ?