-
Постов
55 -
Зарегистрирован
-
Посещение
-
Победитель дней
2
Весь контент Игорь Маринин
-
<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')); ?
-
вообщем установка targetSdkVersion в 29 возвращает доступ ко всем файлам. гугл здесь пишет, что достаточно MANAGE_EXTERNAL_STORAGE объявить, но нифига с targetSdk выше 29 не работает. а насчет опции "разрешить чтение памяти в любом режиме" в разрешениях доступа к файлам так и не понял. в некоторых прогах, типа x-plorer, заходишь в права и там три варианта выбора включая этот. как оно у меня раньше было ума не приложу. но при выборе искало все файлы при sdk 32. ну пока придется 29 апи писать. на гитхабе ещё какой то код нашел, но вываливается с ошибкой заколебали вообщем, постоянно что то придумывают с этой безопасностью. костыли какие то приходится придумывать..
-
что-то в конец запутался. в настройках проэкта в правах включено read external storage. в манифест ещё добавил: android:requestLegacyExternalStorage="true" в проге запрашиваю права: PermissionsService.RequestPermissions( [ JStringToString(TJManifest_permission.JavaClass.READ_EXTERNAL_STORAGE), JStringToString(TJManifest_permission.JavaClass.WRITE_EXTERNAL_STORAGE), ], даю разрешение в системе на доступ. далее в проге, через : TAndroidHelper.Activity.getSystemService(TJContext.JavaClass.STORAGE_SERVICE); LVolumes := LStorageManager.getStorageVolumes; получаю UUID флешки нормально. сканирую папки на наличие определенных файлов. и вот тут самое интересное, что система при поиске возвращает файлы только стандартных расширений, типа *.txt. *.mp3 а других файлов как буд-то нет. уже и по старинке через findFirst искал - то же самое. был заметил, что в системе в разрешениях доступа файлов у меня было три пункта и если выбрать "разрешить чтение памяти в любом режиме" то о чудо все файлы при поиске находились. если просто "разрешить во время выполнения" то фиг, только стандартные расширения. как-то обходился этим, но сейчас не пойму: где что менял при сборке, или система обновилась, но теперь этого пункта в системе нет. только два пункта. может есть у кого какие мысли, как всё же добиться что бы при поиске прога получала все имеющиеся файлы ? или если это где-то в сборке влияет на наличие пункта ""разрешить чтение памяти в любом режиме"" уже и на старом api собирал и в деплой и стор конфигурации: нет этого пункта в разрешениях и всё.. помогите плиз, а то уже голова кипит..
-
в базе плеера собрано более 120 000 караоке песен!- миди караоке,- караоке с бэк вокалом с дисков: LG, Samsung, BBK- зарубежное CDG караоке- азиатское караоке (Узбекистан, Таджикистан, Кыргызстан, ..)- профессиональное минусовое MP3 (EMP) караокебаза постоянно пополняется, имеются все российские музыкальные новинки в профессиональном EMP формате. https://play.google.com/store/apps/details?id=com.encore.EnCore
-
TMediaPlayer & TMediaPlayerControl - отрисовка на кадре
Игорь Маринин опубликовал вопрос в TMediaPlayer
Имеется ли возможность рисовать поверх кадра? или, например, на видео фоне расположить элементы интерфейса? -
установил первую попавшуюся ось, в папке bin нет ниодной утилиты (LSCPU, LSHW, LSPCI, LSSCSI, DMIDECODE)
-
привет! как можно программно узнать данные железа ?
-
опять поломали кнопки пульта в 10.4
- 11 ответов