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

Не корректно работает поиск файлов


S0lexV

Вопрос

Доброго времени!
Использую следующий код для поиска файлов с расширением ".car" на устройстве:

DownloadPath  = System::Ioutils::TPath::GetSharedDownloadsPath();
TSearchRec sr;
FindFirst( DownloadPath + "/*.car", faAnyFile, sr);
        {
            do
                {
                    if ( sr.Name=="." || sr.Name==".." ) {}
                    else if ( (sr.Attr & faDirectory) == faDirectory ) {}
                    else {
                     FindBox1->RowCount ++;
                     FindBox1->Cells[0][i] = sr.Name;
                     i++;
                    }
                }
            while ( !FindNext(sr) );
            FindClose(sr);
        }

Принцип работы таков, что из приложения сохраняется файл в данную директорию, а затем его нужно подгрузить. На старом Андроиде 7 все работает как надо, в StringGrid падают названия файлов с нужным расширением, но на версии 13 проблема заключается в следующем: если создать файл из этой копии приложения, а затем попытаться его найти то он видится и без проблем загружается его содержимое, но если переустановить приложение (тупо снести и заново поставить), в этом случае приложение просто перестает видит какие либо файлы. Пусто. И опять если создать новый файл, то приложение видит только свежий файл(ранее созданные не отображает, хотя в проводнике я их вижу). В User permission есть права на Read / Write external storage, правда в телефоне они видятся как "Доступ к видео и фото" и Доступ к музыке и аудио". Что может быть ? заморочка последних версий Андроида ?

Также был переустановлен Билдер последней версии, установлены последние SDK/NDK. Пересобрал новый проект и проблема все равно осталась...

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

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

  • 0

Такой вариант пробовал тоже:

TStringDynArray A = TDirectory::GetFiles(TPath::GetSharedDownloadsPath(), "*.car", TSearchOption::soTopDirectoryOnly);
FindBox1->RowCount = A.Length;
for(int i = 0; i < A.Length; i++)
  FindBox1->Cells[0][i] = A[i];

 

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

Судя по всему проблема действительно в этом, в AndroidManifest прописано следующее:

    <uses-permission android:name="android.permission.MANAGE_DOCUMENTS" />
    <uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.MANAGE_MEDIA" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

    <application
        android:requestLegacyExternalStorage="true">

Но файлы по прежнему не видятся. Видимо нужно в RunTime делать запрос на получение права?

Можете подсказать пример как это реализовать на C++ ?

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

В принципе направление куда двигаться я понял, спасибо за подсказку!

     try
     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;
     except
     end;

     if TJBuild_VERSION.JavaClass.SDK_INT <= 29  then
        begin
            FPermissionReadExternalStorage := JStringToString(TJManifest_permission.JavaClass.READ_EXTERNAL_STORAGE);
            FPermissionWriteExternalStorage := JStringToString(TJManifest_permission.JavaClass.WRITE_EXTERNAL_STORAGE);

            PermissionsService.RequestPermissions([FPermissionReadExternalStorage] + [FPermissionWriteExternalStorage], nil);
        end;

Типо того

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

Пытаюсь адаптировать под ++, на шаге

if TJEnvironment.JavaClass.isExternalStorageManager = false then

Нет метода isExternalStorageManager. А у

Intent:=  TJIntent.JavaClass.init(TJSettings.JavaClass.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION);

Нет метода

ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION

Мой код примерно такой:

   if(TJBuild_VERSION ::JavaClass->SDK_INT>=30)
	{
	 if(TJEnvironment::JavaClass-> //нет
	  {
	  _di_JIntent intent;
	   intent = TJIntent::JavaClass->init(TJIntent::JavaClass-> // нет);
	  }
	}
Изменено пользователем S0lexV
Ссылка на комментарий
  • 0

Исходники не полные у rad studio вручную добавьте методы, путем перемещения соответствующих файлов (т.е. загаловочные файлы с описанием TJEnvironment и TJSettings) в папку проекта и добавлением в них отсутствующих функций и переменных.

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

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

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

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

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

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

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

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

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

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

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