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

Регистрация в системе и открытие своего произвольного файла. FMX Android


MaratBest

Вопрос

Доброго времени суток.

Написано приложение Delphi 11 для Android. На данный момент появилась необходимость открывать файлы формата *.х10

как зарегистрировать на андроид при установке приложения, что с помощью него можно отрывать файлы *.х10

(аналог,например при открытии *.pdf давал на выбор acrobat, chrome и т.д)

и второй вопрос ,как понять что приложению передан файл на открытие ? типа paramstr или как ?

 

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

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

  • 0
 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

Спа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

Добрый день.

чуть-чуть поторопился...

Вначале промучился с ошибкой  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

Для начала доступ к памяти проверьте

     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
23 часа назад, OnePeople сказал:
Цитата

Для начала доступ к памяти проверьте

 доступ вроде есть, у меня там встроенный opendialog есть, он работает

Ну и android 13 поддерживает только Rad studio 11.3

у меня , просто delphi 11.3 а не Rad Studio -(

где можно раздобыть TJEnvironment и TJSettings из Rad Studio?

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

 

12 часов назад, MaratBest сказал:

в Delphi нет функцииTJEnvironment.JavaClass.isExternalStorageManager

JEnvironmentClass = interface(JObjectClass)

...    

    {class} function isExternalStorageManager: Boolean; cdecl; overload;
  end;
А эта не подходит?

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

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

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

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

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

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

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

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

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

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

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