MaratBest Опубликовано 14 декабря, 2023 Поделиться Опубликовано 14 декабря, 2023 Доброго времени суток. Написано приложение Delphi 11 для Android. На данный момент появилась необходимость открывать файлы формата *.х10 как зарегистрировать на андроид при установке приложения, что с помощью него можно отрывать файлы *.х10 (аналог,например при открытии *.pdf давал на выбор acrobat, chrome и т.д) и второй вопрос ,как понять что приложению передан файл на открытие ? типа paramstr или как ? Цитата Ссылка на комментарий
0 OnePeople Опубликовано 14 декабря, 2023 Поделиться Опубликовано 14 декабря, 2023 var IMessageSubscriptionID: Integer; // в создании формы IMessageSubscriptionID := TMessageManager.DefaultManager.SubscribeToMessage( TMessageReceivedNotification, HandleIntentMessage); procedure TForm1.HandleIntentMessage(const Sender: TObject; const M: TMessage); begin try if M is TMessageReceivedNotification then begin OnNewIntent(TMessageReceivedNotification(M).Value); end; except Form1.LogAdd('HandleIntentMessage except'); end; end; function TForm1.OnNewIntent(Intent: JIntent): Boolean; var insPath: String; uri: Jnet_Uri; begin Result := False; try if Intent <> nil then begin uri := Intent.getData; if uri <> nil then begin insPath:= JStringToString( uri.getEncodedPath); if (ExtractFileExt(insPath)='.x10') then begin // работаете с файлом end; end; end; except LogAdd('OnNewIntent except'); end; end; Также в манифест добавить <intent-filter> <action android:name="android.intent.action.VIEW"/> <category android:name="android.intent.category.DEFAULT"/> <category android:name="android.intent.category.BROWSABLE"/> <data android:scheme="file" /> <data android:scheme="content" /> <data android:scheme="http" /> <data android:scheme="https" /> <data android:host="*" /> <data android:pathPattern=".*\\.x10" /> </intent-filter> <intent-filter> <action android:name="android.intent.action.VIEW"/> <action android:name="android.intent.action.EDIT"/> <category android:name="android.intent.category.DEFAULT"/> <category android:name="android.intent.category.BROWSABLE"/> <data android:scheme="file" /> <data android:scheme="content" /> <data android:scheme="http" /> <data android:scheme="https" /> <data android:host="*" /> <data android:mimeType="*/*" /> <data android:pathPattern=".*\\.x10" /> </intent-filter> Цитата Ссылка на комментарий
0 MaratBest Опубликовано 14 декабря, 2023 Автор Поделиться Опубликовано 14 декабря, 2023 Спаcибо за ответ. поменял манифест, приложение попадает выбор открыть с помощью в андроид ! а вот в приложениее не перехватывает сообщение подставил в свой код procedure TMainForm.FormCreate(Sender: TObject); var ... begin IMessageSubscriptionID := TMessageManager.DefaultManager.SubscribeToMessage(TMessageReceivedNotification, HandleIntentMessage); logSave('IMessageSubscriptionID :='+inttostr(IMessageSubscriptionID)); тут выходит значение IMessageSubscriptionID =327 procedure TMainForm.HandleIntentMessage(const Sender: TObject; const M: TMessage); begin try logSave('HandleIntentMessage'); if M is TMessageReceivedNotification then begin logSave('HandleIntentMessage'); OnNewIntent(TMessageReceivedNotification(M).Value); end; except logSave('HandleIntentMessage except'); end; end; function TMainForm.OnNewIntent(Intent: JIntent): Boolean; var insPath: String; uri: Jnet_Uri; begin Result := False; try if Intent <> nil then begin uri := Intent.getData; if uri <> nil then begin insPath:= JStringToString( uri.getEncodedPath); logSave('Работаем с файлом:'+insPath); if (ExtractFileExt(insPath)='.x10') then begin logSave('Работаем с файлом:'+insPath); // работаете с файлом end; end; end; except logSave('OnNewIntent except'); end; end; в логе нет ни единого сообщения Цитата Ссылка на комментарий
0 OnePeople Опубликовано 14 декабря, 2023 Поделиться Опубликовано 14 декабря, 2023 Добавьте это MainActivity.registerIntentAction(TJIntent.JavaClass.ACTION_VIEW); перед этим IMessageSubscriptionID := TMessageManager.DefaultManager.SubscribeToMessage( TMessageReceivedNotification, HandleIntentMessage); Цитата Ссылка на комментарий
1 OnePeople Опубликовано 14 декабря, 2023 Поделиться Опубликовано 14 декабря, 2023 И FormActivate добавьте myIntent := TAndroidHelper.Activity.getIntent; if myIntent <> nil then Form1.OnNewIntent(myIntent); Цитата Ссылка на комментарий
0 MaratBest Опубликовано 15 декабря, 2023 Автор Поделиться Опубликовано 15 декабря, 2023 Спасибо больше . Все заработало. Цитата Ссылка на комментарий
0 MaratBest Опубликовано 19 декабря, 2023 Автор Поделиться Опубликовано 19 декабря, 2023 Добрый день. чуть-чуть поторопился... Вначале промучился с ошибкой I/O Error 13 при попытке чтения файла оказалось insPath содержит полный путь "root/storage/emulated/0/файл" системе в итоге зашло без рут "/storage/emulated/0/файл" это все зработало на планшете , где андроид 8.0 на телефоне где android 13 , procedure TMainForm.FormCreate(Sender: TObject); var ... begin IMessageSubscriptionID := TMessageManager.DefaultManager.SubscribeToMessage(TMessageReceivedNotification, HandleIntentMessage); logSave('IMessageSubscriptionID :='+inttostr(IMessageSubscriptionID)); тут выходит значение IMessageSubscriptionID =327 и тишина, в логе нет ни единого сообщения , в какую сторону копать ? Цитата Ссылка на комментарий
0 OnePeople Опубликовано 19 декабря, 2023 Поделиться Опубликовано 19 декабря, 2023 Для начала доступ к памяти проверьте if TJBuild_VERSION.JavaClass.SDK_INT >= 30 then begin if TJEnvironment.JavaClass.isExternalStorageManager = false then begin Intent := TJIntent.Create; Intent:= TJIntent.JavaClass.init(TJSettings.JavaClass.ACTION_MANAGE_APP_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; end; В <application android:persistent="%persistent%" android:restoreAnyVersion="%restoreAnyVersion%" android:label="%label%" android:debuggable="%debuggable%" android:largeHeap="%largeHeap%" Должна быть строка android:requestLegacyExternalStorage="true" Цитата Ссылка на комментарий
0 OnePeople Опубликовано 19 декабря, 2023 Поделиться Опубликовано 19 декабря, 2023 Ну и android 13 поддерживает только Rad studio 11.3 Цитата Ссылка на комментарий
0 MaratBest Опубликовано 20 декабря, 2023 Автор Поделиться Опубликовано 20 декабря, 2023 23 часа назад, OnePeople сказал: Цитата Для начала доступ к памяти проверьте доступ вроде есть, у меня там встроенный opendialog есть, он работает Ну и android 13 поддерживает только Rad studio 11.3 у меня , просто delphi 11.3 а не Rad Studio -( где можно раздобыть TJEnvironment и TJSettings из Rad Studio? Цитата Ссылка на комментарий
0 GASCHE Опубликовано 20 декабря, 2023 Поделиться Опубликовано 20 декабря, 2023 1 час назад, MaratBest сказал: где можно раздобыть TJEnvironment и TJSettings из Rad Studio? unit Androidapi.JNI.Os; TJEnvironment; unit Androidapi.JNI.Provider; TJSettings; Цитата Ссылка на комментарий
0 MaratBest Опубликовано 20 декабря, 2023 Автор Поделиться Опубликовано 20 декабря, 2023 7 часов назад, GASCHE сказал: unit Androidapi.JNI.Os; TJEnvironment; unit Androidapi.JNI.Provider; TJSettings; в Delphi нет функцииTJEnvironment.JavaClass.isExternalStorageManager Цитата Ссылка на комментарий
0 GASCHE Опубликовано 21 декабря, 2023 Поделиться Опубликовано 21 декабря, 2023 12 часов назад, MaratBest сказал: в Delphi нет функцииTJEnvironment.JavaClass.isExternalStorageManager JEnvironmentClass = interface(JObjectClass) ... {class} function isExternalStorageManager: Boolean; cdecl; overload; end; А эта не подходит? Цитата Ссылка на комментарий
Вопрос
MaratBest
Доброго времени суток.
Написано приложение Delphi 11 для Android. На данный момент появилась необходимость открывать файлы формата *.х10
как зарегистрировать на андроид при установке приложения, что с помощью него можно отрывать файлы *.х10
(аналог,например при открытии *.pdf давал на выбор acrobat, chrome и т.д)
и второй вопрос ,как понять что приложению передан файл на открытие ? типа paramstr или как ?
Ссылка на комментарий
12 ответов на этот вопрос
Рекомендуемые сообщения
Присоединяйтесь к обсуждению
Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.