Я работаю над 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 Я обновил свой вопрос, я не могу понять проблему
@Jason В этом упражнении я только добавлял URI в список. Я использовал только намерение для добавления файлов. После загрузки всех файлов следующим шагом будет обработка с использованием фонового потока. Однако, когда я добавляю весь список как 1200+ следующих 1200, он загружается отлично, но не может обрабатывать 1475 файлов одновременно.
намерение не имеет большой емкости. Для этого вы можете использовать глобальные переменные, общие настройки или временные файлы.
Максимальная длина метода Intent putExtra? (Принудительное закрытие)
https://www.neotechsoftware.com/blog/android-intent-size-limit
Временные файлы: Создание временных файлов в Android
Общие настройки: https://www.tutorialspoint.com/android/android_shared_preferences.htm
глобальная переменная: Глобальная переменная Android
Я запускаю Intent, чтобы пользователь мог выбирать файлы по избранному пути. Есть ли у них какие-либо флаги или категории, которые я должен передать с намерением обрабатывать файлы без зависаний или ограничений.
Моя проблема решена, это может быть ошибка в версии сообщества Visual Studio 2017 или в какой-то эталонной dll, которую я использовал в проекте.
Я понижаю версию с:
Xamarin.Android.Support.Compat 26.1.0.1
к
Xamarin.Android.Support.Compat.25.4.0.2
со всеми зависимостями и снова обновите его и снова перестройте проект, и теперь у меня нет проблем с добавлением неограниченного количества файлов.
После понижения версии я могу выбрать до 1802 файлов с помощью Intent. Я не могу понять, в чем проблема. Кто-нибудь сталкивался с этой проблемой или есть идеи, чтобы решить эту проблему.
В ОС Android могут быть некоторые ограничения из-за того, что не поддерживается большое количество URI. Что ж, я нашел альтернативное решение, вот шаг, если кому-то понадобится:
DocumentTree через Intent.OnActivityResult мы получили в нем URI (TreeUri).Перебирая файлы из указанного выше 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 файлов, которые работают без сбоев.
Ограничений нет, но вы не можете удерживать основной поток в течение длительного времени, поэтому ваше приложение приближается, в такой ситуации мы должны использовать другой поток или нам нужно выполнить некоторую фоновую задачу.