Доступ к пути «/storage/emulated/0/log.txt» отказано только в первый раз, когда загружается мое приложение

#android #xamarin #xamarin.forms

Вопрос:

Я создаю txt файл в Xamarin.forms . Первый раз, когда приложение одновременно выполняет запрос разрешения и создание исключения в Visual Studio.

 System.UnauthorizedAccessException
  Message=Access to the path "/storage/emulated/0/log.txt" is denied.
 

Со второго раза, когда я открываю приложение на мобильном устройстве, оно не будет запрашивать разрешение(как я предоставил непосредственно перед сбоем) и генерировать файл txt. Так что все работает нормально.

Почему он выдает ошибку при первом выполнении?

Это мой код

 protected override void OnStart()
{
    base.OnStart();
    if ((int)Build.VERSION.SdkInt >= 23)
    {
        if (CheckSelfPermission(Manifest.Permission.AccessFineLocation) != Permission.Granted)
            RequestPermissions(LocationPermissions, RequestId);
    }
}

public override void OnRequestPermissionsResult(int requestCode, string[] permissions, [GeneratedEnum] Permission[] grantResults)
{
    if (requestCode == RequestId)
    {
        if ((grantResults.Length == 1) amp;amp; (grantResults[0] == (int)Permission.Granted))
        {
            ///Premission granted by user
            string filePath = string.Empty;
            filePath = Android.OS.Environment.ExternalStorageDirectory.ToString();
            var filename = System.IO.Path.Combine(filePath, "log"   ".txt");                  
        }
        else
        {
            ///Permission denied by user
        }
    }
    else
    {
        base.OnRequestPermissionsResult(requestCode, permissions, grantResults);
    }
}
 

Комментарии:

1. Имя файла в вашем коде, ProductStatusLog , не совпадает с ошибкой msg: log.txt

2. @SushiHangover — В моем коде только обновленное имя. Все та же проблема. Спасибо.

Ответ №1:

Путь, который вы использовали, — это внешнее хранилище. Если вы хотите использовать этот путь в Xamarin.forms, вы можете использовать службу зависимостей.

Создайте интерфейс IExternalStorage:

 public interface IExternalStorage
{
    string GetPath();
}
 

Реализация на Android: Пожалуйста, обратите Android.OS.Environment.ExternalStorageDirectory внимание, что она устарела.

 [assembly:Dependency(typeof(AndroidImplementation))]
namespace App.Droid
{
    public class AndroidImplementation: IExternalStorage
    {
        public string GetPath()
        {
           Context context = Android.App.Application.Context;
           var filePath = context.GetExternalFilesDir("");
           return filePath.Path;
        }
    }
}
 

Тогда вы могли бы использовать его в Xamarin.Формы:

 var folderPath = DependencyService.Get<IExternalStorage>(). GetPath();
 

После получения пути вы можете использовать приведенный ниже код для создания файла и ввода некоторых строк.

   var filePath = DependencyService.Get<IExternalStorage>().GetPath();
        var path = System.IO.Path.Combine(filePath, "log"   ".txt");
        using (var writer = File.CreateText(path))
        {
            await writer.WriteLineAsync("hello");
        }
   //path:  /storage/emulated/0/Android/data/com.companyname.app5/files/log.txt
 

введите описание изображения здесь