Открывать большое количество файлов через намерение

Я работаю над xamarin.android и использую устройство Marshmallow. Я использую Intent для открытия файлов, и выбор до 1200 файлов работает нормально, но когда я выбираю 1475 файлов, он зависает, и когда я его отлаживаю, он также закрывается.

Вот намерение, которое я использовал

var Intent = new Intent();
Intent.SetType("image/*");
Intent.PutExtra(Intent.ExtraAllowMultiple, true);
Intent.SetAction(Intent.ActionGetContent);
StartActivityForResult(Intent, 2);

В моем приложении не должно быть ограничений на добавление файлов. Есть ли ограничения в устройстве Android?

Поправь меня, где я делаю не так

Редактировать:

protected override void OnActivityResult(int requestCode, Result resultCode, Intent data)
{
           if ((requestCode == 2) && (resultCode == Result.Ok) && (data != null))
            {
                //------------- taking permission for the opened uri
                var takeFlags = ActivityFlags.GrantReadUriPermission | ActivityFlags.GrantWriteUriPermission;
                // Check for the freshest data.
                try
                {
                    if (data.Data != null)
                    {
                        GrantUriPermission(PackageName, data.Data, ActivityFlags.GrantReadUriPermission | ActivityFlags.GrantWriteUriPermission);
                        ContentResolver.TakePersistableUriPermission(data.Data, takeFlags);
                    }
                }
                catch { }

                var ar = data.ClipData;
                if (ar != null)
                {
                    clipDataImages = ar;
                    // in the below activity, I had used separate thread for loading to Recycler view, but it did not start the LoadImageActivity
                    StartActivity(typeof(LoadImageActivity));
                }
    }
}

Ограничений нет, но вы не можете удерживать основной поток в течение длительного времени, поэтому ваше приложение приближается, в такой ситуации мы должны использовать другой поток или нам нужно выполнить некоторую фоновую задачу.

Lovekush Vishwakarma 27.03.2018 15:49

Я бы действительно переосмыслил любой дизайн, который требует, чтобы вы открывали столько файлов одновременно, особенно на мобильном устройстве.

Jason 27.03.2018 16:04

@Lovekush Vishwakarma Я обновил свой вопрос, я не могу понять проблему

Amit 27.03.2018 16:15

@Jason В этом упражнении я только добавлял URI в список. Я использовал только намерение для добавления файлов. После загрузки всех файлов следующим шагом будет обработка с использованием фонового потока. Однако, когда я добавляю весь список как 1200+ следующих 1200, он загружается отлично, но не может обрабатывать 1475 файлов одновременно.

Amit 27.03.2018 16:25
2
4
118
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

намерение не имеет большой емкости. Для этого вы можете использовать глобальные переменные, общие настройки или временные файлы.

Максимальная длина метода Intent putExtra? (Принудительное закрытие)

https://www.neotechsoftware.com/blog/android-intent-size-limit

Временные файлы: Создание временных файлов в Android

Общие настройки: https://www.tutorialspoint.com/android/android_shared_preferences.htm

глобальная переменная: Глобальная переменная Android

Я запускаю Intent, чтобы пользователь мог выбирать файлы по избранному пути. Есть ли у них какие-либо флаги или категории, которые я должен передать с намерением обрабатывать файлы без зависаний или ограничений.

Amit 27.03.2018 16:29

Моя проблема решена, это может быть ошибка в версии сообщества Visual Studio 2017 или в какой-то эталонной dll, которую я использовал в проекте.

Я понижаю версию с:

Xamarin.Android.Support.Compat 26.1.0.1

к

Xamarin.Android.Support.Compat.25.4.0.2

со всеми зависимостями и снова обновите его и снова перестройте проект, и теперь у меня нет проблем с добавлением неограниченного количества файлов.

После понижения версии я могу выбрать до 1802 файлов с помощью Intent. Я не могу понять, в чем проблема. Кто-нибудь сталкивался с этой проблемой или есть идеи, чтобы решить эту проблему.

Amit 31.03.2018 11:27
Ответ принят как подходящий

В ОС Android могут быть некоторые ограничения из-за того, что не поддерживается большое количество URI. Что ж, я нашел альтернативное решение, вот шаг, если кому-то понадобится:

  1. Откройте DocumentTree через Intent.
  2. OnActivityResult мы получили в нем URI (TreeUri).
  3. Перебирая файлы из указанного выше URI, мы можем получить все соответствующие файлы.

    var dirTree = DocumentFile.FromTreeUri(this, TreeUri); var files = dirTree.ListFiles(); for (int x = 0; x < files.Length; x++) { var SingleFileURI = files[x].Uri; // doing stuff with SingleFileURI }

Вышеупомянутые шаги просят пользователя выбрать папку с помощью DocumentTree, и теперь я могу получить столько файлов, сколько захотим. У меня было протестировано около 7000 файлов, которые работают без сбоев.

Другие вопросы по теме