Получить путь от IntentFilter на устройстве Android - PullRequest
0 голосов
/ 05 марта 2020

В настоящее время я пытаюсь добавить IntentFilter в свое приложение Xamarin. Я хочу, чтобы пользователь мог открыть приложение, щелкнув файл базы данных database.db. Затем я хочу, чтобы приложение скопировало файл базы данных в указанное c местоположение. Открытие приложения через файл .db работает нормально, я получаю Intent с правильной информацией (см. Ниже). Однако копирование файла в желаемое местоположение не работает на некоторых устройствах , так как файл, по-видимому, не существует. Сбой на HUAWEI AGS2-L09 Android 8.0, преуспел на Samsung SM-T805 Android 6.0.

Вот мой IntentFilter, используемый в MainActivity.cs:

[IntentFilter(new[] { Intent.ActionView, Intent.ActionEdit },
        Categories = new[] { Intent.CategoryDefault },
        DataMimeType = "application/*",
        DataHost = "*",
        DataPathPattern = ".*\\\\.db")]

Вот как Я работал с Intent в MainActivity.cs:

 protected override async void OnCreate(Bundle bundle)
        {
            // Check if app opened via file
            await InitIntentFile(Intent);
        }

        private static async Task<bool> InitIntentFile(Intent intent)
        {
            if (intent?.Data == null) return true;
            if (intent.Action != Intent.ActionView) return true;

            var filePath = intent.Data.Path;
            return await App.ImportTemplateFile(filePath);
        }

Вот что я делаю в классе App.xaml.cs:

    public static async Task<bool> ImportTemplateFile(string path)
        {
            string srcPath = path;
            FileInfo fi = new FileInfo(srcPath);

            string justFileName = fi.Name;
            await UserDialogs.Instance.AlertAsync($"File Name: {justFileName}");

            // Get file name with full path   
            string fullFileName = fi.FullName;
            await UserDialogs.Instance.AlertAsync($"File Name: {fullFileName}");

            // Get file extension   
            string extn = fi.Extension;
            await UserDialogs.Instance.AlertAsync($"File Extension: {extn}");

            // Get directory name   
            string directoryName = fi.DirectoryName;
            await UserDialogs.Instance.AlertAsync($"Directory Name: {directoryName}");

            // File Exists ?  
            bool exists = fi.Exists;
            await UserDialogs.Instance.AlertAsync($"File Exists: {exists}");

            string dstPath = ApplicationContext.Instance.FileSystem.DbPath;
            if (File.Exists(srcPath))
            {
                if (File.Exists(dstPath))
                    File.Delete(dstPath);
                File.Copy(srcPath, dstPath);
                return true;
            }
            else
            {
                await UserDialogs.Instance.AlertAsync("Database successfully imported", "Success");
                return false;
            }
        }

Все значения fi как Правильно указаны имя, полное имя, расширение, имя каталога . Однако на вышеупомянутом устройстве HUAWEI я получаю false для fi.Exists , поэтому я не могу скопировать файл.

Кто-нибудь знает, кто я делать неправильно? Чистая удача, что он работает на упомянутом устройстве Samsung?

Спасибо за помощь!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...